diff --git a/.gitbook/assets/3.0.png b/.gitbook/assets/3.0.png
deleted file mode 100644
index 3b5868101..000000000
Binary files a/.gitbook/assets/3.0.png and /dev/null differ
diff --git a/.gitbook/assets/FluentBitDocumentation-01-01.png b/.gitbook/assets/FluentBitDocumentation-01-01.png
deleted file mode 100644
index c440b9f1b..000000000
Binary files a/.gitbook/assets/FluentBitDocumentation-01-01.png and /dev/null differ
diff --git a/.gitbook/assets/FluentBitV3-02.png b/.gitbook/assets/FluentBitV3-02.png
deleted file mode 100644
index a8c380b00..000000000
Binary files a/.gitbook/assets/FluentBitV3-02.png and /dev/null differ
diff --git a/.gitbook/assets/agent.png b/.gitbook/assets/agent.png
deleted file mode 100644
index 19eceaa08..000000000
Binary files a/.gitbook/assets/agent.png and /dev/null differ
diff --git a/.gitbook/assets/azureloganalytics_small.png b/.gitbook/assets/azureloganalytics_small.png
deleted file mode 100644
index 576b50474..000000000
Binary files a/.gitbook/assets/azureloganalytics_small.png and /dev/null differ
diff --git a/.gitbook/assets/flb_kubernetes.png b/.gitbook/assets/flb_kubernetes.png
deleted file mode 100644
index 368a5a9fb..000000000
Binary files a/.gitbook/assets/flb_kubernetes.png and /dev/null differ
diff --git a/.gitbook/assets/flb_pipeline_simplified.png b/.gitbook/assets/flb_pipeline_simplified.png
deleted file mode 100644
index f5794cee2..000000000
Binary files a/.gitbook/assets/flb_pipeline_simplified.png and /dev/null differ
diff --git a/.gitbook/assets/flb_pipeline_simplified_example_01.png b/.gitbook/assets/flb_pipeline_simplified_example_01.png
deleted file mode 100644
index 76b55e254..000000000
Binary files a/.gitbook/assets/flb_pipeline_simplified_example_01.png and /dev/null differ
diff --git a/.gitbook/assets/flb_pipeline_simplified_expect.png b/.gitbook/assets/flb_pipeline_simplified_expect.png
deleted file mode 100644
index 4cddcd6ad..000000000
Binary files a/.gitbook/assets/flb_pipeline_simplified_expect.png and /dev/null differ
diff --git a/.gitbook/assets/flb_workflow.jpg b/.gitbook/assets/flb_workflow.jpg
deleted file mode 100644
index 10104de4e..000000000
Binary files a/.gitbook/assets/flb_workflow.jpg and /dev/null differ
diff --git a/.gitbook/assets/flb_workflow_buffer.jpg b/.gitbook/assets/flb_workflow_buffer.jpg
deleted file mode 100644
index cf9e535da..000000000
Binary files a/.gitbook/assets/flb_workflow_buffer.jpg and /dev/null differ
diff --git a/.gitbook/assets/flb_workflow_filter.jpg b/.gitbook/assets/flb_workflow_filter.jpg
deleted file mode 100644
index 61eeb1c31..000000000
Binary files a/.gitbook/assets/flb_workflow_filter.jpg and /dev/null differ
diff --git a/.gitbook/assets/flb_workflow_input.jpg b/.gitbook/assets/flb_workflow_input.jpg
deleted file mode 100644
index cefe11fc3..000000000
Binary files a/.gitbook/assets/flb_workflow_input.jpg and /dev/null differ
diff --git a/.gitbook/assets/flb_workflow_output.jpg b/.gitbook/assets/flb_workflow_output.jpg
deleted file mode 100644
index 24bac6f9f..000000000
Binary files a/.gitbook/assets/flb_workflow_output.jpg and /dev/null differ
diff --git a/.gitbook/assets/flb_workflow_parser.jpg b/.gitbook/assets/flb_workflow_parser.jpg
deleted file mode 100644
index 1306e4f80..000000000
Binary files a/.gitbook/assets/flb_workflow_parser.jpg and /dev/null differ
diff --git a/.gitbook/assets/flb_workflow_routing.jpg b/.gitbook/assets/flb_workflow_routing.jpg
deleted file mode 100644
index ac5809d44..000000000
Binary files a/.gitbook/assets/flb_workflow_routing.jpg and /dev/null differ
diff --git a/.gitbook/assets/fluent_bit_logo.png b/.gitbook/assets/fluent_bit_logo.png
new file mode 100644
index 000000000..5223c066f
Binary files /dev/null and b/.gitbook/assets/fluent_bit_logo.png differ
diff --git a/.gitbook/assets/fluentbit_kube_logging (1) (1).png b/.gitbook/assets/fluentbit_kube_logging (1) (1).png
deleted file mode 100644
index 978d572ab..000000000
Binary files a/.gitbook/assets/fluentbit_kube_logging (1) (1).png and /dev/null differ
diff --git a/.gitbook/assets/fluentbit_kube_logging (1).png b/.gitbook/assets/fluentbit_kube_logging (1).png
deleted file mode 100644
index 978d572ab..000000000
Binary files a/.gitbook/assets/fluentbit_kube_logging (1).png and /dev/null differ
diff --git a/.gitbook/assets/fluentbit_kube_logging (2) (1).png b/.gitbook/assets/fluentbit_kube_logging (2) (1).png
deleted file mode 100644
index 978d572ab..000000000
Binary files a/.gitbook/assets/fluentbit_kube_logging (2) (1).png and /dev/null differ
diff --git a/.gitbook/assets/fluentbit_kube_logging (2).png b/.gitbook/assets/fluentbit_kube_logging (2).png
deleted file mode 100644
index 978d572ab..000000000
Binary files a/.gitbook/assets/fluentbit_kube_logging (2).png and /dev/null differ
diff --git a/.gitbook/assets/fluentbit_kube_logging (3).png b/.gitbook/assets/fluentbit_kube_logging (3).png
deleted file mode 100644
index 978d572ab..000000000
Binary files a/.gitbook/assets/fluentbit_kube_logging (3).png and /dev/null differ
diff --git a/.gitbook/assets/fluentbit_kube_logging (4).png b/.gitbook/assets/fluentbit_kube_logging (4).png
deleted file mode 100644
index 978d572ab..000000000
Binary files a/.gitbook/assets/fluentbit_kube_logging (4).png and /dev/null differ
diff --git a/.gitbook/assets/fluentbit_kube_logging (5).png b/.gitbook/assets/fluentbit_kube_logging (5).png
deleted file mode 100644
index 978d572ab..000000000
Binary files a/.gitbook/assets/fluentbit_kube_logging (5).png and /dev/null differ
diff --git a/.gitbook/assets/fluentbit_kube_logging (6).png b/.gitbook/assets/fluentbit_kube_logging (6).png
deleted file mode 100644
index 978d572ab..000000000
Binary files a/.gitbook/assets/fluentbit_kube_logging (6).png and /dev/null differ
diff --git a/.gitbook/assets/fluentbit_kube_logging (7).png b/.gitbook/assets/fluentbit_kube_logging (7).png
deleted file mode 100644
index 978d572ab..000000000
Binary files a/.gitbook/assets/fluentbit_kube_logging (7).png and /dev/null differ
diff --git a/.gitbook/assets/fluentbit_kube_logging.png b/.gitbook/assets/fluentbit_kube_logging.png
deleted file mode 100644
index 978d572ab..000000000
Binary files a/.gitbook/assets/fluentbit_kube_logging.png and /dev/null differ
diff --git a/.gitbook/assets/fluentbit_logo.png b/.gitbook/assets/fluentbit_logo.png
deleted file mode 100644
index f621c48bd..000000000
Binary files a/.gitbook/assets/fluentbit_logo.png and /dev/null differ
diff --git a/.gitbook/assets/image (1).png b/.gitbook/assets/image (1).png
index 2a6609e1c..50446b701 100644
Binary files a/.gitbook/assets/image (1).png and b/.gitbook/assets/image (1).png differ
diff --git a/.gitbook/assets/image (2).png b/.gitbook/assets/image (2).png
deleted file mode 100644
index 4738070fb..000000000
Binary files a/.gitbook/assets/image (2).png and /dev/null differ
diff --git a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (2) (1).png b/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (2) (1).png
deleted file mode 100644
index 4653f1643..000000000
Binary files a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (2) (1).png and /dev/null differ
diff --git a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (2) (2).png b/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (2) (2).png
deleted file mode 100644
index 4653f1643..000000000
Binary files a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (2) (2).png and /dev/null differ
diff --git a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (2).png b/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (2).png
deleted file mode 100644
index 4653f1643..000000000
Binary files a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (2).png and /dev/null differ
diff --git a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (3) (1).png b/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (3) (1).png
deleted file mode 100644
index 4653f1643..000000000
Binary files a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (3) (1).png and /dev/null differ
diff --git a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (3).png b/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (3).png
deleted file mode 100644
index 4653f1643..000000000
Binary files a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (3).png and /dev/null differ
diff --git a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (4).png b/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (4).png
deleted file mode 100644
index 4653f1643..000000000
Binary files a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (4).png and /dev/null differ
diff --git a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (5).png b/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (5).png
deleted file mode 100644
index 4653f1643..000000000
Binary files a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (5).png and /dev/null differ
diff --git a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (6).png b/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (6).png
deleted file mode 100644
index 4653f1643..000000000
Binary files a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (6).png and /dev/null differ
diff --git a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (7).png b/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (7).png
deleted file mode 100644
index 4653f1643..000000000
Binary files a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (7).png and /dev/null differ
diff --git a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (8).png b/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (8).png
deleted file mode 100644
index 4653f1643..000000000
Binary files a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (8).png and /dev/null differ
diff --git a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (9).png b/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (9).png
deleted file mode 100644
index 4653f1643..000000000
Binary files a/.gitbook/assets/image (3) (2) (2) (4) (4) (3) (9).png and /dev/null differ
diff --git a/.gitbook/assets/image (3) (2) (2) (4) (4) (3).png b/.gitbook/assets/image (3) (2) (2) (4) (4) (3).png
deleted file mode 100644
index 4653f1643..000000000
Binary files a/.gitbook/assets/image (3) (2) (2) (4) (4) (3).png and /dev/null differ
diff --git a/.gitbook/assets/image (3).png b/.gitbook/assets/image (3).png
deleted file mode 100644
index 2a59ae9f3..000000000
Binary files a/.gitbook/assets/image (3).png and /dev/null differ
diff --git a/.gitbook/assets/image (4).png b/.gitbook/assets/image (4).png
deleted file mode 100644
index 8978b5865..000000000
Binary files a/.gitbook/assets/image (4).png and /dev/null differ
diff --git a/.gitbook/assets/image (5).png b/.gitbook/assets/image (5).png
deleted file mode 100644
index 705fb7ead..000000000
Binary files a/.gitbook/assets/image (5).png and /dev/null differ
diff --git a/.gitbook/assets/image (6).png b/.gitbook/assets/image (6).png
deleted file mode 100644
index ab3faa790..000000000
Binary files a/.gitbook/assets/image (6).png and /dev/null differ
diff --git a/.gitbook/assets/image (7).png b/.gitbook/assets/image (7).png
deleted file mode 100644
index 257937256..000000000
Binary files a/.gitbook/assets/image (7).png and /dev/null differ
diff --git a/.gitbook/assets/image (8).png b/.gitbook/assets/image (8).png
deleted file mode 100644
index ebf9a6fee..000000000
Binary files a/.gitbook/assets/image (8).png and /dev/null differ
diff --git a/.gitbook/assets/image (9) (1).png b/.gitbook/assets/image (9) (1).png
deleted file mode 100644
index cb97215e8..000000000
Binary files a/.gitbook/assets/image (9) (1).png and /dev/null differ
diff --git a/.gitbook/assets/image-19-.png b/.gitbook/assets/image-19-.png
deleted file mode 100644
index 7cf6d8ace..000000000
Binary files a/.gitbook/assets/image-19-.png and /dev/null differ
diff --git a/.gitbook/assets/image.png b/.gitbook/assets/image.png
deleted file mode 100644
index e1ab889fd..000000000
Binary files a/.gitbook/assets/image.png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline (1) (1).png b/.gitbook/assets/logging_pipeline (1) (1).png
deleted file mode 100644
index dd2d5b96b..000000000
Binary files a/.gitbook/assets/logging_pipeline (1) (1).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline (1).png b/.gitbook/assets/logging_pipeline (1).png
deleted file mode 100644
index dd2d5b96b..000000000
Binary files a/.gitbook/assets/logging_pipeline (1).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_buffer (1) (1) (2) (2) (2) (2) (2) (2) (2) (1).png b/.gitbook/assets/logging_pipeline_buffer (1) (1) (2) (2) (2) (2) (2) (2) (2) (1).png
deleted file mode 100644
index ba80a23b4..000000000
Binary files a/.gitbook/assets/logging_pipeline_buffer (1) (1) (2) (2) (2) (2) (2) (2) (2) (1).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_buffer (1) (1) (2) (2) (2) (2) (2) (2) (2) (2) (1).png b/.gitbook/assets/logging_pipeline_buffer (1) (1) (2) (2) (2) (2) (2) (2) (2) (2) (1).png
deleted file mode 100644
index ba80a23b4..000000000
Binary files a/.gitbook/assets/logging_pipeline_buffer (1) (1) (2) (2) (2) (2) (2) (2) (2) (2) (1).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_buffer (1) (1) (2) (2) (2) (2) (2) (2) (2) (2) (2).png b/.gitbook/assets/logging_pipeline_buffer (1) (1) (2) (2) (2) (2) (2) (2) (2) (2) (2).png
deleted file mode 100644
index ba80a23b4..000000000
Binary files a/.gitbook/assets/logging_pipeline_buffer (1) (1) (2) (2) (2) (2) (2) (2) (2) (2) (2).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_buffer (1) (1) (2) (2) (2) (2) (2) (2) (2) (2).png b/.gitbook/assets/logging_pipeline_buffer (1) (1) (2) (2) (2) (2) (2) (2) (2) (2).png
deleted file mode 100644
index ba80a23b4..000000000
Binary files a/.gitbook/assets/logging_pipeline_buffer (1) (1) (2) (2) (2) (2) (2) (2) (2) (2).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_buffer (1) (1) (2) (2) (2) (2) (2) (2) (2).png b/.gitbook/assets/logging_pipeline_buffer (1) (1) (2) (2) (2) (2) (2) (2) (2).png
deleted file mode 100644
index ba80a23b4..000000000
Binary files a/.gitbook/assets/logging_pipeline_buffer (1) (1) (2) (2) (2) (2) (2) (2) (2).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_filter (1) (2) (2) (2) (2) (2) (2) (1).png b/.gitbook/assets/logging_pipeline_filter (1) (2) (2) (2) (2) (2) (2) (1).png
deleted file mode 100644
index d17cb9c2d..000000000
Binary files a/.gitbook/assets/logging_pipeline_filter (1) (2) (2) (2) (2) (2) (2) (1).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_filter (1) (2) (2) (2) (2) (2) (2) (2).png b/.gitbook/assets/logging_pipeline_filter (1) (2) (2) (2) (2) (2) (2) (2).png
deleted file mode 100644
index d17cb9c2d..000000000
Binary files a/.gitbook/assets/logging_pipeline_filter (1) (2) (2) (2) (2) (2) (2) (2).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_filter (1) (2) (2) (2) (2) (2) (2).png b/.gitbook/assets/logging_pipeline_filter (1) (2) (2) (2) (2) (2) (2).png
deleted file mode 100644
index d17cb9c2d..000000000
Binary files a/.gitbook/assets/logging_pipeline_filter (1) (2) (2) (2) (2) (2) (2).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_input (1) (2) (2) (2) (2) (2) (2) (2) (1).png b/.gitbook/assets/logging_pipeline_input (1) (2) (2) (2) (2) (2) (2) (2) (1).png
deleted file mode 100644
index b7fcf1991..000000000
Binary files a/.gitbook/assets/logging_pipeline_input (1) (2) (2) (2) (2) (2) (2) (2) (1).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_input (1) (2) (2) (2) (2) (2) (2) (2) (2) (1).png b/.gitbook/assets/logging_pipeline_input (1) (2) (2) (2) (2) (2) (2) (2) (2) (1).png
deleted file mode 100644
index b7fcf1991..000000000
Binary files a/.gitbook/assets/logging_pipeline_input (1) (2) (2) (2) (2) (2) (2) (2) (2) (1).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_input (1) (2) (2) (2) (2) (2) (2) (2) (2) (2).png b/.gitbook/assets/logging_pipeline_input (1) (2) (2) (2) (2) (2) (2) (2) (2) (2).png
deleted file mode 100644
index b7fcf1991..000000000
Binary files a/.gitbook/assets/logging_pipeline_input (1) (2) (2) (2) (2) (2) (2) (2) (2) (2).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_input (1) (2) (2) (2) (2) (2) (2) (2) (2).png b/.gitbook/assets/logging_pipeline_input (1) (2) (2) (2) (2) (2) (2) (2) (2).png
deleted file mode 100644
index b7fcf1991..000000000
Binary files a/.gitbook/assets/logging_pipeline_input (1) (2) (2) (2) (2) (2) (2) (2) (2).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_input (1) (2) (2) (2) (2) (2) (2) (2).png b/.gitbook/assets/logging_pipeline_input (1) (2) (2) (2) (2) (2) (2) (2).png
deleted file mode 100644
index b7fcf1991..000000000
Binary files a/.gitbook/assets/logging_pipeline_input (1) (2) (2) (2) (2) (2) (2) (2).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_output (1) (1).png b/.gitbook/assets/logging_pipeline_output (1) (1).png
deleted file mode 100644
index 5d66005fe..000000000
Binary files a/.gitbook/assets/logging_pipeline_output (1) (1).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_output (1).png b/.gitbook/assets/logging_pipeline_output (1).png
deleted file mode 100644
index 5d66005fe..000000000
Binary files a/.gitbook/assets/logging_pipeline_output (1).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_parser (1) (1) (1) (1) (2) (2) (2) (3) (3) (3) (3) (3) (1).png b/.gitbook/assets/logging_pipeline_parser (1) (1) (1) (1) (2) (2) (2) (3) (3) (3) (3) (3) (1).png
deleted file mode 100644
index 621897340..000000000
Binary files a/.gitbook/assets/logging_pipeline_parser (1) (1) (1) (1) (2) (2) (2) (3) (3) (3) (3) (3) (1).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_parser (1) (1) (1) (1) (2) (2) (2) (3) (3) (3) (3) (3) (2).png b/.gitbook/assets/logging_pipeline_parser (1) (1) (1) (1) (2) (2) (2) (3) (3) (3) (3) (3) (2).png
deleted file mode 100644
index 621897340..000000000
Binary files a/.gitbook/assets/logging_pipeline_parser (1) (1) (1) (1) (2) (2) (2) (3) (3) (3) (3) (3) (2).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_parser (1) (1) (1) (1) (2) (2) (2) (3) (3) (3) (3) (3) (3).png b/.gitbook/assets/logging_pipeline_parser (1) (1) (1) (1) (2) (2) (2) (3) (3) (3) (3) (3) (3).png
deleted file mode 100644
index 621897340..000000000
Binary files a/.gitbook/assets/logging_pipeline_parser (1) (1) (1) (1) (2) (2) (2) (3) (3) (3) (3) (3) (3).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_parser (1) (1) (1) (1) (2) (2) (2) (3) (3) (3) (3) (3) (4).png b/.gitbook/assets/logging_pipeline_parser (1) (1) (1) (1) (2) (2) (2) (3) (3) (3) (3) (3) (4).png
deleted file mode 100644
index 621897340..000000000
Binary files a/.gitbook/assets/logging_pipeline_parser (1) (1) (1) (1) (2) (2) (2) (3) (3) (3) (3) (3) (4).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_parser (1) (1) (1) (1) (2) (2) (2) (3) (3) (3) (3) (3).png b/.gitbook/assets/logging_pipeline_parser (1) (1) (1) (1) (2) (2) (2) (3) (3) (3) (3) (3).png
deleted file mode 100644
index 621897340..000000000
Binary files a/.gitbook/assets/logging_pipeline_parser (1) (1) (1) (1) (2) (2) (2) (3) (3) (3) (3) (3).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_routing (1) (1) (2) (2) (2) (2) (2) (2) (2) (1) (1).png b/.gitbook/assets/logging_pipeline_routing (1) (1) (2) (2) (2) (2) (2) (2) (2) (1) (1).png
deleted file mode 100644
index 069ff2a17..000000000
Binary files a/.gitbook/assets/logging_pipeline_routing (1) (1) (2) (2) (2) (2) (2) (2) (2) (1) (1).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_routing (1) (1) (2) (2) (2) (2) (2) (2) (2) (1) (2) (1).png b/.gitbook/assets/logging_pipeline_routing (1) (1) (2) (2) (2) (2) (2) (2) (2) (1) (2) (1).png
deleted file mode 100644
index 069ff2a17..000000000
Binary files a/.gitbook/assets/logging_pipeline_routing (1) (1) (2) (2) (2) (2) (2) (2) (2) (1) (2) (1).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_routing (1) (1) (2) (2) (2) (2) (2) (2) (2) (1) (2) (2).png b/.gitbook/assets/logging_pipeline_routing (1) (1) (2) (2) (2) (2) (2) (2) (2) (1) (2) (2).png
deleted file mode 100644
index 069ff2a17..000000000
Binary files a/.gitbook/assets/logging_pipeline_routing (1) (1) (2) (2) (2) (2) (2) (2) (2) (1) (2) (2).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_routing (1) (1) (2) (2) (2) (2) (2) (2) (2) (1) (2).png b/.gitbook/assets/logging_pipeline_routing (1) (1) (2) (2) (2) (2) (2) (2) (2) (1) (2).png
deleted file mode 100644
index 069ff2a17..000000000
Binary files a/.gitbook/assets/logging_pipeline_routing (1) (1) (2) (2) (2) (2) (2) (2) (2) (1) (2).png and /dev/null differ
diff --git a/.gitbook/assets/logging_pipeline_routing (1) (1) (2) (2) (2) (2) (2) (2) (2) (1).png b/.gitbook/assets/logging_pipeline_routing (1) (1) (2) (2) (2) (2) (2) (2) (2) (1).png
deleted file mode 100644
index 069ff2a17..000000000
Binary files a/.gitbook/assets/logging_pipeline_routing (1) (1) (2) (2) (2) (2) (2) (2) (2) (1).png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_0.10.png b/.gitbook/assets/logo_documentation_0.10.png
deleted file mode 100644
index 7a072e651..000000000
Binary files a/.gitbook/assets/logo_documentation_0.10.png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_0.11.png b/.gitbook/assets/logo_documentation_0.11.png
deleted file mode 100644
index c252e9cb0..000000000
Binary files a/.gitbook/assets/logo_documentation_0.11.png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_0.12.png b/.gitbook/assets/logo_documentation_0.12.png
deleted file mode 100644
index d135b3507..000000000
Binary files a/.gitbook/assets/logo_documentation_0.12.png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_0.13.png b/.gitbook/assets/logo_documentation_0.13.png
deleted file mode 100644
index 722360683..000000000
Binary files a/.gitbook/assets/logo_documentation_0.13.png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_0.14.png b/.gitbook/assets/logo_documentation_0.14.png
deleted file mode 100644
index 66663951d..000000000
Binary files a/.gitbook/assets/logo_documentation_0.14.png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_1.0.png b/.gitbook/assets/logo_documentation_1.0.png
deleted file mode 100644
index f5477bce3..000000000
Binary files a/.gitbook/assets/logo_documentation_1.0.png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_1.2 (1).png b/.gitbook/assets/logo_documentation_1.2 (1).png
deleted file mode 100644
index 52ebf0a87..000000000
Binary files a/.gitbook/assets/logo_documentation_1.2 (1).png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_1.2.png b/.gitbook/assets/logo_documentation_1.2.png
deleted file mode 100644
index 52ebf0a87..000000000
Binary files a/.gitbook/assets/logo_documentation_1.2.png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_1.3.png b/.gitbook/assets/logo_documentation_1.3.png
deleted file mode 100644
index 9ae6297e5..000000000
Binary files a/.gitbook/assets/logo_documentation_1.3.png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_1.4.png b/.gitbook/assets/logo_documentation_1.4.png
deleted file mode 100644
index 2e9428e32..000000000
Binary files a/.gitbook/assets/logo_documentation_1.4.png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_1.5.png b/.gitbook/assets/logo_documentation_1.5.png
deleted file mode 100644
index 6b58a8ec8..000000000
Binary files a/.gitbook/assets/logo_documentation_1.5.png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_1.6.png b/.gitbook/assets/logo_documentation_1.6.png
deleted file mode 100644
index 6cd5b7ed0..000000000
Binary files a/.gitbook/assets/logo_documentation_1.6.png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_1.7.png b/.gitbook/assets/logo_documentation_1.7.png
deleted file mode 100644
index 06bb68a1e..000000000
Binary files a/.gitbook/assets/logo_documentation_1.7.png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_1.8.png b/.gitbook/assets/logo_documentation_1.8.png
deleted file mode 100644
index 4dad09997..000000000
Binary files a/.gitbook/assets/logo_documentation_1.8.png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_1.9.png b/.gitbook/assets/logo_documentation_1.9.png
deleted file mode 100644
index c37f8a571..000000000
Binary files a/.gitbook/assets/logo_documentation_1.9.png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_2.0.png b/.gitbook/assets/logo_documentation_2.0.png
deleted file mode 100644
index d4ccbc624..000000000
Binary files a/.gitbook/assets/logo_documentation_2.0.png and /dev/null differ
diff --git a/.gitbook/assets/logo_documentation_2.1.png b/.gitbook/assets/logo_documentation_2.1.png
deleted file mode 100644
index 867a47dd4..000000000
Binary files a/.gitbook/assets/logo_documentation_2.1.png and /dev/null differ
diff --git a/.gitbook/assets/markdownlint-example.png b/.gitbook/assets/markdownlint-example.png
new file mode 100644
index 000000000..35cb39bc5
Binary files /dev/null and b/.gitbook/assets/markdownlint-example.png differ
diff --git a/.gitbook/assets/processor_opentelemetry_envelope.png b/.gitbook/assets/processor_opentelemetry_envelope.png
new file mode 100644
index 000000000..d44920a14
Binary files /dev/null and b/.gitbook/assets/processor_opentelemetry_envelope.png differ
diff --git a/.gitbook/assets/traces_head_sampling.png b/.gitbook/assets/traces_head_sampling.png
new file mode 100644
index 000000000..06c8fbb1a
Binary files /dev/null and b/.gitbook/assets/traces_head_sampling.png differ
diff --git a/.gitbook/assets/traces_tail_sampling.png b/.gitbook/assets/traces_tail_sampling.png
new file mode 100644
index 000000000..0d56fb57d
Binary files /dev/null and b/.gitbook/assets/traces_tail_sampling.png differ
diff --git a/.gitbook/assets/v2.2 big@2x.png b/.gitbook/assets/v2.2 big@2x.png
deleted file mode 100644
index 1ae8c088e..000000000
Binary files a/.gitbook/assets/v2.2 big@2x.png and /dev/null differ
diff --git a/.gitbook/assets/vale-example-error.png b/.gitbook/assets/vale-example-error.png
new file mode 100644
index 000000000..e57ecbb92
Binary files /dev/null and b/.gitbook/assets/vale-example-error.png differ
diff --git a/.gitbook/assets/vale-example-warning.png b/.gitbook/assets/vale-example-warning.png
new file mode 100644
index 000000000..460c7579b
Binary files /dev/null and b/.gitbook/assets/vale-example-warning.png differ
diff --git a/.gitbook/assets/windows_installer (1) (1).png b/.gitbook/assets/windows_installer (1) (1).png
deleted file mode 100644
index 37ac237d1..000000000
Binary files a/.gitbook/assets/windows_installer (1) (1).png and /dev/null differ
diff --git a/.gitbook/assets/windows_installer (1).png b/.gitbook/assets/windows_installer (1).png
deleted file mode 100644
index 37ac237d1..000000000
Binary files a/.gitbook/assets/windows_installer (1).png and /dev/null differ
diff --git a/.github/workflows/pr-lint.yaml b/.github/workflows/pr-lint.yaml
index 6460e74d8..643ce6b7f 100644
--- a/.github/workflows/pr-lint.yaml
+++ b/.github/workflows/pr-lint.yaml
@@ -21,3 +21,23 @@ jobs:
     steps:
       - uses: actions/checkout@v4
       - uses: ludeeus/action-shellcheck@master
+
+  markdownlint:
+    name: runner / markdownlint
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - name: markdownlint
+        uses: prologic/action-markdownlint@v0.26.2
+        with:
+          github_token: ${{ secrets.GITHUB_TOKEN }}
+          reporter: github-pr-review # Change reporter. (Only `github-pr-check` is supported at the moment).
+  vale:
+    name: runner / vale
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - uses: errata-ai/vale-action@v2.1.1
+        with:
+          files: all
+          fail_on_error: true
diff --git a/.gitignore b/.gitignore
index d7c216868..de830956d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,5 @@ _book/*
 node_modules/*
 .gitignore
 old/*
-
+.DS_Store
+.idea/
\ No newline at end of file
diff --git a/.markdownlint.json b/.markdownlint.json
new file mode 100644
index 000000000..d327637d8
--- /dev/null
+++ b/.markdownlint.json
@@ -0,0 +1,12 @@
+{
+    "default": true,
+    "MD003": { "style": "atx" },
+    "MD007": { "indent": 2 },
+    "MD013": false,
+    "MD025": { "front_matter_title": "false" },
+    "MD047": false,
+    "MD049": { "style": "underscore" },
+	"no-hard-tabs": false,
+    "whitespace": false,
+    "no-emphasis-as-heading": false
+}
diff --git a/.vale.ini b/.vale.ini
new file mode 100755
index 000000000..b9f4e951f
--- /dev/null
+++ b/.vale.ini
@@ -0,0 +1,17 @@
+StylesPath = vale-styles
+MinAlertLevel = suggestion # suggestion, warning or error
+IgnoredScopes = tt, code
+
+[formats]
+mdx = md
+
+[*.{md,markdown}]
+BasedOnStyles = FluentBit
+
+FluentBit.Terms = YES
+FluentBit.Titles = YES
+FluentBit.FutureTense = NO
+FluentBit.Headings = YES
+FluentBit.Passive = NO
+FluentBit.Subjunctive = NO
+FluentBit.Colons = NO
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 3beefdb53..b2f1ed5d0 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,118 +1,158 @@
+<!-- vale off -->
+<!-- markdownlint-disable MD033 -->
+
 # Contributing to Fluent Bit docs
 
-First of all, thanks for taking the time to read this guide. The fact that you're
-here means you're interested in contributing to Fluent Bit, and we highly appreciate
-your time.
+First of all, thanks for taking the time to read this guide. The fact that you're here means you're interested in contributing to Fluent Bit, and we greatly appreciate your time.
+
+This repository contains the files for the [Fluent Bit documentation library](https://docs.fluentbit.io/). Keeping these docs separate from the [main Fluent Bit repository](https://github.com/fluent/fluent-bit) helps reduce the number of commits to the Fluent Bit source code and makes it easier to maintain both projects.
+
+Fluent Bit has a group of dedicated maintainers who oversee this repository, including several technical writers. These writers will review any pull requests you open, so don't be afraid to contribute, even if you're not a writer by trade. Your suggestions are valuable, and we'll help you wrangle any stray commas.
 
-This repository contains the files for the
-[Fluent Bit documentation library](https://docs.fluentbit.io/). Keeping these docs
-separate from the [main Fluent Bit repository](https://github.com/fluent/fluent-bit)
-helps reduce the number of commits to the Fluent Bit source code and makes it
-easier to maintain both projects.
+## :star: Quick tips
 
-Fluent Bit has a group of dedicated maintainers who oversee this repository,
-including several technical writers. These writers will review any pull requests
-you open, so don't be afraid to contribute—even if you're not a writer by trade.
-Your suggestions are valuable, and we'll help you wrangle any stray commas.
+Before you contribute to the Fluent Bit docs, review these critical tips:
 
-## GitBook
+- [Sign off](#sign-off-your-git-commits) your Git commits.
+- Use [soft line wraps](#line-wraps) in Markdown files.
+- To link between pages, use [absolute file paths](#links).
+- Review the results of [linters](#linters) for style and formatting guidance.
 
-The Fluent Bit docs library is built and hosted through
-[GitBook](https://docs.gitbook.com/). Unfortunately, GitBook doesn't support
-local previews for contributors, but a Fluent Bit maintainer with a dedicated GitBook
-account can verify that things are formatted correctly after you open a new pull
-request.
+## Review process
 
-Each `.md` file in this repository is a single page. You can use
-[standard Markdown syntax](https://docs.gitbook.com/content-editor/editing-content/markdown)
-to edit existing pages, or create a new `.md` file to add an additional page to
-the docs library. If you create a new page, you'll also need to update
-[GitBook's `SUMMARY.md` file](https://docs.gitbook.com/integrations/git-sync/content-configuration#structure)
-(or ask a maintainer to update it for you).
+After you open a pull request in this repository, a Fluent Bit maintainer will review it, add comments or suggestions as needed, and then merge it. After your changes are successfully merged into `master`, the docs site will update within a few minutes.
 
-## Workflow
+### Request review without merging
 
-After you open a pull request in this repo, a Fluent Bit maintainer will review
-it, triage it, add comments or suggestions as needed, and then merge it. After
-your changes are successfully merged into `master`, the docs site will update
-within a few minutes.
+If you're contributing documentation for a Fluent Bit feature that's still in development, ask a maintainer to add the `waiting-on-code-merge` label to your pull request. This lets other maintainers know that your changes aren't ready to merge yet, even if they were approved.
 
 ### Stale pull requests
 
-If you open a pull request that requires ongoing discussion or review, the
-Fluent Bit maintainers will add a [`waiting-for-user` tag](#tags) to your pull
-request. This tag means that we're blocked from moving forward until you reply.
-To keep contributions from going stale, we'll wait 45 days for your response,
-but we may close the pull request if we don't hear back from you by then.
+If you open a pull request that requires extended discussion or review, the Fluent Bit maintainers will add a `waiting-for-user` label to your pull request. This label means that we're blocked from moving forward until you reply. To keep contributions from going stale, we'll wait 45 days for your response, after which we might close the pull request if we don't hear back from you.
 
-## Submit a contribution
+## Pass DCO checks
 
-When you open a pull request, make your changes against `master`, which is the
-active development branch. If your contribution also applies to the latest
-stable version, submit another PR for that versioned branch. However, if
-submitting multiple PRs at the same time adds too much complexity, you can instead
-create a single PR against `master` and specify that your changes need to be
-**backported** to other branches; one of our maintainers will take care of that
-process on your behalf.
+To pass this repository's [DCO checks](https://github.com/apps/dco), you'll need to adhere to the following Git practices.
 
-All contributions must be made **first** against [master branch](https://github.com/fluent/fluent-bit-docs/tree/master) which is the active development branch, and then **if** the contribution also applies for the current stable branch, submit another PR for that specific branch, if submitting another PR adds some complexity, please specify in the first PR as a comment (for master branch) that it needs to be *backported*. One of our maintainers will take care of that process.
+### Set your email in Git
 
-As a contributor, we'll ask you to follow a few best practices related to Git:
+To sign commits properly, you must first set your email address in your local Git environment. This should be the same email address associated with your GitHub account.
 
-### One file per commit
+For more information, refer to GitHub's guide to [setting your commit email address in Git](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address#setting-your-commit-email-address-in-git).
 
-Each commit you make should only modify one file or interface—we follow the same
-practice in the Fluent Bit source code.
+### Sign off your Git commits
 
-### Commit subjects
+You must sign off your commits to certify your identity as the commit author. A commit is signed off when its commit message looks like this:
 
-Use descriptive commit subjects that describe which file or interface you're
-modifying.
+```text
+pipeline: outputs: syslog: fix grammar in examples
+Signed-off-by: Tux <tux@linux.org>
+```
 
-For example, if you're modifying the Syslog output plugin doc, whose file is
-located at [pipeline/outputs/syslog.md](https://github.com/fluent/fluent-bit-docs/blob/master/pipeline/outputs/syslog.md), this would be a descriptive commit subject:
+For faster signing, you can use the `-s` flag:
 
-`pipeline: outputs: syslog: fix grammar in examples`
+`git commit -a -s -m "pipeline: outputs: syslog: fix grammar in examples"`
 
-Since this commit is prefixed with the relevant file path, it helps our maintainers
-understand and prioritize your contribution.
+> :bulb: If you're using VSCode, the [**Git: Always Sign Off**](https://github.com/microsoft/vscode/issues/83096#issuecomment-545350047) option appends a `Signed-off-by:` message to all of your commits.
 
-### Set your email in Git
+### Fix "DCO is missing" errors
 
-Make sure your email address is configured in your local Git environment. This
-should be the same email address associated with your GitHub account.
+If a DCO error blocks your pull request from merging, refer to this guide about [how to add sign-offs retroactively](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md#how-to-add-sign-offs-retroactively).
 
-For more information, refer to GitHub's guide to
-[setting your commit email address in Git](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address#setting-your-commit-email-address-in-git).
+## Style guidelines
 
-### Sign off your commits
+The Fluent Bit documentation follows the [Google developer documentation style guide](https://developers.google.com/style) for most topics related to grammar and style. We don't expect you to memorize these style rules, but the maintainers who review your pull request might suggest changes accordingly.
 
-You must sign off your commits to certify your identity as the commit author. If
-you don't sign off your commits, our CI system will flag the pull request with a
-[DCO](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md)
-error and prevent your pull request from merging.
+The active [linters](#linters) in this repository flag certain style errors and, in some cases, explain how to fix them.
 
-To prevent DCO errors, refer to the following guide about
-[signing your commits properly](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md).
+## Formatting guidelines
 
-> :bulb: For faster signing, you can use the `-s` flag in Git:
->
-> `git commit -a -s -m "pipeline: outputs: syslog: fix grammar in examples"`
->
-> If you're using VS Code, you can also enable the
-> [**Git: Always Sign Off**](https://github.com/microsoft/vscode/issues/83096#issuecomment-545350047)
-> setting, whch automatically appends a `Signed-off-by:` message to your commits.
+The Fluent Bit docs library is built and hosted through [GitBook](https://docs.gitbook.com/). Unfortunately, GitBook doesn't support local previews for contributors, but a Fluent Bit maintainer with a dedicated GitBook account can verify that things are formatted correctly after you open a new pull request.
 
-## Style guidelines
+### Links
+
+When cross-linking between in this repository, use a full absolute path whenever possible. For example:
+
+```text
+[LTSV](../pipeline/parsers/ltsv.md) and [Logfmt](../pipeline/parsers/logfmt.md)
+```
+
+### Line wraps
+
+When GitBook renders pages, it treats all newlines literally, which means hard line wraps in Markdown files create awkward line breaks in the Fluent Bit docs site. Due to this, docs contributions must use soft line wraps.
+
+<details>
+<summary>:white_check_mark: Example: soft line wraps</summary>
+
+```text
+Soft-wrapped text uses newlines only to mark the end of a paragraph. From the perspective of a text editor, this means each paragraph looks like a single, unbroken line of text.
+
+After two newlines, another paragraph begins.
+```
+
+</details>
+
+<details>
+<summary>:no_entry_sign: Example: hard line wraps</summary>
+
+```text
+Hard-wrapped text uses newlines
+in the middle of sentences and
+paragraphs.
+
+This can make text easier for
+humans to read, but GitBook
+renders hard line wraps
+awkwardly.
+```
+
+</details>
 
-The Fluent Bit maintainers refer to the
-[Google developer documentation style guide](https://developers.google.com/style)
-for most topics related to grammar, style, and formatting. We don't expect you
-to memorize these style rules, but the technical writer who reviews your pull
-request may suggest changes accordingly.
+### Quotes
+
+By default, Google Docs and Microsoft Word turn standard straight quotes into "smart"
+curly quotes. If you copy-paste from one of these tools, you must correct the quotes back to straight quotes. You can also turn off smart quotes in [Google Docs](https://support.google.com/docs/thread/217182974/can-i-turn-smart-quotes-off-in-a-google-doc?hl=en) or [Microsoft Word](https://support.microsoft.com/en-us/office/smart-quotes-in-word-and-powerpoint-702fc92e-b723-4e3d-b2cc-71dedaf2f343) to prevent this problem.
+
+### Table of contents
+
+When you create a new `.md` file for a new page, you must add an entry to this repository's [`SUMMARY.md` file](https://github.com/fluent/fluent-bit-docs/blob/master/SUMMARY.md) (or ask a maintainer to add it on your behalf). If you don't update `SUMMARY.md`, the new page won't appear in the table of contents on the Fluent Bit docs site.
+
+Similarly, if you update the `# h1` title header of an existing page, be sure to update that page's `SUMMARY.md` entry to match. `SUMMARY.md` entries takes precedence over in-page headers, which means that if you update a page's `# h1` title without updating `SUMMARY.md`, the unchanged `SUMMARY.md` title will persist in both the rendered page and the table of contents.
+
+## Linters
+
+This repository runs linters as GitHub Actions for each pull request. If a linter finds errors or makes suggested changes, you can view these results in the **Files changed** tab.
+
+<details>
+<summary>:mag: Examples: linter results</summary>
+
+![An example of a warning-level Vale result.](/.gitbook/assets/vale-example-warning.png)
+
+![An example of an error-level Vale result.](/.gitbook/assets/vale-example-error.png)
+
+![An example of a Markdownlint result.](/.gitbook/assets/markdownlint-example.png)
+
+</details>
 
 ### Vale
 
-The Fluent Bit maintainers are working to add a [Vale](https://vale.sh/docs/) plugin
-to this repository, which will automatically lint pull requests and add
-suggestions to improve style and clarity.
+[Vale](https://vale.sh/docs/) lints prose for style and clarity. In addition to reviewing the results of each Vale test in GitHub, you can use the [Vale plugin for VSCode](https://marketplace.visualstudio.com/items?itemName=ChrisChinchilla.vale-vscode) to view errors and suggestions locally.
+
+Vale tests for the Fluent Bit docs are stored in the [`/vale-styles`](https://github.com/fluent/fluent-bit-docs/tree/master/vale-styles) folder. Most Vale tests are at the `suggestion` or `warning` level and won't block pull requests from merging. However, tests at the `error` level will block merging until the associated issue is fixed.
+
+### Markdownlint
+
+[Markdownlint](https://github.com/markdownlint/markdownlint) lints Markdown formatting and makes suggestions for improvements. In addition to reviewing the results of each test in GitHub, you can use the [markdownlint plugin for VSCode](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint) to view suggestions locally.
+
+Markdownlint tests for the Fluent Bit docs are stored in [`markdownlint.json`](https://github.com/fluent/fluent-bit-docs/blob/master/.markdownlint.json). These tests don't block pull requests from merging.
+
+## Additional resources
+
+For general guidance about writing documentation, consult the following resources:
+
+- [Open Source Technical Documentation Essentials (LFC111)](https://training.linuxfoundation.org/training/open-source-technical-documentation-essentials-lfc111/)
+- [Creating Effective Documentation for Developers (LFC112)](https://training.linuxfoundation.org/training/creating-effective-documentation-for-developers-lfc112/)
+- [Google Technical Writing Courses for Engineers](https://developers.google.com/tech-writing)
+
+<!-- vale on -->
+<!-- markdownlint-disable MD033 -->
diff --git a/MAINTAINERS.md b/MAINTAINERS.md
index 9abcf140a..197c01a41 100644
--- a/MAINTAINERS.md
+++ b/MAINTAINERS.md
@@ -1,6 +1,6 @@
 # Fluent Bit Documentation Maintainers
 
-Fluent Bit is developed and supported by many individuals and companies.  The following table list the names of maintainers per components and the company supporting their work.
+Fluent Bit is developed and supported by many individuals and companies. The following table list the names of maintainers per components and the company supporting their work.
 
 | Maintainer Name                                        | Documentation portion    | Company                                           |
 | :----------------------------------------------------  | ------------------------ | ------------------------------------------------- |
@@ -9,3 +9,5 @@ Fluent Bit is developed and supported by many individuals and companies.  The fo
 | [Jose Lecaros](https://github.com/lecaros)             | All                      | [Chronosphere](https://chronosphere.io)           |
 | [Lynette Miles](https://github.com/esmerel)            | All                      | [Chronosphere](https://chronosphere.io)           |
 | [Alexa Kreizinger](https://github.com/alexakreizinger) | All                      | [Chronosphere](https://chronosphere.io)           |
+| [Paige Cruz](https://github.com/paigerduty)            | All                      | [Chronosphere](https://chronosphere.io/)          |
+| [Eric D. Schabell](https://github.com/eschabell)       | All                      | [Chronosphere](https://chronosphere.io/)          |
diff --git a/README.md b/README.md
index ffb295651..b658e7cb4 100644
--- a/README.md
+++ b/README.md
@@ -2,39 +2,43 @@
 description: High Performance Telemetry Agent for Logs, Metrics and Traces
 ---
 
-# Fluent Bit v3.0 Documentation
+# Fluent Bit documentation
 
-<figure><img src=".gitbook/assets/3.0.png" alt=""><figcaption></figcaption></figure>
+<figure><img src=".gitbook/assets/fluent_bit_logo.png" alt=""><figcaption></figcaption></figure>
 
-[Fluent Bit](http://fluentbit.io) is a Fast and Lightweight **Telemetry Agent** for Logs, Metrics, and Traces for Linux, macOS, Windows, and BSD family operating systems. It has been made with a strong focus on performance to allow the collection and processing of telemetry data from different sources without complexity.![](https://static.scarf.sh/a.png?x-pxid=71f0e011-761f-4c6f-9a89-38817887faae)
+[Fluent Bit](http://fluentbit.io) is a fast and lightweight telemetry agent for logs, metrics, and traces for Linux, macOS, Windows, and BSD family operating systems. Fluent Bit has been made with a strong focus on performance to allow the collection and processing of telemetry data from different sources without complexity.![](https://static.scarf.sh/a.png?x-pxid=71f0e011-761f-4c6f-9a89-38817887faae)
 
 ## Features
 
-* High Performance: High throughput with low resources consumption
-* Data Parsing
-  * Convert your unstructured messages using our parsers: [JSON](pipeline/parsers/json.md), [Regex](pipeline/parsers/regular-expression.md), [LTSV](pipeline/parsers/ltsv.md) and [Logfmt](pipeline/parsers/logfmt.md)
-* Metrics Support: Prometheus and OpenTelemetry compatible
-* Reliability and Data Integrity
-  * [Backpressure](administration/backpressure.md) Handling
-  * [Data Buffering](administration/buffering-and-storage.md) in memory and file system
-* Networking
-  * Security: built-in TLS/SSL support
-  * Asynchronous I/O
-* Pluggable Architecture and [Extensibility](development/library_api.md): Inputs, Filters and Outputs
-  * Connect nearly any source to nearly any destination using preexisting plugins
-  * Extensibility
-    * Write any input, filter or output plugin in C language
-    * WASM: [WASM Filter Plugins](development/wasm-filter-plugins.md) or [WASM Input Plugins](development/wasm-input-plugins.md)
-    * Bonus: write [Filters in Lua](pipeline/filters/lua.md) or [Output plugins in Golang](development/golang-output-plugins.md)
-* [Monitoring](administration/monitoring.md): expose internal metrics over HTTP in JSON and [Prometheus](https://prometheus.io/) format
-* [Stream Processing](stream-processing/introduction.md): Perform data selection and transformation using simple SQL queries
-  * Create new streams of data using query results
-  * Aggregation Windows
-  * Data analysis and prediction: Timeseries forecasting
-* Portable: runs on Linux, macOS, Windows and BSD systems
-
-## Fluent Bit, Fluentd and CNCF
-
-[Fluent Bit](http://fluentbit.io) is a [CNCF](https://cncf.io) **graduated** sub-project under the umbrella of [Fluentd](http://fluentd.org). Fluent Bit is licensed under the terms of the [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0).
-
-Fluent Bit was originally created by [Eduardo Silva](https://www.linkedin.com/in/edsiper/). As a CNCF-hosted project, it is a fully **vendor-neutral** and community-driven project.
+- High performance: High throughput with low resources consumption
+- Data parsing
+  - Convert your unstructured messages using Fluent Bit parsers: [JSON](pipeline/parsers/json.md), [Regex](pipeline/parsers/regular-expression.md), [LTSV](pipeline/parsers/ltsv.md) and [Logfmt](pipeline/parsers/logfmt.md)
+- Metrics support: Prometheus and OpenTelemetry compatible
+- Reliability and data integrity
+  - [Backpressure](administration/backpressure.md) handling
+  - [Data buffering](administration/buffering-and-storage.md) in memory and file system
+- Networking
+  - Security: Built-in TLS/SSL support
+  - Asynchronous I/O
+- Pluggable architecture and [extensibility](development/library_api.md): Inputs, Filters and Outputs:
+  - Connect nearly any source to nearly any destination using preexisting plugins
+  - Extensibility:
+    - Write input, filter, or output plugins in the C language
+    - Wasm: [Wasm Filter Plugins](development/wasm-filter-plugins.md) or [Wasm Input Plugins](development/wasm-input-plugins.md)
+    - Write [Filters in Lua](pipeline/filters/lua.md) or [Output plugins in Golang](development/golang-output-plugins.md)
+- [Monitoring](administration/monitoring.md): Expose internal metrics over HTTP in JSON and [Prometheus](https://prometheus.io/) format
+- [Stream Processing](stream-processing/introduction.md): Perform data selection and transformation using basic SQL queries
+  - Create new streams of data using query results
+  - Aggregation windows
+  - Data analysis and prediction: Time series forecasting
+- Portable: Runs on Linux, macOS, Windows and BSD systems
+
+### Release notes
+
+For more details about changes in each release, refer to the [official release notes](https://fluentbit.io/announcements/).
+
+## Fluent Bit, Fluentd, and CNCF
+
+[Fluent Bit](http://fluentbit.io) is a [CNCF](https://cncf.io) graduated sub-project under the umbrella of [Fluentd](http://fluentd.org). Fluent Bit is licensed under the terms of the [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0).
+
+Fluent Bit was originally created by [Eduardo Silva](https://www.linkedin.com/in/edsiper/) and is now sponsored by [Chronosphere](https://chronosphere.io/). As a CNCF-hosted project, it's a fully vendor-neutral and community-driven project.
diff --git a/SUMMARY.md b/SUMMARY.md
index ab62d5fdd..1dcb7877d 100644
--- a/SUMMARY.md
+++ b/SUMMARY.md
@@ -1,19 +1,20 @@
 # Table of contents
 
-* [Fluent Bit v3.0 Documentation](README.md)
+* [Fluent Bit documentation](README.md)
 
 ## About
 
 * [What is Fluent Bit?](about/what-is-fluent-bit.md)
-* [A Brief History of Fluent Bit](about/history.md)
-* [Fluentd & Fluent Bit](about/fluentd-and-fluent-bit.md)
+* [A brief history of Fluent Bit](about/history.md)
+* [Fluentd and Fluent Bit](about/fluentd-and-fluent-bit.md)
 * [License](about/license.md)
+* [Sandbox and lab resources](about/sandbox-and-lab-resources.md)
 
 ## Concepts
 
-* [Key Concepts](concepts/key-concepts.md)
+* [Key concepts](concepts/key-concepts.md)
 * [Buffering](concepts/buffering.md)
-* [Data Pipeline](concepts/data-pipeline/README.md)
+* [Data pipeline](concepts/data-pipeline/README.md)
   * [Input](concepts/data-pipeline/input.md)
   * [Parser](concepts/data-pipeline/parser.md)
   * [Filter](concepts/data-pipeline/filter.md)
@@ -23,94 +24,108 @@
 
 ## Installation
 
-* [Getting Started with Fluent Bit](installation/getting-started-with-fluent-bit.md)
-* [Upgrade Notes](installation/upgrade-notes.md)
-* [Supported Platforms](installation/supported-platforms.md)
+* [Get started with Fluent Bit](installation/getting-started-with-fluent-bit.md)
+* [Upgrade notes](installation/upgrade-notes.md)
+* [Supported platforms](installation/supported-platforms.md)
 * [Requirements](installation/requirements.md)
 * [Sources](installation/sources/README.md)
-  * [Download Source Code](installation/sources/download-source-code.md)
-  * [Build and Install](installation/sources/build-and-install.md)
-  * [Build with Static Configuration](installation/sources/build-with-static-configuration.md)
-* [Linux Packages](installation/linux/README.md)
+  * [Download source code](installation/sources/download-source-code.md)
+  * [Build and install](installation/sources/build-and-install.md)
+  * [Build with static configuration](installation/sources/build-with-static-configuration.md)
+* [Linux packages](installation/linux/README.md)
   * [Amazon Linux](installation/linux/amazon-linux.md)
-  * [Redhat / CentOS](installation/linux/redhat-centos.md)
+  * [Rocky Linux and Alma Linux ](installation/linux/alma-rocky.md)
+  * [Red Hat and CentOS](installation/linux/redhat-centos.md)
   * [Debian](installation/linux/debian.md)
   * [Ubuntu](installation/linux/ubuntu.md)
-  * [Raspbian / Raspberry Pi](installation/linux/raspbian-raspberry-pi.md)
+  * [Raspbian and Raspberry Pi](installation/linux/raspbian-raspberry-pi.md)
 * [Docker](installation/docker.md)
 * [Containers on AWS](installation/aws-container.md)
 * [Amazon EC2](installation/amazon-ec2.md)
 * [Kubernetes](installation/kubernetes.md)
 * [macOS](installation/macos.md)
 * [Windows](installation/windows.md)
-* [Yocto / Embedded Linux](installation/yocto-embedded-linux.md)
-* [Buildroot / Embedded Linux](installation/buildroot-embedded-linux.md)
+* [Yocto embedded Linux](installation/yocto-embedded-linux.md)
+* [Buildroot embedded Linux](installation/buildroot-embedded-linux.md)
 
 ## Administration
 
-* [Configuring Fluent Bit](administration/configuring-fluent-bit/README.md)
+* [Configure Fluent Bit](administration/configuring-fluent-bit/README.md)
+  * [YAML configuration](administration/configuring-fluent-bit/yaml/README.md)
+    * [Service](administration/configuring-fluent-bit/yaml/service-section.md)
+    * [Parsers](administration/configuring-fluent-bit/yaml/parsers-section.md)
+    * [Multiline parsers](administration/configuring-fluent-bit/yaml/multiline-parsers-section.md)
+    * [Pipeline](administration/configuring-fluent-bit/yaml/pipeline-section.md)
+    * [Plugins](administration/configuring-fluent-bit/yaml/plugins-section.md)
+    * [Upstream servers](administration/configuring-fluent-bit/yaml/upstream-servers-section.md)
+    * [Environment variables](administration/configuring-fluent-bit/yaml/environment-variables-section.md)
+    * [Includes](administration/configuring-fluent-bit/yaml/includes-section.md)
   * [Classic mode](administration/configuring-fluent-bit/classic-mode/README.md)
-    * [Format and Schema](administration/configuring-fluent-bit/classic-mode/format-schema.md)
-    * [Configuration File](administration/configuring-fluent-bit/classic-mode/configuration-file.md)
+    * [Format and schema](administration/configuring-fluent-bit/classic-mode/format-schema.md)
+    * [Configuration file](administration/configuring-fluent-bit/classic-mode/configuration-file.md)
     * [Variables](administration/configuring-fluent-bit/classic-mode/variables.md)
     * [Commands](administration/configuring-fluent-bit/classic-mode/commands.md)
-    * [Upstream Servers](administration/configuring-fluent-bit/classic-mode/upstream-servers.md)
-    * [Record Accessor](administration/configuring-fluent-bit/classic-mode/record-accessor.md)
-  * [YAML Configuration](administration/configuring-fluent-bit/yaml/README.md)
-    * [Configuration File](administration/configuring-fluent-bit/yaml/configuration-file.md)
+    * [Upstream servers](administration/configuring-fluent-bit/classic-mode/upstream-servers.md)
+    * [Record accessor syntax](administration/configuring-fluent-bit/classic-mode/record-accessor.md)
   * [Unit Sizes](administration/configuring-fluent-bit/unit-sizes.md)
-  * [Multiline Parsing](administration/configuring-fluent-bit/multiline-parsing.md)
-* [Transport Security](administration/transport-security.md)
-* [Buffering & Storage](administration/buffering-and-storage.md)
+  * [Multiline parsing](administration/configuring-fluent-bit/multiline-parsing.md)
+* [TLS](administration/transport-security.md)
+* [Buffering and storage](administration/buffering-and-storage.md)
 * [Backpressure](administration/backpressure.md)
-* [Scheduling and Retries](administration/scheduling-and-retries.md)
+* [Scheduling and retries](administration/scheduling-and-retries.md)
 * [Networking](administration/networking.md)
-* [Memory Management](administration/memory-management.md)
+* [Memory management](administration/memory-management.md)
 * [Monitoring](administration/monitoring.md)
-* [HTTP Proxy](administration/http-proxy.md)
-* [Hot Reload](administration/hot-reload.md)
+* [Multithreading](administration/multithreading.md)
+* [HTTP proxy](administration/http-proxy.md)
+* [Hot reload](administration/hot-reload.md)
 * [Troubleshooting](administration/troubleshooting.md)
+* [Performance tips](administration/performance.md)
+* [AWS credentials](administration/aws-credentials.md)
 
-## Local Testing
+## Local testing
 
-* [Validating your Data and Structure](local-testing/validating-your-data-and-structure.md)
-* [Running a Logging Pipeline Locally](local-testing/logging-pipeline.md)
+* [Validate your data and structure](local-testing/validating-your-data-and-structure.md)
+* [Run a logging pipeline locally](local-testing/logging-pipeline.md)
 
-## Data Pipeline <a href="#pipeline" id="pipeline"></a>
+## Data pipeline
 
-* [Pipeline Monitoring](pipeline/pipeline-monitoring.md)
+* [Pipeline monitoring](pipeline/pipeline-monitoring.md)
 * [Inputs](pipeline/inputs/README.md)
   * [Collectd](pipeline/inputs/collectd.md)
-  * [CPU Log Based Metrics](pipeline/inputs/cpu-metrics.md)
-  * [Disk I/O Log Based Metrics](pipeline/inputs/disk-io-metrics.md)
-  * [Docker Log Based Metrics](pipeline/inputs/docker-metrics.md)
-  * [Docker Events](pipeline/inputs/docker-events.md)
+  * [CPU metrics](pipeline/inputs/cpu-metrics.md)
+  * [Disk I/O metrics](pipeline/inputs/disk-io-metrics.md)
+  * [Docker events](pipeline/inputs/docker-events.md)
+  * [Docker metrics](pipeline/inputs/docker-metrics.md)
   * [Dummy](pipeline/inputs/dummy.md)
+  * [eBPF](pipeline/inputs/ebpf.md)
   * [Elasticsearch](pipeline/inputs/elasticsearch.md)
+  * [Exec WASI](pipeline/inputs/exec-wasi.md)
   * [Exec](pipeline/inputs/exec.md)
-  * [Exec Wasi](pipeline/inputs/exec-wasi.md)
-  * [Fluent Bit Metrics](pipeline/inputs/fluentbit-metrics.md)
+  * [Fluent Bit metrics](pipeline/inputs/fluentbit-metrics.md)
   * [Forward](pipeline/inputs/forward.md)
   * [Head](pipeline/inputs/head.md)
-  * [HTTP](pipeline/inputs/http.md)
   * [Health](pipeline/inputs/health.md)
+  * [HTTP](pipeline/inputs/http.md)
   * [Kafka](pipeline/inputs/kafka.md)
-  * [Kernel Logs](pipeline/inputs/kernel-logs.md)
-  * [Kubernetes Events](pipeline/inputs/kubernetes-events.md)
-  * [Memory Metrics](pipeline/inputs/memory-metrics.md)
+  * [Kernel logs](pipeline/inputs/kernel-logs.md)
+  * [Kubernetes events](pipeline/inputs/kubernetes-events.md)
+  * [Memory metrics](pipeline/inputs/memory-metrics.md)
   * [MQTT](pipeline/inputs/mqtt.md)
-  * [Network I/O Log Based Metrics](pipeline/inputs/network-io-metrics.md)
-  * [NGINX Exporter Metrics](pipeline/inputs/nginx.md)
-  * [Node Exporter Metrics](pipeline/inputs/node-exporter-metrics.md)
-  * [Podman Metrics](pipeline/inputs/podman-metrics.md)
-  * [Process Log Based Metrics](pipeline/inputs/process.md)
-  * [Process Exporter Metrics](pipeline/inputs/process-exporter-metrics.md)
-  * [Prometheus Scrape Metrics](pipeline/inputs/prometheus-scrape-metrics.md)
-  * [Prometheus Remote Write](pipeline/inputs/prometheus-remote-write.md)
+  * [Network I/O metrics](pipeline/inputs/network-io-metrics.md)
+  * [NGINX exporter metrics](pipeline/inputs/nginx.md)
+  * [Node exporter metrics](pipeline/inputs/node-exporter-metrics.md)
+  * [OpenTelemetry](pipeline/inputs/opentelemetry.md)
+  * [Podman metrics](pipeline/inputs/podman-metrics.md)
+  * [Process exporter metrics](pipeline/inputs/process-exporter-metrics.md)
+  * [Process metrics](pipeline/inputs/process.md)
+  * [Prometheus remote write](pipeline/inputs/prometheus-remote-write.md)
+  * [Prometheus scrape Metrics](pipeline/inputs/prometheus-scrape-metrics.md)
+  * [Prometheus text file](pipeline/inputs/prometheus-textfile.md)
   * [Random](pipeline/inputs/random.md)
-  * [Serial Interface](pipeline/inputs/serial-interface.md)
+  * [Serial interface](pipeline/inputs/serial-interface.md)
   * [Splunk](pipeline/inputs/splunk.md)
-  * [Standard Input](pipeline/inputs/standard-input.md)
+  * [Standard input](pipeline/inputs/standard-input.md)
   * [StatsD](pipeline/inputs/statsd.md)
   * [Syslog](pipeline/inputs/syslog.md)
   * [Systemd](pipeline/inputs/systemd.md)
@@ -118,105 +133,111 @@
   * [TCP](pipeline/inputs/tcp.md)
   * [Thermal](pipeline/inputs/thermal.md)
   * [UDP](pipeline/inputs/udp.md)
-  * [OpenTelemetry](pipeline/inputs/opentelemetry.md)
-  * [Windows Event Log](pipeline/inputs/windows-event-log.md)
-  * [Windows Event Log (winevtlog)](pipeline/inputs/windows-event-log-winevtlog.md)
-  * [Windows Exporter Metrics](pipeline/inputs/windows-exporter-metrics.md)
+  * [Windows Event logs (winevtlog)](pipeline/inputs/windows-event-log-winevtlog.md)
+  * [Windows Event logs (winlog)](pipeline/inputs/windows-event-log.md)
+  * [Windows exporter metrics](pipeline/inputs/windows-exporter-metrics.md)
 * [Parsers](pipeline/parsers/README.md)
-  * [Configuring Parser](pipeline/parsers/configuring-parser.md)
+  * [Configuring parsers](pipeline/parsers/configuring-parser.md)
   * [JSON](pipeline/parsers/json.md)
-  * [Regular Expression](pipeline/parsers/regular-expression.md)
+  * [Regular expression](pipeline/parsers/regular-expression.md)
   * [LTSV](pipeline/parsers/ltsv.md)
   * [Logfmt](pipeline/parsers/logfmt.md)
   * [Decoders](pipeline/parsers/decoders.md)
 * [Processors](pipeline/processors/README.md)
-  * [Content Modifier](pipeline/processors/content-modifier.md)
-  * [Metrics Selector](pipeline/processors/metrics-selector.md)
+  * [Content modifier](pipeline/processors/content-modifier.md)
+  * [Labels](pipeline/processors/labels.md)
+  * [Metrics selector](pipeline/processors/metrics-selector.md)
+  * [OpenTelemetry envelope](pipeline/processors/opentelemetry-envelope.md)
+  * [Sampling](pipeline/processors/sampling.md)
   * [SQL](pipeline/processors/sql.md)
+  * [Filters as processors](pipeline/processors/filters.md)
+  * [Conditional processing](pipeline/processors/conditional-processing.md)
 * [Filters](pipeline/filters/README.md)
-  * [AWS Metadata](pipeline/filters/aws-metadata.md)
+  * [AWS metadata](pipeline/filters/aws-metadata.md)
   * [CheckList](pipeline/filters/checklist.md)
-  * [ECS Metadata](pipeline/filters/ecs-metadata.md)
+  * [ECS metadata](pipeline/filters/ecs-metadata.md)
   * [Expect](pipeline/filters/expect.md)
-  * [GeoIP2 Filter](pipeline/filters/geoip2-filter.md)
+  * [GeoIP2 filter](pipeline/filters/geoip2-filter.md)
   * [Grep](pipeline/filters/grep.md)
   * [Kubernetes](pipeline/filters/kubernetes.md)
-  * [Log to Metrics](pipeline/filters/log_to_metrics.md)
+  * [Logs to metrics](pipeline/filters/log_to_metrics.md)
   * [Lua](pipeline/filters/lua.md)
-  * [Parser](pipeline/filters/parser.md)
-  * [Record Modifier](pipeline/filters/record-modifier.md)
   * [Modify](pipeline/filters/modify.md)
   * [Multiline](pipeline/filters/multiline-stacktrace.md)
   * [Nest](pipeline/filters/nest.md)
   * [Nightfall](pipeline/filters/nightfall.md)
-  * [Rewrite Tag](pipeline/filters/rewrite-tag.md)
-  * [Standard Output](pipeline/filters/standard-output.md)
+  * [Parser](pipeline/filters/parser.md)
+  * [Record modifier](pipeline/filters/record-modifier.md)
+  * [Rewrite tag](pipeline/filters/rewrite-tag.md)
+  * [Standard output](pipeline/filters/standard-output.md)
   * [Sysinfo](pipeline/filters/sysinfo.md)
-  * [Throttle](pipeline/filters/throttle.md)
-  * [Type Converter](pipeline/filters/type-converter.md)
   * [Tensorflow](pipeline/filters/tensorflow.md)
+  * [Throttle](pipeline/filters/throttle.md)
+  * [Type converter](pipeline/filters/type-converter.md)
   * [Wasm](pipeline/filters/wasm.md)
 * [Outputs](pipeline/outputs/README.md)
   * [Amazon CloudWatch](pipeline/outputs/cloudwatch.md)
   * [Amazon Kinesis Data Firehose](pipeline/outputs/firehose.md)
   * [Amazon Kinesis Data Streams](pipeline/outputs/kinesis.md)
   * [Amazon S3](pipeline/outputs/s3.md)
-  * [Azure Blob](pipeline/outputs/azure\_blob.md)
-  * [Azure Data Explorer](pipeline/outputs/azure\_kusto.md)
+  * [Apache SkyWalking](pipeline/outputs/skywalking.md)
+  * [Azure Blob](pipeline/outputs/azure_blob.md)
+  * [Azure Data Explorer](pipeline/outputs/azure_kusto.md)
   * [Azure Log Analytics](pipeline/outputs/azure.md)
   * [Azure Logs Ingestion API](pipeline/outputs/azure_logs_ingestion.md)
   * [Counter](pipeline/outputs/counter.md)
+  * [Dash0](pipeline/outputs/dash0.md)
   * [Datadog](pipeline/outputs/datadog.md)
+  * [Dynatrace](pipeline/outputs/dynatrace.md)
   * [Elasticsearch](pipeline/outputs/elasticsearch.md)
   * [File](pipeline/outputs/file.md)
-  * [FlowCounter](pipeline/outputs/flowcounter.md)
+  * [Flow counter](pipeline/outputs/flowcounter.md)
   * [Forward](pipeline/outputs/forward.md)
-  * [GELF](pipeline/outputs/gelf.md)
+  * [Graylog Extended Log Format (GELF)](pipeline/outputs/gelf.md)
   * [Google Chronicle](pipeline/outputs/chronicle.md)
   * [Google Cloud BigQuery](pipeline/outputs/bigquery.md)
   * [HTTP](pipeline/outputs/http.md)
   * [InfluxDB](pipeline/outputs/influxdb.md)
-  * [Kafka](pipeline/outputs/kafka.md)
+  * [Kafka Producer](pipeline/outputs/kafka.md)
   * [Kafka REST Proxy](pipeline/outputs/kafka-rest-proxy.md)
   * [LogDNA](pipeline/outputs/logdna.md)
   * [Loki](pipeline/outputs/loki.md)
-  * [Microsoft Fabric](pipeline/outputs/azure\_kusto.md)
   * [NATS](pipeline/outputs/nats.md)
   * [New Relic](pipeline/outputs/new-relic.md)
-  * [NULL](pipeline/outputs/null.md)
+  * [Null](pipeline/outputs/null.md)
   * [Observe](pipeline/outputs/observe.md)
-  * [Oracle Log Analytics](pipeline/outputs/oci-logging-analytics.md)
+  * [OpenObserve](pipeline/outputs/openobserve.md)
   * [OpenSearch](pipeline/outputs/opensearch.md)
   * [OpenTelemetry](pipeline/outputs/opentelemetry.md)
+  * [Oracle Cloud Infrastructure Logging Analytics](pipeline/outputs/oci-logging-analytics.md)
   * [PostgreSQL](pipeline/outputs/postgresql.md)
-  * [Prometheus Exporter](pipeline/outputs/prometheus-exporter.md)
-  * [Prometheus Remote Write](pipeline/outputs/prometheus-remote-write.md)
-  * [SkyWalking](pipeline/outputs/skywalking.md)
+  * [Prometheus exporter](pipeline/outputs/prometheus-exporter.md)
+  * [Prometheus remote write](pipeline/outputs/prometheus-remote-write.md)
   * [Slack](pipeline/outputs/slack.md)
   * [Splunk](pipeline/outputs/splunk.md)
   * [Stackdriver](pipeline/outputs/stackdriver.md)
-  * [Standard Output](pipeline/outputs/standard-output.md)
+  * [Standard output](pipeline/outputs/standard-output.md)
   * [Syslog](pipeline/outputs/syslog.md)
-  * [TCP & TLS](pipeline/outputs/tcp-and-tls.md)
+  * [TCP and TLS](pipeline/outputs/tcp-and-tls.md)
   * [Treasure Data](pipeline/outputs/treasure-data.md)
   * [Vivo Exporter](pipeline/outputs/vivo-exporter.md)
   * [WebSocket](pipeline/outputs/websocket.md)
 
-## Stream Processing
+## Stream processing
 
-* [Introduction to Stream Processing](stream-processing/introduction.md)
+* [Introduction to stream processing](stream-processing/introduction.md)
 * [Overview](stream-processing/overview.md)
 * [Changelog](stream-processing/changelog.md)
-* [Getting Started](stream-processing/getting-started/README.md)
-  * [Fluent Bit + SQL](stream-processing/getting-started/fluent-bit-sql.md)
-  * [Check Keys and NULL values](stream-processing/getting-started/check-keys-null-values.md)
-  * [Hands On! 101](stream-processing/getting-started/hands-on.md)
-
-## Fluent Bit for Developers <a href="#development" id="development"></a>
-
-* [C Library API](development/library\_api.md)
-* [Ingest Records Manually](development/ingest-records-manually.md)
-* [Golang Output Plugins](development/golang-output-plugins.md)
-* [WASM Filter Plugins](development/wasm-filter-plugins.md)
-* [WASM Input Plugins](development/wasm-input-plugins.md)
-* [Developer guide for beginners on contributing to Fluent Bit](development/developer-guide.md)
+* [Get started](stream-processing/getting-started/README.md)
+  * [Fluent Bit and SQL](stream-processing/getting-started/fluent-bit-sql.md)
+  * [Check keys and null values](stream-processing/getting-started/check-keys-null-values.md)
+  * [Tutorial](stream-processing/getting-started/hands-on.md)
+
+## Fluent Bit for developers
+
+* [C library API](development/library_api.md)
+* [Ingest records manually](development/ingest-records-manually.md)
+* [Golang output plugins](development/golang-output-plugins.md)
+* [Wasm filter plugins](development/wasm-filter-plugins.md)
+* [Wasm input plugins](development/wasm-input-plugins.md)
+* [Contribution guide for beginners](development/developer-guide.md)
diff --git a/about/fluentd-and-fluent-bit.md b/about/fluentd-and-fluent-bit.md
index f73a9c84d..388e23d03 100644
--- a/about/fluentd-and-fluent-bit.md
+++ b/about/fluentd-and-fluent-bit.md
@@ -1,33 +1,33 @@
 ---
-description: The Production Grade Telemetry Ecosystem
+description: The production grade telemetry ecosystem
 ---
 
-# Fluentd & Fluent Bit
+# Fluentd and Fluent Bit
 
-Telemetry data processing in general can be complex, and at scale a bit more, that's why [Fluentd](https://www.fluentd.org) was born. Fluentd has become more than a simple tool, it has grown into a fullscale ecosystem that contains SDKs for different languages and sub-projects like [Fluent Bit](https://fluentbit.io).
+Telemetry data processing can be complex, especially at scale. That's why [Fluentd](https://www.fluentd.org) was created. Fluentd is more than a basic tool. It's grown into a full-scale ecosystem that contains SDKs for different languages and sub-projects, like [Fluent Bit](https://fluentbit.io).
 
-On this page, we will describe the relationship between the [Fluentd](http://fluentd.org) and [Fluent Bit](http://fluentbit.io) open source projects, as a summary we can say both are:
+The Fluentd and Fluent Bit projects are both:
 
-* Licensed under the terms of Apache License v2.0
-* **Graduated** Hosted projects by the [Cloud Native Computing Foundation (CNCF)](https://cncf.io)
-* Production Grade solutions: deployed **million** of times every single day.
-* **Vendor neutral** and community driven projects
-* Widely Adopted by the Industry: trusted by all major companies like AWS, Microsoft, Google Cloud and hundreds of others.
+- Licensed under the terms of Apache License v2.0.
+- Graduated hosted projects by the [Cloud Native Computing Foundation (CNCF)](https://cncf.io).
+- Production-grade solutions, that are deployed millions of times every single day.
+- Vendor neutral and community driven.
+- Widely adopted by the industry, being trusted by major companies like Amazon, Microsoft, Google, and hundreds of others.
 
-Both projects share a lot of similarities, [Fluent Bit](https://fluentbit.io) is fully designed and built on top of the best ideas of [Fluentd](https://www.fluentd.org) architecture and general design. Choosing which one to use depends on the end-user needs.
+The projects have many similarities: [Fluent Bit](https://fluentbit.io) is designed and built on top of the best ideas of [Fluentd](https://www.fluentd.org) architecture and general design. Which one you choose depends on your end-users' needs.
 
 The following table describes a comparison of different areas of the projects:
 
-|              | Fluentd                                                           | Fluent Bit                                                        |
-| ------------ | ----------------------------------------------------------------- | ----------------------------------------------------------------- |
-| Scope        | Containers / Servers                                              | Embedded Linux / Containers / Servers                             |
-| Language     | C & Ruby                                                          | C                                                                 |
-| Memory       |  > 60MB                                                           | \~1MB                                                             |
-| Performance  | Medium Performance                                                | High Performance                                                  |
-| Dependencies | Built as a Ruby Gem, it requires a certain number of gems.        | Zero dependencies, unless some special plugin requires them.      |
-| Plugins      | More than 1000 external plugins are available                     | More than 100 built-in plugins are available                      |
+|  Attribute   | Fluentd               | Fluent Bit            |
+| ------------ | --------------------- | --------------------- |
+| Scope        | Containers / Servers  | Embedded Linux / Containers / Servers |
+| Language     | C and Ruby            | C                                     |
+| Memory       | Greater than 60&nbsp;MB | Approximately 1&nbsp;MB |
+| Performance  | Medium Performance    | High Performance                      |
+| Dependencies | Built as a Ruby Gem, depends on other gems. | Zero dependencies, unless required by a plugin. |
+| Plugins      | Over 1,000 external plugins available. | Over 100 built-in plugins available. |
 | License      | [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0) | [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0) |
 
-Both [Fluentd](https://www.fluentd.org) and [Fluent Bit](https://fluentbit.io) can work as Aggregators or Forwarders, they both can complement each other or use them as standalone solutions.\
-\
-In the recent years, Cloud Providers switched from Fluentd to Fluent Bit for performance and compatibility reasons. Fluent Bit is now considered the **next generation** solution.
+Both [Fluentd](https://www.fluentd.org) and [Fluent Bit](https://fluentbit.io) can work as Aggregators or Forwarders, and can complement each other or be used as standalone solutions.
+
+In the recent years, cloud providers have switched from Fluentd to Fluent Bit for performance and compatibility. Fluent Bit is now considered the next-generation solution.
diff --git a/about/history.md b/about/history.md
index 780aa3ccc..5b8cd6b99 100644
--- a/about/history.md
+++ b/about/history.md
@@ -1,10 +1,10 @@
 ---
+title: A brief history of Fluent Bit
 description: Every project has a story
 ---
 
-# A Brief History of Fluent Bit
+# A brief history of Fluent Bit
 
-On 2014, the [Fluentd](https://www.fluentd.org/) team at [Treasure Data](https://www.treasuredata.com/) was forecasting the need for a lightweight log processor for constraint environments like Embedded Linux and Gateways, the project aimed to be part of the Fluentd Ecosystem; at that moment, Eduardo created [Fluent Bit](https://fluentbit.io/), a new open source solution written from scratch available under the terms of the [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0).\
+In 2014, the [Fluentd](https://www.fluentd.org/) team at [Treasure Data](https://www.treasuredata.com/) was forecasting the need for a lightweight log processor for constraint environments like embedded Linux and gateways. The project aimed to be part of the Fluentd ecosystem. At that moment, Eduardo Silva created [Fluent Bit](https://fluentbit.io/), a new open source solution, written from scratch and available under the terms of the [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0).
 
-
-After the project was around for some time, it got more traction for normal Linux systems, also with the new containerized world, the Cloud Native community asked to extend the project scope to support more sources, filters, and destinations. Not so long after, Fluent Bit became one of the preferred solutions to solve the logging challenges in Cloud environments.
+After the project matured, it gained traction for normal Linux systems. With the new containerized world, the Cloud Native community asked to extend the project scope to support more sources, filters, and destinations. Not long after, Fluent Bit became one of the preferred solutions to solve the logging challenges in Cloud environments.
diff --git a/about/license.md b/about/license.md
index 44bb3506e..3737a1e4a 100644
--- a/about/license.md
+++ b/about/license.md
@@ -1,10 +1,11 @@
 ---
-description: Strong Commitment to the Openness and Collaboration
+title: License
+description: Fluent Bit license description
 ---
 
 # License
 
-[Fluent Bit](http://fluentbit.io), including its core, plugins and tools are distributed under the terms of the [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0):
+[Fluent Bit](http://fluentbit.io), including its core, plugins, and tools are distributed under the terms of the [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0):
 
 ```text
                                  Apache License
@@ -184,4 +185,3 @@ description: Strong Commitment to the Openness and Collaboration
 
    END OF TERMS AND CONDITIONS
 ```
-
diff --git a/about/sandbox-and-lab-resources.md b/about/sandbox-and-lab-resources.md
new file mode 100644
index 000000000..d437633dd
--- /dev/null
+++ b/about/sandbox-and-lab-resources.md
@@ -0,0 +1,41 @@
+---
+description: An overview of free public resources for sandbox and labs for learning how to best operate, use, and have success with Fluent Bit.
+---
+
+# Sandbox and lab resources
+
+## Fluent Bit sandbox - sign-up required
+
+The following are labs that can run in your browser however require email sign-up
+
+<div data-full-width="true"><figure><img src="../.gitbook/assets/image (1).png" alt=""><figcaption></figcaption></figure></div>
+
+- [Fluent Bit 101 Sandbox - Getting Started with configuration and routing](https://play.instruqt.com/Fluent/invite/nuys5ifhsprt)
+
+## Open Source labs - environment required
+
+The following are open source labs where you will need to spin up resources to run through the lab in details
+
+### O11y workshops by Chronosphere
+
+Chronosphere provides several [open source observability workshops](https://o11y-workshops.gitlab.io/). The OSS repository can be found here: [https://gitlab.com/o11y-workshops/workshop-fluentbit](https://gitlab.com/o11y-workshops/workshop-fluentbit)
+
+The following cards include links to each of the labs in the workshop:
+
+{% embed url="https://o11y-workshops.gitlab.io/workshop-fluentbit/" %}
+Fluent Bit Workshop for Getting Started with Cloud Native Telemetry Pipelines
+{% endembed %}
+
+1. [Lab 1 - Introduction to Fluent Bit](https://o11y-workshops.gitlab.io/workshop-fluentbit/lab01.html)
+2. [Lab 2 - Installing Fluent Bit](https://o11y-workshops.gitlab.io/workshop-fluentbit/#/4)
+3. [Lab 3 - Exploring First Pipelines](https://o11y-workshops.gitlab.io/workshop-fluentbit/#/5)
+4. [Lab 4 - Exploring More Pipelines](https://o11y-workshops.gitlab.io/workshop-fluentbit/#/6)
+5. [Lab 5 - Understanding Backpressure](https://o11y-workshops.gitlab.io/workshop-fluentbit/#/7)
+6. [Lab 6 - Avoid Telemetry Data Loss](https://o11y-workshops.gitlab.io/workshop-fluentbit/#/8)
+7. [Lab 7 - Pipeline Integration with OpenTelemetry](https://o11y-workshops.gitlab.io/workshop-fluentbit/#/9)
+
+### Logging with Fluent Bit and Amazon OpenSearch workshop by Amazon
+
+This workshop by Amazon goes through common Kubernetes logging patterns and routing data to OpenSearch and visualizing with OpenSearch dashboards
+
+{% embed url="https://eksworkshop.com/" %}
diff --git a/about/what-is-fluent-bit.md b/about/what-is-fluent-bit.md
index afb7d5aeb..9db593a79 100644
--- a/about/what-is-fluent-bit.md
+++ b/about/what-is-fluent-bit.md
@@ -4,14 +4,11 @@ description: Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
 
 # What is Fluent Bit?
 
+[Fluent Bit](https://fluentbit.io) is an open source telemetry agent specifically designed to efficiently handle the challenges of collecting and processing telemetry data across a wide range of environments, from constrained systems to complex cloud infrastructures. Managing telemetry data from various sources and formats can be a constant challenge, particularly when performance is a critical factor.
 
-
-[Fluent Bit](https://fluentbit.io) is an open-source telemetry agent specifically designed to efficiently handle the challenges of collecting and processing telemetry data across a wide range of environments, from constrained systems to complex cloud infrastructures. Managing telemetry data from various sources and formats can be a constant challenge, particularly when performance is a critical factor.
-
-Rather than serving as a drop-in replacement, Fluent Bit enhances the observability strategy for your infrastructure by adapting and optimizing your existing logging layer, as well as metrics and traces processing. Furthermore, Fluent Bit supports a vendor-neutral approach, seamlessly integrating with other ecosystems such as Prometheus and OpenTelemetry. Trusted by major cloud providers, banks, and companies in need of a ready-to-use telemetry agent solution, Fluent Bit effectively manages diverse data sources and formats while maintaining optimal performance.
+Rather than serving as a drop-in replacement, Fluent Bit enhances the observability strategy for your infrastructure by adapting and optimizing your existing logging layer, and adding metrics and traces processing. Fluent Bit supports a vendor-neutral approach, seamlessly integrating with other ecosystems such as Prometheus and OpenTelemetry. Trusted by major cloud providers, banks, and companies in need of a ready-to-use telemetry agent solution, Fluent Bit effectively manages diverse data sources and formats while maintaining optimal performance and keeping resource consumption low.
 
 Fluent Bit can be deployed as an edge agent for localized telemetry data handling or utilized as a central aggregator/collector for managing telemetry data across multiple sources and environments.
 
-[Fluent Bit](https://fluentbit.io) has been designed with performance and low resource consumption in mind.
 
 {% embed url="https://www.youtube.com/watch?v=3ELc1helke4" %}
diff --git a/administration/aws-credentials.md b/administration/aws-credentials.md
index c59b48445..9ab87f568 100644
--- a/administration/aws-credentials.md
+++ b/administration/aws-credentials.md
@@ -1,39 +1,44 @@
-# AWS Credentials
+# AWS credentials
 
-Plugins that interact with AWS services will fetch credentials from various providers in the following order.
-Only the first provider that is able to provide credentials will be used.
+Plugins that interact with AWS services fetch credentials from the following providers in order. Only the first provider that provides credentials is used.
 
-All AWS plugins additionally support a `role_arn` (or `AWS_ROLE_ARN`, for [Elasticsearch](../pipeline/outputs/elasticsearch.md)) configuration parameter. If specified, the fetched credentials will then be used to assume the given role.
+- [Environment variables](#environment-variables)
+- [Shared configuration and credentials files](#shared-configuration-and-credentials-files)
+- [EKS Web Identity Token (OIDC)](#eks-web-identity-token-oidc)
+- [ECS HTTP credentials endpoint](#ecs-http-credentials-endpoint)
+- [EC2 Instance Profile Credentials (IMDS)](#ec2-instance-profile-credentials-imds)
 
-## 1. Environment Variables
+All AWS plugins additionally support a `role_arn` (or `AWS_ROLE_ARN`, for [Elasticsearch](../pipeline/outputs/elasticsearch.md)) configuration parameter. If specified, the fetched credentials are used to assume the given role.
 
-Uses the `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` (and optionally `AWS_SESSION_TOKEN`) environment variables if set.
+## Environment variables
 
-## 2. Shared Configuration and Credentials Files
+Plugins use the `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` (and optionally `AWS_SESSION_TOKEN`) environment variables if set.
 
-Reads the shared config file at `$AWS_CONFIG_FILE` (or `$HOME/.aws/config`) and the shared credentials file at `$AWS_SHARED_CREDENTIALS_FILE` (or `$HOME/.aws/credentials`) to fetch the credentials for the profile named `$AWS_PROFILE` or `$AWS_DEFAULT_PROFILE` (or "default"). See https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html.
+## Shared configuration and credentials files
 
-The shared settings will be evaluated in the following order.
+Plugins read the shared `config` file at `$AWS_CONFIG_FILE` (or `$HOME/.aws/config`), and the shared credentials file at `$AWS_SHARED_CREDENTIALS_FILE` (or `$HOME/.aws/credentials`)  to fetch the credentials for the profile named `$AWS_PROFILE` or `$AWS_DEFAULT_PROFILE` (or "default"). See [Configuration and credential file settings in the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html).
 
-Setting|File|Description
----|---|---
-`credential_process`|config| See https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sourcing-external.html.<br/>Supported on Linux only.
-`aws_access_key_id`<br/>`aws_secret_access_key`<br/>*`aws_session_token`*|credentials|Access key ID and secret key to use to authenticate.<br/>The session token must be set for temporary credentials.
+The shared settings evaluate in the following order:
 
-At this time, no other settings are supported.
+| Setting | File | Description |
+|---|---|---|
+| `credential_process` | `config` | Linux only. See [Sourcing credentials with an external process in the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sourcing-external.html). |
+| `aws_access_key_id`, `aws_secret_access_key`, `aws_session_token` | `credentials` | Access key ID and secret key to use to authenticate. The session token must be set for temporary credentials. |
 
-## 3. EKS Web Identity Token (OIDC)
+No other settings are supported.
 
-Fetches credentials via a signed web identity token for a Kubernetes service account.
-See https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html.
+## EKS web identity token (OIDC)
 
-## 4. ECS HTTP Credentials Endpoint
+Credentials are fetched using a signed web identity token for a Kubernetes service account. See [IAM roles for service accounts](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html).
 
-Fetches credentials for the ECS task's role.
-See https://docs.aws.amazon.com/AmazonECS/latest/userguide/task-iam-roles.html.
+## ECS HTTP credentials endpoint
 
-## 5. EC2 Instance Profile Credentials (IMDS)
+Credentials are fetched for the ECS task's role. See [Amazon ECS task IAM role](https://docs.aws.amazon.com/AmazonECS/latest/userguide/task-iam-roles.html).
 
-Fetches credentials for the EC2 instance profile's role.
-See https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html.
-As of Fluent Bit version 1.8.8, IMDSv2 is used by default and IMDSv1 may be disabled. Prior versions of Fluent Bit require enabling IMDSv1 on EC2.
\ No newline at end of file
+## EKS Pod Identity credentials
+
+Credentials are fetched using  a pod identity endpoint. See [Learn how EKS Pod Identity grants pods access to AWS services](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html).
+
+## EC2 instance profile credentials (IMDS)
+
+Fetches credentials for the EC2 instance profile's role. See [IAM roles for Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html). As of Fluent Bit version 1.8.8, IMDSv2 is used by default and IMDSv1 might be disabled. Prior versions of Fluent Bit require enabling IMDSv1 on EC2.
diff --git a/administration/backpressure.md b/administration/backpressure.md
index e8f3f9b5c..5e9308a02 100644
--- a/administration/backpressure.md
+++ b/administration/backpressure.md
@@ -1,67 +1,71 @@
 # Backpressure
 
-Under certain scenarios it is possible for logs or data to be ingested or created faster than the ability to flush it to some destinations. One such common scenario is when reading from big log files, especially with a large backlog, and dispatching the logs to a backend over the network, which takes time to respond. This generates backpressure leading to high memory consumption in the service.
+It's possible for logs or data to be ingested or created faster than the ability to flush it to some destinations. A common scenario is when reading from big log files, especially with a large backlog, and dispatching the logs to a backend over the network, which takes time to respond. This generates _backpressure_, leading to high memory consumption in the service.
 
-In order to avoid backpressure, Fluent Bit implements a mechanism in the engine that restricts the amount of data that an input plugin can ingest, this is done through the configuration parameters **Mem\_Buf\_Limit** and **storage.Max\_Chunks\_Up**.
+To avoid backpressure, Fluent Bit implements a mechanism in the engine that restricts the amount of data an input plugin can ingest. Restriction is done through the configuration parameters `Mem_Buf_Limit` and `storage.Max_Chunks_Up`.
 
-As described in the [Buffering](../concepts/buffering.md) concepts section, Fluent Bit offers two modes for data handling: in-memory only (default) and in-memory + filesystem \(optional\).
+As described in the [Buffering](../concepts/buffering.md) concepts section, Fluent Bit offers two modes for data handling: in-memory only (default) and in-memory and filesystem (optional).
 
-The default `storage.type memory` buffer can be restricted with **Mem\_Buf\_Limit**. If memory reaches this limit and you reach a backpressure scenario, you will not be able to ingest more data until the data chunks that are in memory can be flushed. The input will be paused and Fluent Bit will [emit](https://github.com/fluent/fluent-bit/blob/v2.0.0/src/flb_input_chunk.c#L1334) a `[warn] [input] {input name or alias} paused (mem buf overlimit)` log message. Depending on the input plugin in use, this might lead to discard incoming data \(e.g: TCP input plugin\). The tail plugin can handle pause without data loss; it will store its current file offset and resume reading later. When buffer memory is available, the input will resume collecting/accepting logs and Fluent Bit will [emit](https://github.com/fluent/fluent-bit/blob/v2.0.0/src/flb_input_chunk.c#L1277) a `[info] [input] {input name or alias} resume (mem buf overlimit)` message. 
+The default `storage.type memory` buffer can be restricted with `Mem_Buf_Limit`. If memory reaches this limit and you reach a backpressure scenario, you won't be able to ingest more data until the data chunks that are in memory can be flushed. The input pauses and Fluent Bit [emits](https://github.com/fluent/fluent-bit/blob/v2.0.0/src/flb_input_chunk.c#L1334) a `[warn] [input] {input name or alias} paused (mem buf overlimit)` log message.
 
-This risk of data loss can be mitigated by configuring secondary storage on the filesystem using the `storage.type` of `filesystem` \(as described in [Buffering & Storage](buffering-and-storage.md)\). Initially, logs will be buffered to *both* memory and filesystem. When the `storage.max_chunks_up` limit is reached, all the new data will be stored safely only in the filesystem. Fluent Bit will stop enqueueing new data in memory and will only buffer to the filesystem. Please note that when `storage.type filesystem` is set, the `Mem_Buf_Limit` setting no longer has any effect, instead, the `[SERVICE]` level `storage.max_chunks_up` setting controls the size of the memory buffer. 
+Depending on the input plugin in use, this might cause incoming data to be discarded (for example, TCP input plugin). The tail plugin can handle pauses without data loss, storing its current file offset and resuming reading later. When buffer memory is available, the input resumes accepting logs. Fluent Bit [emits](https://github.com/fluent/fluent-bit/blob/v2.0.0/src/flb_input_chunk.c#L1277) a `[info] [input] {input name or alias} resume (mem buf overlimit)` message.
 
-## Mem\_Buf\_Limit
+Mitigate the risk of data loss by configuring secondary storage on the filesystem using the `storage.type` of `filesystem` (as described in [Buffering and Storage](buffering-and-storage.md)). Initially, logs will be buffered to both memory and the filesystem. When the `storage.max_chunks_up` limit is reached, all new data will be stored in the filesystem. Fluent Bit stops queueing new data in memory and buffers only to the filesystem. When `storage.type filesystem` is set, the `Mem_Buf_Limit` setting no longer has any effect. Instead, the `[SERVICE]` level `storage.max_chunks_up` setting controls the size of the memory buffer.
 
-This option is disabled by default and can be applied to all input plugins. Please note that `Mem_Buf_Limit` only applies with the default `storage.type memory`. Let's explain its behavior using the following scenario:
+## `Mem_Buf_Limit`
 
-* Mem\_Buf\_Limit is set to 1MB \(one megabyte\)
-* input plugin tries to append 700KB
-* engine route the data to an output plugin
-* output plugin backend \(HTTP Server\) is down
-* engine scheduler will retry the flush after 10 seconds
-* input plugin tries to append 500KB
+`Mem_Buf_Limit` applies only with the default `storage.type memory`. This option is disabled by default and can be applied to all input plugins.
 
-At this exact point, the engine will **allow** appending those 500KB of data into the memory; in total it will have 1.2MB of data buffered. The limit is permissive and will allow a single write past the limit, but once the limit is **exceeded** the following actions are taken:
+As an example situation:
 
-* block local buffers for the input plugin \(cannot append more data\)
-* notify the input plugin invoking a **pause** callback
+- `Mem_Buf_Limit` is set to `1MB`.
+- The input plugin tries to append 700&nbsp;KB.
+- The engine routes the data to an output plugin.
+- The output plugin backend (HTTP Server) is down.
+- Engine scheduler retries the flush after 10 seconds.
+- The input plugin tries to append 500&nbsp;KB.
 
-The engine will protect itself and will not append more data coming from the input plugin in question; note that it is the responsibility of the plugin to keep state and decide what to do in that _paused_ state.
+In this situation, the engine allows appending those 500&nbsp;KB of data into the memory, with a total of 1.2&nbsp;MB of data buffered. The limit is permissive and will allow a single write past the limit. When the limit is exceeded, the following actions are taken:
 
-After some time, usually measured in seconds, if the scheduler was able to flush the initial 700KB of data or it has given up after retrying, that amount of memory is released and the following actions will occur:
+- Block local buffers for the input plugin (can't append more data).
+- Notify the input plugin, invoking a `pause` callback.
 
-* Upon data buffer release \(700KB\), the internal counters get updated
-* Counters now are set at 500KB
-* Since 500KB is &lt; 1MB it checks the input plugin state
-* If the plugin is paused, it invokes a **resume** callback
-* input plugin can continue appending more data
+The engine protects itself and won't append more data coming from the input plugin in question. It's the responsibility of the plugin to keep state and decide what to do in a `paused` state.
 
-## storage.max\_chunks\_up
+In a few seconds, if the scheduler was able to flush the initial 700&nbsp;KB of data or it has given up after retrying, that amount of memory is released and the following actions occur:
 
-Please note that when `storage.type filesystem` is set, the `Mem_Buf_Limit` setting no longer has any effect, instead, the `[SERVICE]` level `storage.max_chunks_up` setting controls the size of the memory buffer. 
+- Upon data buffer release (700&nbsp;KB), the internal counters get updated.
+- Counters now are set at 500&nbsp;KB.
+- Because 500&nbsp;KB is less than 1&nbsp;MB, it checks the input plugin state.
+- If the plugin is paused, it invokes a `resume` callback.
+- The input plugin can continue appending more data.
 
-The setting behaves similarly to the above scenario with `Mem_Buf_Limit` when the non-default `storage.pause_on_chunks_overlimit` is enabled. 
+## `storage.max_chunks_up`
 
-When (default) `storage.pause_on_chunks_overlimit` is disabled, the input will not pause when the memory limit is reached. Instead, it will switch to only buffering logs in the filesystem. The disk spaced used for filesystem buffering can be limited with `storage.total_limit_size`.
+The `[SERVICE]` level `storage.max_chunks_up` setting controls the size of the memory buffer. When `storage.type filesystem` is set, the `Mem_Buf_Limit` setting no longer has an effect.
 
-See the [Buffering & Storage](buffering-and-storage.md) docs for more information.
+The setting behaves similar to the `Mem_Buf_Limit` scenario when the non-default `storage.pause_on_chunks_overlimit` is enabled.
 
-## About pause and resume Callbacks
+When (default) `storage.pause_on_chunks_overlimit` is disabled, the input won't pause when the memory limit is reached. Instead, it switches to buffering logs only in the filesystem. Limit the disk spaced used for filesystem buffering with `storage.total_limit_size`.
 
-Each plugin is independent and not all of them implements the **pause** and **resume** callbacks. As said, these callbacks are just a notification mechanism for the plugin.
+See [Buffering and Storage](buffering-and-storage.md) docs for more information.
 
-One example of a plugin that implements these callbacks and keeps state correctly is the [Tail Input](../pipeline/inputs/tail.md) plugin. When the **pause** callback is triggered, it pauses its collectors and stops appending data. Upon **resume**, it resumes the collectors and continues ingesting data. Tail will track the current file offset when it pauses and resume at the same position. If the file has not been deleted or moved, it can still be read.
+## About pause and resume callbacks
 
-With the default `storage.type memory` and `Mem_Buf_Limit`, the following log messages will be emitted for pause and resume:
+Each plugin is independent and not all of them implement `pause` and `resume` callbacks. These callbacks are a notification mechanism for the plugin.
 
-```
+One example of a plugin that implements these callbacks and keeps state correctly is the [Tail Input](../pipeline/inputs/tail.md) plugin. When the `pause` callback triggers, it pauses its collectors and stops appending data. Upon `resume`, it resumes the collectors and continues ingesting data. Tail tracks the current file offset when it pauses, and resumes at the same position. If the file hasn't been deleted or moved, it can still be read.
+
+With the default `storage.type memory` and `Mem_Buf_Limit`, the following log messages emit for `pause` and `resume`:
+
+```text
 [warn] [input] {input name or alias} paused (mem buf overlimit)
 [info] [input] {input name or alias} resume (mem buf overlimit)
 ```
 
-With `storage.type filesystem` and `storage.max_chunks_up`, the following log messages will be emitted for pause and resume:
+With `storage.type filesystem` and `storage.max_chunks_up`, the following log messages emit for `pause` and `resume`:
 
-```
-[input] {input name or alias} paused (storage buf overlimit
-[input] {input name or alias} resume (storage buf overlimit
+```text
+[input] {input name or alias} paused (storage buf overlimit)
+[input] {input name or alias} resume (storage buf overlimit)
 ```
diff --git a/administration/buffering-and-storage.md b/administration/buffering-and-storage.md
index 1b373bf64..7d433e4a8 100644
--- a/administration/buffering-and-storage.md
+++ b/administration/buffering-and-storage.md
@@ -1,201 +1,306 @@
-# Buffering & Storage
+# Buffering and storage
 
-The end-goal of [Fluent Bit](https://fluentbit.io) is to collect, parse, filter and ship logs to a central place. In this workflow there are many phases and one of the critical pieces is the ability to do _buffering_ : a mechanism to place processed data into a temporary location until is ready to be shipped.
+<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=cde12327-09ed-409c-ac02-7c0afa5eff51" />
 
-By default when Fluent Bit processes data, it uses Memory as a primary and temporary place to store the records, but there are certain scenarios where it would be ideal to have a persistent buffering mechanism based in the filesystem to provide aggregation and data safety capabilities.
+[Fluent Bit](https://fluentbit.io) collects, parses, filters, and ships logs to a central place. A critical piece of this workflow is the ability to do _buffering_: a mechanism to place processed data into a temporary location until is ready to be shipped.
 
-Choosing the right configuration is critical and the behavior of the service can be conditioned based in the backpressure settings. Before we jump into the configuration let's make sure we understand the relationship between _Chunks_, _Memory_, _Filesystem_ and _Backpressure_.
+By default when Fluent Bit processes data, it uses Memory as a primary and temporary place to store the records. There are scenarios where it would be ideal to have a persistent buffering mechanism based in the filesystem to provide aggregation and data safety capabilities.
 
-## Chunks, Memory, Filesystem and Backpressure
+Choosing the right configuration is critical and the behavior of the service can be conditioned based in the backpressure settings. Before jumping into the configuration it helps to understand the relationship between _chunks_, _memory_, _filesystem_, and _backpressure_.
 
-Understanding the chunks, buffering and backpressure concepts is critical for a proper configuration. Let's do a recap of the meaning of these concepts.
+## Chunks, memory, filesystem, and backpressure
 
-#### Chunks
+Understanding chunks, buffering, and backpressure is critical for a proper configuration.
 
-When an input plugin \(source\) emits records, the engine groups the records together in a _Chunk_. A Chunk size usually is around 2MB. By configuration, the engine decides where to place this Chunk, the default is that all chunks are created only in memory.
+### Backpressure
 
-#### Irrecoverable Chunks
+See [Backpressure](https://docs.fluentbit.io/manual/administration/backpressure) for a full explanation.
 
-There are two scenarios where fluent-bit marks chunks as irrecoverable:
+### Chunks
 
-* When Fluent Bit encounters a bad layout in a chunk. A bad layout is a chunk that does not conform to the expected format. [Chunk definition](https://github.com/fluent/fluent-bit/blob/master/CHUNKS.md)
+When an input plugin source emits records, the engine groups the records together in a _chunk_. A chunk's size usually is around 2&nbsp;MB. By configuration, the engine decides where to place this chunk. By default, all chunks are created only in memory.
 
-* When Fluent Bit encounters an incorrect or invalid chunk header size.
+### Irrecoverable chunks
 
-In both scenarios Fluent-Bit will log an error message and then discard the irrecoverable chunks.
+There are two scenarios where Fluent Bit marks chunks as irrecoverable:
 
-#### Buffering and Memory
+- When Fluent Bit encounters a bad layout in a chunk. A bad layout is a chunk that doesn't conform to the expected format. [Chunk definition](https://github.com/fluent/fluent-bit/blob/master/CHUNKS.md)
 
-As mentioned above, the Chunks generated by the engine are placed in memory but this is configurable.
+- When Fluent Bit encounters an incorrect or invalid chunk header size.
 
-If memory is the only mechanism set for the input plugin, it will just store data as much as it can there \(memory\). This is the fastest mechanism with the least system overhead, but if the service is not able to deliver the records fast enough because of a slow network or an unresponsive remote service, Fluent Bit memory usage will increase since it will accumulate more data than it can deliver.
+In both scenarios Fluent Bit logs an error message and then discards the irrecoverable chunks.
 
-In a high load environment with backpressure the risks of having high memory usage is the chance of getting killed by the Kernel \(OOM Killer\). A workaround for this backpressure scenario is to limit the amount of memory in records that an input plugin can register, this configuration property is called `mem_buf_limit`. If a plugin has enqueued more than the `mem_buf_limit`, it won't be able to ingest more until that data can be delivered or flushed properly. In this scenario the input plugin in question is paused. When the input is paused, records will not be ingested until it is resumed. For some inputs, such as TCP and tail, pausing the input will almost certainly lead to log loss. For the tail input, Fluent Bit can save its current offset in the current file it is reading, and pick back up when the input is resumed.
+#### Buffering and memory
+
+As mentioned previously, chunks generated by the engine are placed in memory by default, but this is configurable.
+
+If memory is the only mechanism set for the input plugin, it will store as much data as possible in memory. This is the fastest mechanism with the least system overhead. However, if the service isn't able to deliver the records fast enough, Fluent Bit memory usage increases as it accumulates more data than it can deliver.
+
+In a high load environment with backpressure, having high memory usage risks getting killed by the kernel's OOM Killer. To work around this backpressure scenario, limit the amount of memory in records that an input plugin can register using the `mem_buf_limit` property. If a plugin has queued more than the `mem_buf_limit`, it won't be able to ingest more until that data can be delivered or flushed properly. In this scenario the input plugin in question is paused. When the input is paused, records won't be ingested until the plugin resumes. For some inputs, such as TCP and tail, pausing the input will almost certainly lead to log loss. For the tail input, Fluent Bit can save its current offset in the current file it's reading, and pick back up when the input resumes.
 
 Look for messages in the Fluent Bit log output like:
 
-```
+```text
 [input] tail.1 paused (mem buf overlimit)
 [input] tail.1 resume (mem buf overlimit)
 ```
 
-The workaround of `mem_buf_limit` is good for certain scenarios and environments, it helps to control the memory usage of the service, but at the costs that if a file gets rotated while paused, you might lose that data since it won't be able to register new records. This can happen with any input source plugin. The goal of `mem_buf_limit` is memory control and survival of the service.
+Using `mem_buf_limit` is good for certain scenarios and environments. It helps to control the memory usage of the service. However, if a file rotates while the plugin is paused, data can be lost since it won't be able to register new records. This can happen with any input source plugin. The goal of `mem_buf_limit` is memory control and survival of the service.
+
+For a full data safety guarantee, use filesystem buffering.
 
-For full data safety guarantee, use filesystem buffering.
+Choose your preferred format for an example input definition:
 
-Here is an example input definition:
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
+```yaml
+pipeline:
+  inputs:
+    - name: tcp
+      listen: 0.0.0.0
+      port: 5170
+      format: none
+      tag: tcp-logs
+      mem_buf_limit: 50MB
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name          tcp
-    Listen        0.0.0.0
-    Port          5170
-    Format        none
-    Tag           tcp-logs
-    Mem_Buf_Limit 50MB
+  Name          tcp
+  Listen        0.0.0.0
+  Port          5170
+  Format        none
+  Tag           tcp-logs
+  Mem_Buf_Limit 50MB
 ```
 
-If this input uses more than 50MB memory to buffer logs, you will get a warning like this in the Fluent Bit logs:
-```
+{% endtab %}
+{% endtabs %}
+
+If this input uses more than 50&nbsp;MB memory to buffer logs, you will get a warning like this in the Fluent Bit logs:
+
+```text
 [input] tcp.1 paused (mem buf overlimit)
 ```
 
 {% hint style="info" %}
-`Mem_Buf_Limit` applies only when `storage.type` is set to the default value of
-`memory`.
-{% endhint %}
 
-The following section explains the applicable limits when you enable
-`storage.type filesystem`. 
+`m em_buf_Limit` applies only when `storage.type` is set to the default value of `memory`.
+
+{% endhint %}
 
-#### Filesystem buffering to the rescue
+#### Filesystem buffering
 
-Filesystem buffering enabled helps with backpressure and overall memory control.
+Filesystem buffering helps with backpressure and overall memory control. Enable it using `storage.type filesystem`.
 
-Behind the scenes, Memory and Filesystem buffering mechanisms are **not** mutually exclusive. Indeed when enabling filesystem buffering for your input plugin \(source\) you are getting the best of the two worlds: performance and data safety.
+Memory and filesystem buffering mechanisms aren't mutually exclusive. Enabling filesystem buffering for your input plugin source can improve both performance and data safety.
 
-When Filesystem buffering is enabled, the behavior of the engine is different. Upon Chunk creation, the engine stores the content in memory and also maps a copy on disk \(through [mmap\(2\)](https://man7.org/linux/man-pages/man2/mmap.2.html)\). The newly created Chunk is (1) active in memory, (2) backed up on disk, and (3) is called to be `up` which means "the chunk content is up in memory".
+Enabling filesystem buffering changes the behavior of the engine. Upon chunk creation, the engine stores the content in memory and also maps a copy on disk through [mmap(2)](https://man7.org/linux/man-pages/man2/mmap.2.html). The newly created chunk is active in memory, backed up on disk, and called to be `up`, which means the chunk content is up in memory.
 
-How does the Filesystem buffering mechanism deal with high memory usage and backpressure? Fluent Bit controls the number of Chunks that are `up` in memory.
+Fluent Bit controls the number of chunks that are `up` in memory by using the filesystem buffering mechanism to deal with high memory usage and backpressure.
 
-By default, the engine allows us to have 128 Chunks `up` in memory in total \(considering all Chunks\), this value is controlled by service property `storage.max_chunks_up`. The active Chunks that are `up` are ready for delivery and the ones that are still receiving records. Any other remaining Chunk is in a `down` state, which means that it is only in the filesystem and won't be `up` in memory unless it is ready to be delivered. Remember, chunks are never much larger than 2 MB, thus, with the default `storage.max_chunks_up` value of 128, each input is limited to roughly 256 MB of memory.
+By default, the engine allows a total of 128 chunks `up` in memory in total, considering all chunks. This value is controlled by the service property `storage.max_chunks_up`. The active chunks that are `up` are ready for delivery and are still receiving records. Any other remaining chunk is in a `down` state, which means that it's only in the filesystem and won't be `up` in memory unless it's ready to be delivered. Chunks are never much larger than 2&nbsp;MB, so with the default `storage.max_chunks_up` value of 128, each input is limited to roughly 256&nbsp;MB of memory.
 
-If the input plugin has enabled `storage.type` as `filesystem`, when reaching the `storage.max_chunks_up` threshold, instead of the plugin being paused, all new data will go to Chunks that are `down` in the filesystem. This allows us to control the memory usage by the service and also provides a guarantee that the service won't lose any data. By default, the enforcement of the `storage.max_chunks_up` limit is best-effort. Fluent Bit can only append new data to chunks that are `up`; when the limit is reached chunks will be temporarily brought `up` in memory to ingest new data, and then put to a `down` state afterwards. In general, Fluent Bit will work to keep the total number of `up` chunks at or below `storage.max_chunks_up`. 
+If the input plugin has enabled `storage.type` as `filesystem`, when reaching the `storage.max_chunks_up` threshold, instead of the plugin being paused, all new data will go to chunks that are `down` in the filesystem. This lets you control memory usage by the service and also provides a guarantee that the service won't lose any data. By default, the enforcement of the `storage.max_chunks_up` limit is best-effort. Fluent Bit can only append new data to chunks that are `up`. When the limit is reached chunks will be temporarily brought `up` in memory to ingest new data, and then put to a `down` state afterwards. In general, Fluent Bit works to keep the total number of `up` chunks at or under `storage.max_chunks_up`.
 
-If `storage.pause_on_chunks_overlimit` is enabled (default is off), the input plugin will be paused upon exceeding `storage.max_chunks_up`. Thus, with this option, `storage.max_chunks_up` becomes a hard limit for the input. When the input is paused, records will not be ingested until it is resumed. For some inputs, such as TCP and tail, pausing the input will almost certainly lead to log loss. For the tail input, Fluent Bit can save its current offset in the current file it is reading, and pick back up when the input is resumed.
+If `storage.pause_on_chunks_overlimit` is enabled (default is off), the input plugin pauses upon exceeding `storage.max_chunks_up`. With this option, `storage.max_chunks_up` becomes a hard limit for the input. When the input is paused, records won't be ingested until the plugin resumes. For some inputs, such as TCP and tail, pausing the input will almost certainly lead to log loss. For the tail input, Fluent Bit can save its current offset in the current file it's reading, and pick back up when the input is resumed.
 
 Look for messages in the Fluent Bit log output like:
 
-```
+```text
 [input] tail.1 paused (storage buf overlimit
 [input] tail.1 resume (storage buf overlimit
 ```
 
-**Limiting Filesystem space for Chunks**
+##### Limiting filesystem space for chunks
 
-Fluent Bit implements the concept of logical queues: based on its Tag, a Chunk can be routed to multiple destinations. Thus, we keep an internal reference from where a Chunk was created and where it needs to go.
+Fluent Bit implements the concept of logical queues. Based on its tag, a chunk can be routed to multiple destinations. Fluent Bit keeps an internal reference from where a chunk was created and where it needs to go.
 
-It's common to find cases where if we have multiple destinations for a Chunk, one of the destinations might be slower than the other, or maybe one is generating backpressure and not all of them. In this scenario, how do we limit the amount of filesystem Chunks that we are logically queueing?
+It's common to find cases where multiple destinations with different response times exist for a chunk, or one of the destinations is generating backpressure.
 
-Starting from Fluent Bit v1.6, we introduced the new configuration property for output plugins called `storage.total_limit_size` which limits the total size in bytes of chunks that can exist in the filesystem for a certain logical output destination. If one of the destinations reaches the configured `storage.total_limit_size`, the oldest Chunk from its queue for that logical output destination will be discarded to make room for new data.
+To limit the amount of filesystem chunks logically queueing, Fluent Bit v1.6 and later includes the `storage.total_limit_size` configuration property for output. This property limits the total size in bytes of chunks that can exist in the filesystem for a certain logical output destination. If one of the destinations reaches the configured `storage.total_limit_size`, the oldest chunk from its queue for that logical output destination will be discarded to make room for new data.
 
 ## Configuration
 
-The storage layer configuration takes place in three areas:
+The storage layer configuration takes place in three sections:
 
-* Service Section
-* Input Section
-* Output Section
+- Service
+- Input
+- Output
 
-The known Service section configures a global environment for the storage layer, the Input sections define which buffering mechanism to use and the output the limits for the logical filesystem queues.
+The known Service section configures a global environment for the storage layer, the Input sections define which buffering mechanism to use, and the Output defines limits for the logical filesystem queues.
 
-### Service Section Configuration
+### Service section configuration
 
 The Service section refers to the section defined in the main [configuration file](configuring-fluent-bit/classic-mode/configuration-file.md):
 
 | Key | Description | Default |
 | :--- | :--- | :--- |
-| storage.path | Set an optional location in the file system to store streams and chunks of data. If this parameter is not set, Input plugins can only use in-memory buffering. |  |
-| storage.sync | Configure the synchronization mode used to store the data into the file system. It can take the values _normal_ or _full_. Using _full_ increases the reliability of the filesystem buffer and ensures that data is guaranteed to be synced to the filesystem even if Fluent Bit crashes. On linux, _full_ corresponds with the `MAP_SYNC` option for [memory mapped files](https://man7.org/linux/man-pages/man2/mmap.2.html).  | normal |
-| storage.checksum | Enable the data integrity check when writing and reading data from the filesystem. The storage layer uses the CRC32 algorithm. | Off |
-| storage.max\_chunks\_up | If the input plugin has enabled `filesystem` storage type, this property sets the maximum number of Chunks that can be `up` in memory. *This is the setting to use to control memory usage when you enable `storage.type filesystem`*. | 128 |
-| storage.backlog.mem\_limit | If _storage.path_ is set, Fluent Bit will look for data chunks that were not delivered and are still in the storage layer, these are called _backlog_ data. _Backlog chunks_ are filesystem chunks that were left over from a previous Fluent Bit run; chunks that could not be sent before exit that Fluent Bit will pick up when restarted. Fluent Bit will check the `storage.backlog.mem_limit` value against the current memory usage from all `up` chunks for the input. If the `up` chunks currently consume less memory than the limit, it will bring the _backlog_ chunks up into memory so they can be sent by outputs. | 5M |
-| storage.metrics | If `http_server` option has been enabled in the main `[SERVICE]` section, this option registers a new endpoint where internal metrics of the storage layer can be consumed. For more details refer to the [Monitoring](monitoring.md) section. | off |
-| storage.delete_irrecoverable_chunks | When enabled, [irrecoverable chunks](./buffering-and-storage.md#irrecoverable-chunks) will be deleted during runtime, and any other irrecoverable chunk located in the configured storage path directory will be deleted when Fluent-Bit starts. | Off |
+| `storage.path` | Set an optional location in the file system to store streams and chunks of data. If this parameter isn't set, Input plugins can only use in-memory buffering. | _none_ |
+| `storage.sync` | Configure the synchronization mode used to store the data in the file system. Using `full` increases the reliability of the filesystem buffer and ensures that data is guaranteed to be synced to the filesystem even if Fluent Bit crashes. On Linux, `full` corresponds with the `MAP_SYNC` option for [memory mapped files](https://man7.org/linux/man-pages/man2/mmap.2.html). Accepted values: `normal`, `full`. | `normal` |
+| `storage.checksum` | Enable the data integrity check when writing and reading data from the filesystem. The storage layer uses the CRC32 algorithm. Accepted values: `Off`, `On`. | `Off` |
+| `storage.max_chunks_up` | If the input plugin has enabled `filesystem` storage type, this property sets the maximum number of chunks that can be `up` in memory. Use this setting to control memory usage when you enable `storage.type filesystem`. | `128` |
+| `storage.backlog.mem_limit` | If `storage.path` is set, Fluent Bit looks for data chunks that weren't delivered and are still in the storage layer. These are called _backlog_ data. _Backlog chunks_ are filesystem chunks that were left over from a previous Fluent Bit run; chunks that couldn't be sent before exit that Fluent Bit will pick up when restarted. Fluent Bit will check the `storage.backlog.mem_limit` value against the current memory usage from all `up` chunks for the input. If the `up` chunks currently consume less memory than the limit, it will bring the _backlog_ chunks up into memory so they can be sent by outputs. | `5M` |
+| `storage.backlog.flush_on_shutdown` | When enabled, Fluent Bit will attempt to flush all backlog filesystem chunks to their destination during the shutdown process. This can help ensure data delivery before Fluent Bit stops, but can increase shutdown time. Accepted values: `Off`, `On`. | `Off` |
+| `storage.metrics` | If `http_server` option is enabled in the main `[SERVICE]` section, this option registers a new endpoint where internal metrics of the storage layer can be consumed. For more details refer to the [Monitoring](monitoring.md) section. | `off` |
+| `storage.delete_irrecoverable_chunks` | When enabled, [irrecoverable chunks](./buffering-and-storage.md#irrecoverable-chunks) will be deleted during runtime, and any other irrecoverable chunk located in the configured storage path directory will be deleted when Fluent Bit starts. Accepted values: `Off`, 'On`. | `Off` |
+
+A Service section will look like this:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+  storage.path: /var/log/flb-storage/
+  storage.sync: normal
+  storage.checksum: off
+  storage.backlog.mem_limit: 5M
+  storage.backlog.flush_on_shutdown: off
+```
 
-a Service section will look like this:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [SERVICE]
-    flush                     1
-    log_Level                 info
-    storage.path              /var/log/flb-storage/
-    storage.sync              normal
-    storage.checksum          off
-    storage.backlog.mem_limit 5M
+  flush                     1
+  log_Level                 info
+  storage.path              /var/log/flb-storage/
+  storage.sync              normal
+  storage.checksum          off
+  storage.backlog.mem_limit 5M
+  storage.backlog.flush_on_shutdown off
 ```
 
-that configuration sets an optional buffering mechanism where the route to the data is _/var/log/flb-storage/_, it will use _normal_ synchronization mode, without running a checksum and up to a maximum of 5MB of memory when processing backlog data.
+{% endtab %}
+{% endtabs %}
+
+This configuration sets an optional buffering mechanism where the route to the data is `/var/log/flb-storage/`. It uses `normal` synchronization mode, without running a checksum and up to a maximum of 5&nbsp;MB of memory when processing backlog data.
 
-### Input Section Configuration
+### Input section configuration
 
-Optionally, any Input plugin can configure their storage preference, the following table describes the options available:
+Optionally, any Input plugin can configure their storage preference. The following table describes the options available:
 
 | Key | Description | Default |
 | :--- | :--- | :--- |
-| storage.type | Specifies the buffering mechanism to use. It can be _memory_ or _filesystem_. | memory |
-| storage.pause_on_chunks_overlimit | Specifies if the input plugin should be paused (stop ingesting new data) when the `storage.max_chunks_up` value is reached. | off |
+| `storage.type` | Specifies the buffering mechanism to use. Accepted values: `memory`, `filesystem`. | `memory` |
+| `storage.pause_on_chunks_overlimit` | Specifies if the input plugin should pause (stop ingesting new data) when the `storage.max_chunks_up` value is reached. |`off` |
+
+The following example configures a service offering filesystem buffering capabilities and two input plugins being the first based in filesystem and the second with memory only.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+  storage.path: /var/log/flb-storage/
+  storage.sync: normal
+  storage.checksum: off
+  storage.max_chunks_up: 128
+  storage.backlog.mem_limit: 5M
+
+pipeline:
+  inputs:
+    - name: cpu
+      storage.type: filesystem
+
+    - name: mem
+      storage.type: memory
+```
 
-The following example configures a service that offers filesystem buffering capabilities and two Input plugins being the first based in filesystem and the second with memory only.
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [SERVICE]
-    flush                     1
-    log_Level                 info
-    storage.path              /var/log/flb-storage/
-    storage.sync              normal
-    storage.checksum          off
-    storage.max_chunks_up     128
-    storage.backlog.mem_limit 5M
+  flush                     1
+  log_Level                 info
+  storage.path              /var/log/flb-storage/
+  storage.sync              normal
+  storage.checksum          off
+  storage.max_chunks_up     128
+  storage.backlog.mem_limit 5M
 
 [INPUT]
-    name          cpu
-    storage.type  filesystem
+  name          cpu
+  storage.type  filesystem
 
 [INPUT]
-    name          mem
-    storage.type  memory
+  name          mem
+  storage.type  memory
 ```
 
-### Output Section Configuration
+{% endtab %}
+{% endtabs %}
+
+### Output section configuration
 
-If certain chunks are filesystem _storage.type_ based, it's possible to control the size of the logical queue for an output plugin. The following table describes the options available:
+If certain chunks are filesystem `storage.type` based, it's possible to control the size of the logical queue for an output plugin. The following table describes the options available:
 
 | Key | Description | Default |
 | :--- | :--- | :--- |
-| storage.total\_limit\_size | Limit the maximum disk space size in bytes for buffering chunks in the filesystem for the current output logical destination.  |  |
+| `storage.total_limit_size` | Limit the maximum disk space size in bytes for buffering chunks in the filesystem for the current output logical destination. | _none_ |
+
+The following example creates records with CPU usage samples in the filesystem which are delivered to Google Stackdriver service while limiting the logical queue (buffering) to `5M`:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+  storage.path: /var/log/flb-storage/
+  storage.sync: normal
+  storage.checksum: off
+  storage.max_chunks_up: 128
+  storage.backlog.mem_limit: 5M
+
+pipeline:
+  inputs:
+    - name: cpu
+      storage.type: filesystem
+
+  outputs:
+    - name: stackdriver
+      match: '*'
+      storage.total_limit_size: 5M
+```
 
-The following example create records with CPU usage samples in the filesystem and then they are delivered to Google Stackdriver service limiting the logical queue \(buffering\) to 5M:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [SERVICE]
-    flush                     1
-    log_Level                 info
-    storage.path              /var/log/flb-storage/
-    storage.sync              normal
-    storage.checksum          off
-    storage.max_chunks_up     128
-    storage.backlog.mem_limit 5M
+  flush                     1
+  log_Level                 info
+  storage.path              /var/log/flb-storage/
+  storage.sync              normal
+  storage.checksum          off
+  storage.max_chunks_up     128
+  storage.backlog.mem_limit 5M
 
 [INPUT]
-    name                      cpu
-    storage.type              filesystem 
+  name                      cpu
+  storage.type              filesystem
 
 [OUTPUT]
-    name                      stackdriver
-    match                     *
-    storage.total_limit_size  5M
+  name                      stackdriver
+  match                     *
+  storage.total_limit_size  5M
 ```
 
-If for some reason Fluent Bit gets offline because of a network issue, it will continue buffering CPU samples but just keep a maximum of 5MB of the newest data.
+{% endtab %}
+{% endtabs %}
 
+If Fluent Bit is offline because of a network issue, it will continue buffering CPU
+samples, keeping a maximum of 5&nbsp;MB of the newest data.
diff --git a/administration/configuring-fluent-bit/README.md b/administration/configuring-fluent-bit/README.md
index e1a73a507..2ebce7678 100644
--- a/administration/configuring-fluent-bit/README.md
+++ b/administration/configuring-fluent-bit/README.md
@@ -1,13 +1,13 @@
-# Configuring Fluent Bit
+# Configure Fluent Bit
 
-Currently, Fluent Bit supports two configuration formats:
+Fluent Bit supports two configuration formats:
 
-* [Classic mode](classic-mode/README.md).
-* [Yaml](yaml/README.md). (YAML configuration is production ready since Fluent Bit 2.0.)
+- [YAML](yaml/README.md): Standard configuration format as of v3.2.
+- [Classic mode](classic-mode/README.md): To be deprecated at the end of 2026.
 
-## CLI flags
+## Command line interface
 
-Fluent Bit also supports a CLI interface with various flags matching up to the configuration options available.
+Fluent Bit exposes most of it features through the command line interface. Running the `-h` option you can get a list of the options available:
 
 ```shell
 $ docker run --rm -it fluent/fluent-bit --help
diff --git a/administration/configuring-fluent-bit/classic-mode/README.md b/administration/configuring-fluent-bit/classic-mode/README.md
index 4d30e8a3b..e4db3b567 100644
--- a/administration/configuring-fluent-bit/classic-mode/README.md
+++ b/administration/configuring-fluent-bit/classic-mode/README.md
@@ -1 +1 @@
-# Fluent Bit classic mode
\ No newline at end of file
+# Classic mode
diff --git a/administration/configuring-fluent-bit/classic-mode/commands.md b/administration/configuring-fluent-bit/classic-mode/commands.md
index 66c8c6b17..6239eae52 100644
--- a/administration/configuring-fluent-bit/classic-mode/commands.md
+++ b/administration/configuring-fluent-bit/classic-mode/commands.md
@@ -2,18 +2,18 @@
 
 Configuration files must be flexible enough for any deployment need, but they must keep a clean and readable format.
 
-Fluent Bit _Commands_ extends a configuration file with specific built-in features. The list of commands available as of Fluent Bit 0.12 series are:
+Fluent Bit `Commands` extends a configuration file with specific built-in features. The following commands are available:
 
 | Command | Prototype | Description |
 | :--- | :--- | :--- |
-| [@INCLUDE](commands.md#cmd_include) | @INCLUDE FILE | Include a configuration file |
-| [@SET](commands.md#cmd_set) | @SET KEY=VAL | Set a configuration variable |
+| [`@INCLUDE`](#include) | `@INCLUDE FILE` | Include a configuration file. |
+| [`@SET`](#set) | `@SET KEY=VAL` | Set a configuration variable. |
 
-## @INCLUDE Command <a id="cmd_include"></a>
+## `@INCLUDE`
 
-Configuring a logging pipeline might lead to an extensive configuration file. In order to maintain a human-readable configuration, it's suggested to split the configuration in multiple files.
+Configuring a logging pipeline might lead to an extensive configuration file. In order to maintain a human-readable configuration, split the configuration in multiple files.
 
-The @INCLUDE command allows the configuration reader to include an external configuration file, e.g:
+The `@INCLUDE` command allows the configuration reader to include an external configuration file:
 
 ```text
 [SERVICE]
@@ -23,9 +23,18 @@ The @INCLUDE command allows the configuration reader to include an external conf
 @INCLUDE outputs.conf
 ```
 
-The above example defines the main service configuration file and also include two files to continue the configuration:
+This example defines the main service configuration file and also includes two files to continue the configuration.
 
-### inputs.conf
+Fluent Bit will respects the following order when including:
+
+- Service
+- Inputs
+- Filters
+- Outputs
+
+### `inputs.conf`
+
+The following is an example of an `inputs.conf` file, like the one called in the previous example.
 
 ```text
 [INPUT]
@@ -38,7 +47,9 @@ The above example defines the main service configuration file and also include t
     Tag  varlog.*
 ```
 
-### outputs.conf
+### `outputs.conf`
+
+The following is an example of an `outputs.conf` file, like the one called in the previous example.
 
 ```text
 [OUTPUT]
@@ -53,20 +64,14 @@ The above example defines the main service configuration file and also include t
     Logstash_Format On
 ```
 
-Note that despites the order of inclusion, Fluent Bit will **ALWAYS** respect the following order:
+## `@SET`
 
-* Service
-* Inputs
-* Filters
-* Outputs
+Fluent Bit supports [configuration variables](variables.md). One way to expose this variables to Fluent Bit is through setting a shell environment variable, the other is through the `@SET` command.
 
-## @SET Command <a id="cmd_set"></a>
-
-Fluent Bit supports [configuration variables](variables.md), one way to expose this variables to Fluent Bit is through setting a Shell environment variable, the other is through the _@SET_ command.
-
-The @SET command can only be used at root level of each line, meaning it cannot be used inside a section, e.g:
+The `@SET` command can only be used at root level of each line. It can't be used inside a section:
 
 ```text
+// DO NOT USE
 @SET my_input=cpu
 @SET my_output=stdout
 
@@ -79,4 +84,3 @@ The @SET command can only be used at root level of each line, meaning it cannot
 [OUTPUT]
     Name ${my_output}
 ```
-
diff --git a/administration/configuring-fluent-bit/classic-mode/configuration-file.md b/administration/configuring-fluent-bit/classic-mode/configuration-file.md
index ce423fa65..6d2bfeeb4 100644
--- a/administration/configuring-fluent-bit/classic-mode/configuration-file.md
+++ b/administration/configuring-fluent-bit/classic-mode/configuration-file.md
@@ -1,171 +1,157 @@
----
-description: This page describes the main configuration file used by Fluent Bit
----
-
-# Configuration File
-
-One of the ways to configure Fluent Bit is using a main configuration file. Fluent Bit allows to use one configuration file which works at a global scope and uses the [Format and Schema](format-schema.md) defined previously.
-
-The main configuration file supports four types of sections:
-
-* Service
-* Input
-* Filter
-* Output
-
-In addition, it's also possible to split the main configuration file in multiple files using the feature to include external files:
-
-* Include File
-
-## Service <a href="config_section" id="config_section"></a>
-
-The _Service_ section defines global properties of the service, the keys available as of this version are described in the following table:
-
-| Key             | Description                                                                                                                                                                                                                                                                                             | Default Value |
-| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- |
-| flush           | Set the flush time in `seconds.nanoseconds`. The engine loop uses a Flush timeout to define when is required to flush the records ingested by input plugins through the defined output plugins.                                                                                                         | 1             |
-| grace           | Set the grace time in `seconds` as Integer value. The engine loop uses a Grace timeout to define wait time on exit                                                                                                                                                                                      | 5             |
-| daemon          | Boolean value to set if Fluent Bit should run as a Daemon (background) or not. Allowed values are: yes, no, on and off.  note: If you are using a Systemd based unit as the one we provide in our packages, do not turn on this option.                                                                 | Off           |
-| dns.mode        | Set the primary transport layer protocol used by the asynchronous DNS resolver which can be overridden on a per plugin basis                                                                                                                                                                             | UDP           |
-| log_file        | Absolute path for an optional log file. By default all logs are redirected to the standard error interface (stderr).                                                                                                                                                                                    |               |
-| log_level       | Set the logging verbosity level. Allowed values are: off, error, warn, info, debug and trace. Values are accumulative, e.g: if 'debug' is set, it will include error, warning, info and debug.  Note that _trace_ mode is only available if Fluent Bit was built with the _WITH\_TRACE_ option enabled. | info          |
-| parsers_file    | Path for a `parsers` configuration file. Multiple Parsers_File entries can be defined within the section.                                                                                                                                                                                               |               |
-| plugins_file    | Path for a `plugins` configuration file. A _plugins_ configuration file allows to define paths for external plugins, for an example [see here](https://github.com/fluent/fluent-bit/blob/master/conf/plugins.conf).                                                                                     |               |
-| streams_file    | Path for the Stream Processor configuration file. To learn more about Stream Processing configuration go [here](../../../stream-processing/introduction.md).                                                                                                                                               |               |
-| http_server     | Enable built-in HTTP Server                                                                                                                                                                                                                                                                             | Off           |
-| http_listen     | Set listening interface for HTTP Server when it's enabled                                                                                                                                                                                                                                               | 0.0.0.0       |
-| http_port       | Set TCP Port for the HTTP Server                                                                                                                                                                                                                                                                        | 2020          |
-| coro_stack_size | Set the coroutines stack size in bytes. The value must be greater than the page size of the running system. Don't set too small value (say 4096), or coroutine threads can overrun the stack buffer. Do not change the default value of this parameter unless you know what you are doing.              | 24576         |
-| scheduler.cap   | Set a maximum retry time in second. The property is supported from v1.8.7.                                                                                                                                                                                                                              | 2000          |
-| scheduler.base  | Set a base of exponential backoff. The property is supported from v1.8.7.                                                                                                                                                                                                                               | 5             |
-| json.convert_nan_to_null | If enabled, NaN is converted to null when fluent-bit converts msgpack to json.    | false         |
-| sp.convert_from_str_to_num | If enabled, Stream processor converts from number string to number type.        | true          |
-
-The following is an example of a _SERVICE_ section:
-
-```python
+# Configuration file
+
+One of the ways to configure Fluent Bit is using a main configuration file. Fluent Bit allows the use one configuration file that works at a global scope and uses the defined [Format and Schema](format-schema.md).
+
+The main configuration file supports four sections:
+
+- Service
+- Input
+- Filter
+- Output
+
+It's also possible to split the main configuration file into multiple files using the Include File feature to include external files.
+
+## Service
+
+The `Service` section defines global properties of the service. The following keys are:
+
+| Key             | Description   | Default Value |
+| --------------- | ------------- | ------------- |
+| `flush`           | Set the flush time in `seconds.nanoseconds`. The engine loop uses a Flush timeout to define when it's required to flush the records ingested by input plugins through the defined output plugins.  | `1` |
+| `grace`           | Set the grace time in `seconds` as an integer value. The engine loop uses a grace timeout to define wait time on exit. | `5` |
+| daemon          | Boolean. Determines whether Fluent Bit should run as a Daemon (background). Allowed values are: `yes`, `no`, `on`, and `off`. Don't enable when using a Systemd based unit, such as the one provided in Fluent Bit packages.  | `Off` |
+| `dns.mode`        | Set the primary transport layer protocol used by the asynchronous DNS resolver. Can be overridden on a per plugin basis. | `UDP` |
+| `log_file`        | Absolute path for an optional log file. By default all logs are redirected to the standard error interface (stderr). | _none_ |
+| `log_level`       | Set the logging verbosity level. Allowed values are: `off`, `error`, `warn`, `info`, `debug`, and `trace`. Values are cumulative. If `debug` is set, it will include `error`, `warning`, `info`, and `debug`. Trace mode is only available if Fluent Bit was built with the _`WITH_TRACE`_ option enabled. | `info` |
+| `parsers_file`    | Path for a `parsers` configuration file. Multiple `Parsers_File` entries can be defined within the section. | _none_ |
+| `plugins_file`    | Path for a `plugins` configuration file. A `plugins` configuration file defines paths for external plugins. [See an example](https://github.com/fluent/fluent-bit/blob/master/conf/plugins.conf). | _none_ |
+| `streams_file`    | Path for the Stream Processor configuration file. [Learn more about Stream Processing configuration](../../../stream-processing/introduction.md). | _none_|
+| `http_server`     | Enable the built-in HTTP Server. | `Off` |
+| `http_listen`     | Set listening interface for HTTP Server when it's enabled. | `0.0.0.0` |
+| `http_port`       | Set TCP Port for the HTTP Server. | `2020` |
+| `coro_stack_size` | Set the coroutines stack size in bytes. The value must be greater than the page size of the running system. Setting the value too small (`4096`) can cause coroutine threads to overrun the stack buffer. The default value of this parameter shouldn't be changed. | `24576` |
+| `scheduler.cap`   | Set a maximum retry time in seconds. Supported in v1.8.7 and greater. | `2000` |
+| `scheduler.base`  | Set a base of exponential backoff. Supported in v1.8.7 and greater. | `5` |
+| `json.convert_nan_to_null` | If enabled, `NaN` converts to `null` when Fluent Bit converts `msgpack` to `json`. | `false` |
+| `sp.convert_from_str_to_num` | If enabled, Stream processor converts from number string to number type. | `true` |
+
+The following is an example of a `SERVICE` section:
+
+```text
 [SERVICE]
-    Flush           5
-    Daemon          off
-    Log_Level       debug
+  Flush           5
+  Daemon          off
+  Log_Level       debug
 ```
-For scheduler and retry details, please check there: [scheduling and retries](../../scheduling-and-retries.md#Scheduling-and-Retries)
 
-## Input <a href="config_input" id="config_input"></a>
+For scheduler and retry details, see [scheduling and retries](../../scheduling-and-retries.md#Scheduling-and-Retries).
+
+## Config input
 
-An _INPUT_ section defines a source (related to an input plugin), here we will describe the base configuration for each _INPUT_ section. Note that each input plugin may add it own configuration keys:
+The `INPUT` section defines a source (related to an input plugin). Each [input plugin](https://docs.fluentbit.io/manual/pipeline/inputs) can add its own configuration keys:
 
-| Key         | Description                                                                                                                                             |
-| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Name        | Name of the input plugin.                                                                                                                               |
-| Tag         | Tag name associated to all records coming from this plugin.                                                                                             |
-| Log_Level   | Set the plugin's logging verbosity level. Allowed values are: off, error, warn, info, debug and trace. Defaults to the _SERVICE_ section's _Log_Level._ |
+| Key         | Description |
+| ----------- | ------------|
+| `Name`      | Name of the input plugin.  |
+| `Tag`       | Tag name associated to all records coming from this plugin. |
+| `Log_Level` | Set the plugin's logging verbosity level. Allowed values are: `off`, `error`, `warn`, `info`, `debug`, and `trace`. Defaults to the `SERVICE` section's `Log_Level`. |
 
-The _Name_ is mandatory and it let Fluent Bit know which input plugin should be loaded. The _Tag_ is mandatory for all plugins except for the _input forward_ plugin (as it provides dynamic tags).
+`Name` is mandatory and tells Fluent Bit which input plugin to load. `Tag` is mandatory for all plugins except for the `input forward` plugin, which provides dynamic tags.
 
 ### Example
 
-The following is an example of an _INPUT_ section:
+The following is an example of an `INPUT` section:
 
-```python
+```text
 [INPUT]
-    Name cpu
-    Tag  my_cpu
+  Name cpu
+  Tag  my_cpu
 ```
 
-## Filter <a href="config_filter" id="config_filter"></a>
+## Config filter
 
-A _FILTER_ section defines a filter (related to an filter plugin), here we will describe the base configuration for each _FILTER_ section. Note that each filter plugin may add it own configuration keys:
+The `FILTER` section defines a filter (related to an filter plugin). Each filter plugin can add it own configuration keys. The base configuration for each `FILTER` section contains:
 
-| Key         | Description                                                                                                                                             |
-| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Name        | Name of the filter plugin.                                                                                                                              |
-| Match       | A pattern to match against the tags of incoming records. It's case sensitive and support the star (\*) character as a wildcard.                         |
-| Match_Regex | A regular expression to match against the tags of incoming records. Use this option if you want to use the full regex syntax.                           |
-| Log_Level   | Set the plugin's logging verbosity level. Allowed values are: off, error, warn, info, debug and trace. Defaults to the _SERVICE_ section's _Log_Level._ |
+| Key         | Description  |
+| ----------- | ------------ |
+| `Name`      | Name of the filter plugin. |
+| `Match`     | A pattern to match against the tags of incoming records. Case sensitive, supports asterisk (`*`) as a wildcard. |
+| `Match_Regex` | A regular expression to match against the tags of incoming records. Use this option if you want to use the full regular expression syntax. |
+| `Log_Level`   | Set the plugin's logging verbosity level. Allowed values are: `off`, `error`, `warn`, `info`, `debug`, and `trace`. Defaults to the `SERVICE` section's `Log_Level`. |
 
-The _Name_ is mandatory and it let Fluent Bit know which filter plugin should be loaded. The _Match_ or _Match_Regex_ is mandatory for all plugins. If both are specified, _Match_Regex_ takes precedence.
+`Name` is mandatory and lets Fluent Bit know which filter plugin should be loaded. `Match` or `Match_Regex` is mandatory for all plugins. If both are specified, `Match_Regex` takes precedence.
 
-### Example
+### Filter example
 
-The following is an example of an _FILTER_ section:
+The following is an example of a `FILTER` section:
 
-```python
+```text
 [FILTER]
-    Name  grep
-    Match *
-    Regex log aa
+  Name  grep
+  Match *
+  Regex log aa
 ```
 
-## Output <a href="config_output" id="config_output"></a>
+## Config output
 
-The _OUTPUT_ section specify a destination that certain records should follow after a Tag match. Currently, Fluent Bit can route up to 256 _OUTPUT_ plugins. The configuration support the following keys:
+The `OUTPUT` section specifies a destination that certain records should go to after a `Tag` match. Fluent Bit can route up to 256 `OUTPUT` plugins. The configuration supports the following keys:
 
-| Key         | Description                                                                                                                                             |
-| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Name        | Name of the output plugin.                                                                                                                              |
-| Match       | A pattern to match against the tags of incoming records. It's case sensitive and support the star (\*) character as a wildcard.                         |
-| Match_Regex | A regular expression to match against the tags of incoming records. Use this option if you want to use the full regex syntax.                           |
-| Log_Level   | Set the plugin's logging verbosity level. Allowed values are: off, error, warn, info, debug and trace. Defaults to the _SERVICE_ section's _Log_Level._ |
+| Key         | Description    |
+| ----------- | -------------- |
+| `Name`      | Name of the output plugin. |
+| `Match`     | A pattern to match against the tags of incoming records. Case sensitive and supports the asterisk (`*`) character as a wildcard. |
+| `Match_Regex` | A regular expression to match against the tags of incoming records. Use this option if you want to use the full regular expression syntax. |
+| `Log_Level` | Set the plugin's logging verbosity level. Allowed values are: `off`, `error`, `warn`, `info`, `debug`, and `trace`. Defaults to the `SERVICE` section's `Log_Level`. |
 
-### Example
+### Output example
 
-The following is an example of an _OUTPUT_ section:
+The following is an example of an `OUTPUT` section:
 
-```python
+```text
 [OUTPUT]
-    Name  stdout
-    Match my*cpu
+  Name  stdout
+  Match my*cpu
 ```
 
-### Example: collecting CPU metrics
+### Collecting `cpu` metrics example
 
 The following configuration file example demonstrates how to collect CPU metrics and flush the results every five seconds to the standard output:
 
-```python
+```text
 [SERVICE]
-    Flush     5
-    Daemon    off
-    Log_Level debug
+  Flush     5
+  Daemon    off
+  Log_Level debug
 
 [INPUT]
-    Name  cpu
-    Tag   my_cpu
+  Name  cpu
+  Tag   my_cpu
 
 [OUTPUT]
-    Name  stdout
-    Match my*cpu
+  Name  stdout
+  Match my*cpu
 ```
 
-## Visualize <a href="config_include_file" id="config_include_file"></a>
-
-You can also visualize Fluent Bit INPUT, FILTER, and OUTPUT configuration via [Calyptia](https://calyptia.com/free-trial)
+## Config include file
 
-![](../../../.gitbook/assets/image.png)
+To avoid complicated long configuration files is better to split specific parts in different files and call them (include) from one main file. The `@INCLUDE` can be used in the following way:
 
-## Include File <a href="config_include_file" id="config_include_file"></a>
-
-To avoid complicated long configuration files is better to split specific parts in different files and call them (include) from one main file.
-
-Starting from Fluent Bit 0.12 the new configuration command _@INCLUDE_ has been added and can be used in the following way:
-
-```
+```text
 @INCLUDE somefile.conf
 ```
 
-The configuration reader will try to open the path _somefile.conf_, if not found, it will assume it's a relative path based on the path of the base configuration file, e.g:
+The configuration reader will try to open the path `somefile.conf`. If not found, the reader assumes the file is on a relative path based on the path of the base configuration file:
 
-* Main configuration file path: /tmp/main.conf
-* Included file: somefile.conf
-* Fluent Bit will try to open somefile.conf, if it fails it will try /tmp/somefile.conf.
+- Main configuration path: `/tmp/main.conf`
+- Included file: `somefile.conf`
+- Fluent Bit will try to open `somefile.conf`, if it fails it will try `/tmp/somefile.conf`.
 
-The _@INCLUDE_ command only works at top-left level of the configuration line, it cannot be used inside sections.
+The `@INCLUDE` command only works at top-left level of the configuration line, and can't be used inside sections.
 
-Wildcard character (\*) is supported to include multiple files, e.g:
+Wildcard character (`*`) supports including multiple files. For example:
 
-```
+```text
 @INCLUDE input_*.conf
 ```
 
-Note files matching the wildcard character are included unsorted. 
-If plugins ordering between files need to be preserved, the files should be included explicitly.
+Files matching the wildcard character are included unsorted. If plugin ordering between files needs to be preserved, the files should be included explicitly.
\ No newline at end of file
diff --git a/administration/configuring-fluent-bit/classic-mode/format-schema.md b/administration/configuring-fluent-bit/classic-mode/format-schema.md
index 30efc1a6f..b2d049e9e 100644
--- a/administration/configuring-fluent-bit/classic-mode/format-schema.md
+++ b/administration/configuring-fluent-bit/classic-mode/format-schema.md
@@ -1,59 +1,56 @@
-# Formats and Schema
+# Formats and schema
 
 Fluent Bit might optionally use a configuration file to define how the service will behave.
 
-Before proceeding we need to understand how the configuration schema works.
-
 The schema is defined by three concepts:
 
-* Sections
-* Entries: Key/Value
-* Indented Configuration Mode
+- Sections
+- Entries: key/value
+- Indented Configuration Mode
 
-A simple example of a configuration file is as follows:
+An example of a configuration file is as follows:
 
-```python
+```text
 [SERVICE]
-    # This is a commented line
-    Daemon    off
-    log_level debug
+  # This is a commented line
+  Daemon    off
+  log_level debug
 ```
 
-## Sections <a id="sections"></a>
+## Sections
 
-A section is defined by a name or title inside brackets. Looking at the example above, a Service section has been set using **\[SERVICE\]** definition. Section rules:
+A section is defined by a name or title inside brackets. Using the previous example, a Service section has been set using `[SERVICE]` definition. The following rules apply:
 
-* All section content must be indented \(4 spaces ideally\).
-* Multiple sections can exist on the same file.
-* A section is expected to have comments and entries, it cannot be empty.
-* Any commented line under a section, must be indented too.
-* End-of-line comments are not supported, only full-line comments.
+- All section content must be indented (four spaces ideally).
+- Multiple sections can exist on the same file.
+- A section must have comments and entries.
+- Any commented line under a section must be indented too.
+- End-of-line comments aren't supported, only full-line comments.
 
-## Entries: Key/Value <a id="entries_kv"></a>
+## Entries: `key`/`value`
 
-A section may contain **Entries**, an entry is defined by a line of text that contains a **Key** and a **Value**, using the above example, the `[SERVICE]` section contains two entries, one is the key **Daemon** with value **off** and the other is the key **Log\_Level** with the value **debug**. Entries rules:
+A section can contain entries. An entry is defined by a line of text that contains a `Key` and a `Value`. Using the previous example, the `[SERVICE]` section contains two entries: one is the key `Daemon` with value `off` and the other is the key `Log_Level` with the value `debug`. The following rules apply:
 
-* An entry is defined by a key and a value.
-* A key must be indented.
-* A key must contain a value which ends in the breakline.
-* Multiple keys with the same name can exist.
+- An entry is defined by a key and a value.
+- A key must be indented.
+- A key must contain a value which ends in a line break.
+- Multiple keys with the same name can exist.
 
-Also commented lines are set prefixing the **\#** character, those lines are not processed but they must be indented too.
+Commented lines are set prefixing the `#` character. Commented lines aren't processed but they must be indented.
 
-## Indented Configuration Mode <a id="indented_mode"></a>
+## Indented configuration mode
 
-Fluent Bit configuration files are based in a strict **Indented Mode**, that means that each configuration file must follow the same pattern of alignment from left to right when writing text. By default an indentation level of four spaces from left to right is suggested. Example:
+Fluent Bit configuration files are based in a strict indented mode. Each configuration file must follow the same pattern of alignment from left to right when writing text. By default, an indentation level of four spaces from left to right is suggested. Example:
 
-```python
+```text
 [FIRST_SECTION]
-    # This is a commented line
-    Key1  some value
-    Key2  another value
-    # more comments
+  # This is a commented line
+  Key1  some value
+  Key2  another value
+  # more comments
 
 [SECOND_SECTION]
-    KeyN  3.14
+  KeyN  3.14
 ```
 
-As you can see there are two sections with multiple entries and comments, note also that empty lines are allowed and they do not need to be indented.
-
+This example shows two sections with multiple entries and comments. Empty lines are allowed.
\ No newline at end of file
diff --git a/administration/configuring-fluent-bit/classic-mode/record-accessor.md b/administration/configuring-fluent-bit/classic-mode/record-accessor.md
index 9b950efa8..753e9a743 100644
--- a/administration/configuring-fluent-bit/classic-mode/record-accessor.md
+++ b/administration/configuring-fluent-bit/classic-mode/record-accessor.md
@@ -1,25 +1,25 @@
 ---
-description: A full feature set to access content of your records
+description: A full feature set to access content of your records.
 ---
 
-# Record Accessor
+# Record accessor syntax
 
 Fluent Bit works internally with structured records and it can be composed of an unlimited number of keys and values. Values can be anything like a number, string, array, or a map.
 
 Having a way to select a specific part of the record is critical for certain core functionalities or plugins, this feature is called _Record Accessor._
 
-> consider Record Accessor a simple grammar to specify record content and other miscellaneous values.
+Consider record accessor to be a basic grammar to specify record content and other miscellaneous values.
 
 ## Format
 
-A _record accessor_ rule starts with the character `$`. Using the structured content above as an example the following table describes how to access a record:
+A record accessor rule starts with the character `$`. Use the structured content as an example. The following table describes how to access a record:
 
-```javascript
+```js
 {
   "log": "some message",
   "stream": "stdout",
   "labels": {
-     "color": "blue", 
+     "color": "blue",
      "unset": null,
      "project": {
          "env": "production"
@@ -28,23 +28,23 @@ A _record accessor_ rule starts with the character `$`. Using the structured con
 }
 ```
 
-The following table describe some accessing rules and the expected returned value:
+The following table describes some accessing rules and the expected returned value:
 
 | Format | Accessed Value |
 | :--- | :--- |
-| $log | "some message" |
-| $labels\['color'\] | "blue" |
-| $labels\['project'\]\['env'\] | "production" |
-| $labels\['unset'\] | null |
-| $labels\['undefined'\] |  |
+| `$log` | `some message` |
+| `$labels['color']` | `blue` |
+| `$labels['project']['env']` | `production` |
+| `$labels['unset']` | `null` |
+| `$labels['undefined']` |  |
 
-If the accessor key does not exist in the record like the last example `$labels['undefined']` , the operation is simply omitted, no exception will occur.
+If the accessor key doesn't exist in the record like the last example `$labels['undefined']`, the operation is omitted, and no exception will occur.
 
-## Usage Example
+## Usage
 
-The feature is enabled on a per plugin basis, not all plugins enable this feature. As an example consider a configuration that aims to filter records using [grep](../../../pipeline/filters/grep.md) that only matches where labels have a color blue:
+The feature is enabled on a per plugin basis. Not all plugins enable this feature. As an example, consider a configuration that aims to filter records using [grep](../../../pipeline/filters/grep.md) that only matches where labels have a color blue:
 
-```text
+```yaml
 [SERVICE]
     flush        1
     log_level    info
@@ -68,17 +68,17 @@ The feature is enabled on a per plugin basis, not all plugins enable this featur
 
 The file content to process in `test.log` is the following:
 
-```javascript
+```js
 {"log": "message 1", "labels": {"color": "blue"}}
 {"log": "message 2", "labels": {"color": "red"}}
 {"log": "message 3", "labels": {"color": "green"}}
 {"log": "message 4", "labels": {"color": "blue"}}
 ```
 
-Running Fluent Bit with the configuration above the output will be:
+When running Fluent Bit with the previous configuration, the output is:
 
 ```text
-$ bin/fluent-bit -c fluent-bit.conf 
+$ bin/fluent-bit -c fluent-bit.conf
 Fluent Bit v1.x.x
 * Copyright (C) 2019-2020 The Fluent Bit Authors
 * Copyright (C) 2015-2018 Treasure Data
@@ -95,11 +95,11 @@ Fluent Bit v1.x.x
 {"date":1599862267.483692,"log":"message 4","labels":{"color":"blue"}}
 ```
 
-### Limitations of record_accessor templating
+### Limitations of `record_accessor` templating
 
-The Fluent Bit record_accessor library has a limitation in the characters that can separate template variables- only dots and commas (`.` and `,`) can come after a template variable. This is because the templating library must parse the template and determine the end of a variable.
+The Fluent Bit `record_accessor` library has a limitation in the characters that can separate template variables. Only dots and commas (`.` and `,`) can come after a template variable. This is because the templating library must parse the template and determine the end of a variable.
 
-The following would be invalid templates because the two template variables are not separated by commas or dots:
+The following templates are invalid because the template variables aren't separated by commas or dots:
 
 - `$TaskID-$ECSContainerName`
 - `$TaskID/$ECSContainerName`
@@ -107,11 +107,13 @@ The following would be invalid templates because the two template variables are
 - `$TaskIDfooo$ECSContainerName`
 
 However, the following are valid:
+
 - `$TaskID.$ECSContainerName`
 - `$TaskID.ecs_resource.$ECSContainerName`
 - `$TaskID.fooo.$ECSContainerName`
 
 And the following are valid since they only contain one template variable with nothing after it:
+
 - `fooo$TaskID`
 - `fooo____$TaskID`
 - `fooo/bar$TaskID`
diff --git a/administration/configuring-fluent-bit/classic-mode/upstream-servers.md b/administration/configuring-fluent-bit/classic-mode/upstream-servers.md
index 11c95890a..8f3e3d3d9 100644
--- a/administration/configuring-fluent-bit/classic-mode/upstream-servers.md
+++ b/administration/configuring-fluent-bit/classic-mode/upstream-servers.md
@@ -1,64 +1,63 @@
-# Upstream Servers
+# Upstream servers
 
-It's common that Fluent Bit [output plugins](../../pipeline/outputs/) aims to connect to external services to deliver the logs over the network, this is the case of [HTTP](../../../pipeline/outputs/http.md), [Elasticsearch](../../../pipeline/outputs/elasticsearch.md) and [Forward](../../../pipeline/outputs/forward.md) within others. Being able to connect to one node \(host\) is normal and enough for more of the use cases, but there are other scenarios where balancing across different nodes is required. The _Upstream_ feature provides such capability.
+Fluent Bit [output plugins](../../../pipeline/outputs/) aim to connect to external services to deliver logs over the network. Being able to connect to one node (host) is normal and enough for more of the use cases, but there are other scenarios where balancing across different nodes is required. The `Upstream` feature provides this capability.
 
-An _Upstream_ defines a set of nodes that will be targeted by an output plugin, by the nature of the implementation an output plugin **must** support the _Upstream_ feature. The following plugin\(s\) have _Upstream_ support:
+An `Upstream` defines a set of nodes that will be targeted by an output plugin, by the nature of the implementation an output plugin must support the `Upstream` feature. The following plugin has `Upstream` support:
 
-* [Forward](../../../pipeline/outputs/forward.md)
+- [Forward](../../../pipeline/outputs/forward.md)
 
-The current balancing mode implemented is _round-robin_.
+The current balancing mode implemented is `round-robin`.
 
 ## Configuration
 
-To define an _Upstream_ it's required to create an specific configuration file that contains an UPSTREAM and one or multiple NODE sections. The following table describe the properties associated to each section. Note that all of them are mandatory:
+To define an `Upstream` you must create an specific configuration file that contains an `UPSTREAM` and one or multiple `NODE` sections. The following table describes the properties associated with each section. All properties are mandatory:
 
 | Section | Key | Description |
 | :--- | :--- | :--- |
-| UPSTREAM | name | Defines a name for the _Upstream_ in question. |
-| NODE | name | Defines a name for the _Node_ in question. |
-|  | host | IP address or hostname of the target host. |
-|  | port | TCP port of the target service. |
+| `UPSTREAM` | `name` | Defines a name for the `Upstream in question. |
+| `NODE` | `name` | Defines a name for the `Node` in question. |
+|  | `host` | IP address or hostname of the target host. |
+|  | `port` | TCP port of the target service. |
 
 ### Nodes and specific plugin configuration
 
-A _Node_ might contain additional configuration keys required by the plugin, on that way we provide enough flexibility for the output plugin, a common use case is Forward output where if TLS is enabled, it requires a shared key \(more details in the example below\).
+A `Node` might contain additional configuration keys required by the plugin, to provide enough flexibility for the output plugin. A common use case is a `Forward` output where if TLS is enabled, it requires a shared key.
 
-### Nodes and TLS \(Transport Layer Security\)
+### Nodes and TLS (Transport Layer Security)
 
-In addition to the properties defined in the table above, the network operations against a defined node can optionally be done through the use of TLS for further encryption and certificates use.
+In addition to the properties defined in the configuration table, the network operations against a defined node can optionally be done through the use of TLS for further encryption and certificates use.
 
 The TLS options available are described in the [TLS/SSL](../../transport-security.md) section and can be added to the any _Node_ section.
 
-### Configuration File Example
+### Configuration file example
 
-The following example defines an _Upstream_ called forward-balancing which aims to be used by Forward output plugin, it register three _Nodes_:
+The following example defines an `Upstream` called forward-balancing which aims to be used by Forward output plugin, it register three `Nodes`:
 
-* node-1: connects to 127.0.0.1:43000
-* node-2: connects to 127.0.0.1:44000
-* node-3: connects to 127.0.0.1:45000 using TLS without verification. It also defines a specific configuration option required by Forward output called _shared\_key_. 
+- node-1: connects to 127.0.0.1:43000
+- node-2: connects to 127.0.0.1:44000
+- node-3: connects to 127.0.0.1:45000 using TLS without verification. It also defines a specific configuration option required by Forward output called `shared_key`.
 
-```python
+```text
 [UPSTREAM]
-    name       forward-balancing
+  name       forward-balancing
 
 [NODE]
-    name       node-1
-    host       127.0.0.1
-    port       43000
+  name       node-1
+  host       127.0.0.1
+  port       43000
 
 [NODE]
-    name       node-2
-    host       127.0.0.1
-    port       44000
+  name       node-2
+  host       127.0.0.1
+  port       44000
 
 [NODE]
-    name       node-3
-    host       127.0.0.1
-    port       45000
-    tls        on
-    tls.verify off
-    shared_key secret
+  name       node-3
+  host       127.0.0.1
+  port       45000
+  tls        on
+  tls.verify off
+  shared_key secret
 ```
 
-Note that every _Upstream_ definition **must** exists on it own configuration file in the file system. Adding multiple _Upstreams_ in the same file or different files is not allowed.
-
+Every `Upstream` definition must exists in its own configuration file in the file system. Adding multiple `Upstream` configurations in the same file or different files isn't allowed.
\ No newline at end of file
diff --git a/administration/configuring-fluent-bit/classic-mode/variables.md b/administration/configuring-fluent-bit/classic-mode/variables.md
index 11e32a56b..3d944eeea 100644
--- a/administration/configuring-fluent-bit/classic-mode/variables.md
+++ b/administration/configuring-fluent-bit/classic-mode/variables.md
@@ -10,52 +10,45 @@ ${MY_VARIABLE}
 
 When Fluent Bit starts, the configuration reader will detect any request for `${MY_VARIABLE}` and will try to resolve its value.
 
-When Fluent Bit is running under systemd (using the official packages), environment variables can be set in the following files:
-* `/etc/default/fluent-bit` (Debian based system)
-* `/etc/sysconfig/fluent-bit` (Others)
+When Fluent Bit is running under [`systemd`](https://systemd.io/) (using the official packages), environment variables can be set in the following files:
 
-These files are ignored if they do not exist.
+- `/etc/default/fluent-bit` (Debian based system)
+- `/etc/sysconfig/fluent-bit` (Others)
+
+These files are ignored if they don't exist.
 
 ## Example
 
 Create the following configuration file \(`fluent-bit.conf`\):
 
-```text
+```yaml
 [SERVICE]
-    Flush        1
-    Daemon       Off
-    Log_Level    info
+  Flush        1
+  Daemon       Off
+  Log_Level    info
 
 [INPUT]
-    Name cpu
-    Tag  cpu.local
+  Name cpu
+  Tag  cpu.local
 
 [OUTPUT]
-    Name  ${MY_OUTPUT}
-    Match *
+  Name  ${MY_OUTPUT}
+  Match *
 ```
 
 Open a terminal and set the environment variable:
 
-```bash
-$ export MY_OUTPUT=stdout
+```shell
+export MY_OUTPUT=stdout
 ```
 
-> The above command set the 'stdout' value to the variable `MY_OUTPUT`.
+The previous command sets the `stdout` value to the variable `MY_OUTPUT`.
 
 Run Fluent Bit with the recently created configuration file:
 
-```text
+```shell
 $ bin/fluent-bit -c fluent-bit.conf
-Fluent Bit v1.4.0
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
 
-[2020/03/03 12:25:25] [ info] [engine] started
+...
 [0] cpu.local: [1491243925, {"cpu_p"=>1.750000, "user_p"=>1.750000, "system_p"=>0.000000, "cpu0.p_cpu"=>3.000000, "cpu0.p_user"=>2.000000, "cpu0.p_system"=>1.000000, "cpu1.p_cpu"=>0.000000, "cpu1.p_user"=>0.000000, "cpu1.p_system"=>0.000000, "cpu2.p_cpu"=>4.000000, "cpu2.p_user"=>4.000000, "cpu2.p_system"=>0.000000, "cpu3.p_cpu"=>1.000000, "cpu3.p_user"=>1.000000, "cpu3.p_system"=>0.000000}]
-```
-
-As you can see the service worked properly as the configuration was valid.
-
+```
\ No newline at end of file
diff --git a/administration/configuring-fluent-bit/files-schema-structure.md b/administration/configuring-fluent-bit/files-schema-structure.md
index 7cfd367cf..ec8730a57 100644
--- a/administration/configuring-fluent-bit/files-schema-structure.md
+++ b/administration/configuring-fluent-bit/files-schema-structure.md
@@ -1,2 +1 @@
-# Files Schema / Structure
-
+# Files schema and structure
diff --git a/administration/configuring-fluent-bit/multiline-parsing.md b/administration/configuring-fluent-bit/multiline-parsing.md
index f6fa1e379..a2ab9b531 100644
--- a/administration/configuring-fluent-bit/multiline-parsing.md
+++ b/administration/configuring-fluent-bit/multiline-parsing.md
@@ -1,125 +1,161 @@
-# Multiline Parsing
+# Multiline parsing
 
-In an ideal world, applications might log their messages within a single line, but in reality applications generate multiple log messages that sometimes belong to the same context. But when is time to process such information it gets really complex. Consider application stack traces which always have multiple log lines.
+In an ideal world, applications might log their messages within a single line, but in reality applications generate multiple log messages that sometimes belong to the same context. Processing this information can be complex, like in application stack traces, which always have multiple log lines.
 
-Starting from Fluent Bit v1.8, we have implemented a unified Multiline core functionality to solve all the user corner cases. In this section, you will learn about the features and configuration options available.
+Fluent Bit v1.8 implemented a unified Multiline core capability to solve corner cases.
 
 ## Concepts
 
-The Multiline parser engine exposes two ways to configure and use the functionality:
+The Multiline parser engine exposes two ways to configure and use the feature:
 
-* Built-in multiline parser
-* Configurable multiline parser
+- Built-in multiline parser
+- Configurable multiline parser
 
-### Built-in Multiline Parsers
+### Built-in multiline parsers
 
-Without any extra configuration, Fluent Bit exposes certain pre-configured parsers (built-in) to solve specific multiline parser cases, e.g:
+Fluent Bit exposes certain pre-configured parsers (built-in) to solve specific multiline parser cases. For example:
 
-| Parser | Description                                                                                                                             |
-| ------ | --------------------------------------------------------------------------------------------------------------------------------------- |
-| docker | Process a log entry generated by a Docker container engine. This parser supports the concatenation of log entries split by Docker.      |
-| cri    | Process a log entry generated by CRI-O container engine. Same as the _docker_ parser, it supports concatenation of log entries          |
-| go     | Process log entries generated by a Go based language application and perform concatenation if multiline messages are detected.          |
-| python | Process log entries generated by a Python based language application and perform concatenation if multiline messages are detected.      |
-| java   | Process log entries generated by a Google Cloud Java language application and perform concatenation if multiline messages are detected. |
+| Parser | Description |
+| ------ | ----------- |
+| `docker` | Process a log entry generated by a Docker container engine. This parser supports the concatenation of log entries split by Docker.      |
+| `cri` | Process a log entry generated by CRI-O container engine. Like the `docker` parser, it supports concatenation of log entries.          |
+| `go`     | Process log entries generated by a Go based language application and perform concatenation if multiline messages are detected.          |
+| `python` | Process log entries generated by a Python based language application and perform concatenation if multiline messages are detected.      |
+| `java`   | Process log entries generated by a Google Cloud Java language application and perform concatenation if multiline messages are detected. |
 
-### Configurable Multiline Parsers
+### Configurable multiline parsers
 
-Besides the built-in parsers listed above, through the configuration files is possible to define your own Multiline parsers with their own rules. 
+You can define your own Multiline parsers with their own rules, using a configuration file.
 
-A multiline parser is defined in a _parsers configuration file_ by using a `[MULTILINE_PARSER]` section definition. The Multiline parser must have a unique name and a type plus other configured properties associated with each type. 
+A multiline parser is defined in a `parsers configuration file` by using a `[MULTILINE_PARSER]` section definition. The multiline parser must have a unique name and a type, plus other configured properties associated with each type.
 
-To understand which Multiline parser type is required for your use case you have to know beforehand what are the conditions in the content that determines the beginning of a multiline message and the continuation of subsequent lines. We provide a regex based configuration that supports states to handle from the most simple to difficult cases.
+To understand which multiline parser type is required for your use case you have to know the conditions in the content that determine the beginning of a multiline message, and the continuation of subsequent lines. Fluent Bit provides a regular expression-based configuration that supports states to handle from the most cases.
 
-| Property      | Description                                                                                                                                                                                                                                                                                                                                                                                                               | Default |
-| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| name          | Specify a unique name for the Multiline Parser definition. A good practice is to prefix the name with the word `multiline_` to avoid confusion with normal parser's definitions.                                                                                                                                                                                                                                          |         |
-| type          | Set the multiline mode, for now, we support the type `regex`.                                                                                                                                                                                                                                                                                                                                                             |         |
-| parser        | <p>Name of a pre-defined parser that must be applied to the incoming content before applying the regex rule. If no parser is defined, it's assumed that's a raw text and not a structured message. </p><p></p><p>Note: when a parser is applied to a raw text, then the regex is applied against a specific key of the structured message by using the  <code>key_content</code>  configuration property (see below).</p> |         |
-| key_content   | For an incoming structured message, specify the key that contains the data that should be processed by the regular expression and possibly concatenated.                                                                                                                                                                                                                                                                  |         |
-| flush_timeout | Timeout in milliseconds to flush a non-terminated multiline buffer. Default is set to 5 seconds.                                                                                                                                                                                                                                                                                                                          | 5s      |
-| rule          | Configure a rule to match a multiline pattern. The rule has a specific format described below. Multiple rules can be defined.                                                                                                                                                                                                                                                                                             |         |
+| Property | Description | Default |
+| -------- | ----------- | ------- |
+| `name` | Specify a unique name for the multiline parser definition. A good practice is to prefix the name with the word `multiline_` to avoid confusion with normal parser definitions. | _none_ |
+| `type`          | Set the multiline mode. Fluent Bit supports the type `regex`.| _none_ |
+| `parser`        | Name of a pre-defined parser that must be applied to the incoming content before applying the regular expression rule. If no parser is defined, it's assumed that's a raw text and not a structured message. When a parser is applied to a raw text, the regular expression is applied against a specific key of the structured message by using the `key_content` configuration property. | _none_ |
+| `key_content`   | For an incoming structured message, specify the key that contains the data that should be processed by the regular expression and possibly concatenated. | _none_ |
+| `flush_timeout` | Timeout in milliseconds to flush a non-terminated multiline buffer. | `5s` |
+| `rule`          | Configure a rule to match a multiline pattern. The rule has a [specific format](#rules-definition). Multiple rules can be defined. | _none_|
 
-#### Lines and States
+#### Lines and states
 
-Before start configuring your parser you need to know the answer to the following questions:
+Before configuring your parser you need to know the answer to the following questions:
 
-1. What is the regular expression (regex) that matches the first line of a multiline message ?
-2. What are the regular expressions (regex) that match the continuation lines of a multiline message ?
+1. What's the regular expression (`regex`) that matches the first line of a multiline message?
+1. What are the regular expressions (`regex`) that match the continuation lines of a multiline message?
 
-When matching regex, we have to define **states**, some states define the start of a multiline message while others are states for the continuation of multiline messages. You can have multiple **continuation states** definitions to solve complex cases.
+When matching a regular expression, you must to define `states`. Some states define the start of a multiline message while others are states for the continuation of multiline messages. You can have multiple `continuation states` definitions to solve complex cases.
 
-The first regex that matches the start of a multiline message is called **start_state**, then other regexes continuation lines can have different state names.
+The first regular expression that matches the start of a multiline message is called `start_state`. Other regular expression continuation lines can have different state names.
 
-#### Rules Definition
+#### Rules definition
 
 A rule specifies how to match a multiline pattern and perform the concatenation. A rule is defined by 3 specific components:
 
-1. state name
-2. regular expression pattern
-3. next state 
+- state name
+- regular expression pattern
+- next state
 
-A rule might be defined as follows (comments added to simplify the definition) :
+A rule might be defined as follows (comments added to simplify the definition) in the corresponding YAML and classic configuration examples:
 
+{% tabs %}
+{% tab title="parsers_multiline.yaml" %}
+
+```yaml
+# rules |   state name  | regex pattern                  | next state
+# ------|---------------|--------------------------------------------
+rules:
+  - state: start_state
+    regex: '/([a-zA-Z]+ \d+ \d+\:\d+\:\d+)(.*)/'
+    next_state:  cont
+  - state: cont
+    regex: '/^\s+at.*/'
+    next_state: cont
 ```
+
+{% endtab %}
+{% tab title="parsers_multiline.conf" %}
+
+```text
 # rules   |   state name   | regex pattern                   | next state
 # --------|----------------|---------------------------------------------
 rule         "start_state"   "/([a-zA-Z]+ \d+ \d+\:\d+\:\d+)(.*)/"   "cont"
 rule         "cont"          "/^\s+at.*/"                      "cont"
 ```
 
-In the example above, we have defined two rules, each one has its own state name, regex patterns, and the next state name. Every field that composes a rule **must be** inside double quotes. 
-
-The first rule of state name **must always** be **start_state**, and the regex pattern **must** match the first line of a multiline message, also a next state must be set to specify how the possible continuation lines would look like.
-
-{% hint style="info" %}
-To simplify the configuration of regular expressions, you can use the Rubular web site. We have posted an example by using the regex described above plus a log line that matches the pattern:\
-\
-[https://rubular.com/r/NDuyKwlTGOvq2g](https://rubular.com/r/NDuyKwlTGOvq2g)
-{% endhint %}
+{% endtab %}
+{% endtabs %}
 
-#### Configuration Example
+This example defines two rules. Each rule has its own state name, regular expression patterns, and the next state name. Every field that composes a rule must be inside double quotes.
 
-The following example provides a full Fluent Bit configuration file for multiline parsing by using the definition explained above.
+The first rule of a state name must be `start_state`. The regular expression pattern must match the first line of a multiline message, and a next state must be set to specify what the possible continuation lines look like.
 
 {% hint style="info" %}
-The following example files can be located at:\
-\
-[https://github.com/fluent/fluent-bit/tree/master/documentation/examples/multiline/regex-001](https://github.com/fluent/fluent-bit/tree/master/documentation/examples/multiline/regex-001)
+To simplify the configuration of regular expressions, you can use the [Rubular](https://rubular.com/r/NDuyKwlTGOvq2g) web site. This link uses the regular expression described in the previous example, plus a log line that matches the pattern:
 {% endhint %}
 
-Example files content:
+#### Configuration example
+
+The following example provides a full Fluent Bit configuration file for multiline parsing by using the definition explained previously. It's provided in following YAML and classic configuration examples:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+This is the primary Fluent Bit YAML configuration file. It includes the `parsers_multiline.yaml` and tails the file `test.log`  by applying the multiline parser `multiline-regex-test`. Then it sends the processing to the standard output.
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+  parsers_file: parsers_multiline.yaml
+
+pipeline:
+  inputs:
+    - name: tail
+      path: test.log
+      read_from_head: true
+      multiline.parser: multiline-regex-test
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-This is the primary Fluent Bit configuration file. It includes the `parsers_multiline.conf` and tails the file `test.log` by applying the multiline parser `multiline-regex-test`. Then it sends the processing to the standard output. 
 
-```
+This is the primary Fluent Bit classic configuration file. It includes the `parsers_multiline.conf` and tails the file `test.log`  by applying the multiline parser `multiline-regex-test`. Then it sends the processing to the standard output.
+
+```text
 [SERVICE]
-    flush        1
-    log_level    info
-    parsers_file parsers_multiline.conf
+  flush        1
+  log_level    info
+  parsers_file parsers_multiline.conf
 
 [INPUT]
-    name             tail
-    path             test.log
-    read_from_head   true
-    multiline.parser multiline-regex-test
+  name             tail
+  path             test.log
+  read_from_head   true
+  multiline.parser multiline-regex-test
 
 [OUTPUT]
-    name             stdout
-    match            *
+  name             stdout
+  match            *
 ```
+
 {% endtab %}
+{% tab title="parsers_multiline.yaml" %}
 
-{% tab title="parsers_multiline.conf" %}
-This second file defines a multiline parser for the example.
+This file defines a multiline parser for the YAML configuration example.
 
-```
-[MULTILINE_PARSER]
-    name          multiline-regex-test
-    type          regex
-    flush_timeout 1000
+```yaml
+multiline_parsers:
+  - name: multiline-regex-test
+    type: regex
+    flush_timeout: 1000
     #
     # Regex rules for multiline parsing
     # ---------------------------------
@@ -131,15 +167,46 @@ This second file defines a multiline parser for the example.
     #
     # rules |   state name  | regex pattern                  | next state
     # ------|---------------|--------------------------------------------
-    rule      "start_state"   "/([a-zA-Z]+ \d+ \d+\:\d+\:\d+)(.*)/"  "cont"
-    rule      "cont"          "/^\s+at.*/"                     "cont"
+    rules:
+      - state: start_state
+        regex: '/([a-zA-Z]+ \d+ \d+\:\d+\:\d+)(.*)/'
+        next_state: cont
+      - state: cont
+        regex: '/^\s+at.*/'
+        next_state: cont
 ```
+
 {% endtab %}
+{% tab title="parsers_multiline.conf" %}
 
-{% tab title="test.log" %}
-An example file with multiline content:
+This second file defines a multiline parser for the classic configuration example.
 
+```text
+[MULTILINE_PARSER]
+  name          multiline-regex-test
+  type          regex
+  flush_timeout 1000
+  #
+  # Regex rules for multiline parsing
+  # ---------------------------------
+  #
+  # configuration hints:
+  #
+  #  - first state always has the name: start_state
+  #  - every field in the rule must be inside double quotes
+  #
+  # rules |   state name  | regex pattern                  | next state
+  # ------|---------------|--------------------------------------------
+  rule      "start_state"   "/([a-zA-Z]+ \d+ \d+\:\d+\:\d+)(.*)/"  "cont"
+  rule      "cont"          "/^\s+at.*/"                     "cont"
 ```
+
+{% endtab %}
+{% tab title="test.log" %}
+
+The example log file with multiline content:
+
+```text
 single line...
 Dec 14 06:41:08 Exception in thread "main" java.lang.RuntimeException: Something has gone wrong, aborting!
     at com.myproject.module.MyProject.badMethod(MyProject.java:22)
@@ -150,82 +217,117 @@ Dec 14 06:41:08 Exception in thread "main" java.lang.RuntimeException: Something
 another line...
 
 ```
+
 {% endtab %}
 {% endtabs %}
 
-By running Fluent Bit with the given configuration file you will obtain:
+By running Fluent Bit with the corresponding configuration file you will obtain the following output:
 
-```
-$ fluent-bit -c fluent-bit.conf 
+```shell
+# For YAML configuration.
+$ ./fluent-bit --config fluent-bit.yaml
+
+# For classic configuration.
+$ ./fluent-bit --config fluent-bit.conf
 
-[0] tail.0: [0.000000000, {"log"=>"single line...
+...
+[0] tail.0: [[1750332967.679671000, {}], {"log"=>"single line...
 "}]
-[1] tail.0: [1626634867.472226330, {"log"=>"Dec 14 06:41:08 Exception in thread "main" java.lang.RuntimeException: Something has gone wrong, aborting!
+[1] tail.0: [[1750332967.679677000, {}], {"log"=>"Dec 14 06:41:08 Exception in thread "main" java.lang.RuntimeException: Something has gone wrong, aborting!
     at com.myproject.module.MyProject.badMethod(MyProject.java:22)
     at com.myproject.module.MyProject.oneMoreMethod(MyProject.java:18)
     at com.myproject.module.MyProject.anotherMethod(MyProject.java:14)
     at com.myproject.module.MyProject.someMethod(MyProject.java:10)
     at com.myproject.module.MyProject.main(MyProject.java:6)
 "}]
-[2] tail.0: [1626634867.472226330, {"log"=>"another line...
+[2] tail.0: [[1750332967.679677000, {}], {"log"=>"another line...
 "}]
-
 ```
 
-The lines that did not match a pattern are not considered as part of the multiline message, while the ones that matched the rules were concatenated properly.
+The lines that didn't match a pattern aren't considered as part of the multiline message, while the ones that matched the rules were concatenated properly.
 
 ## Limitations
 
 The multiline parser is a very powerful feature, but it has some limitations that you should be aware of:
 
-* The multiline parser is not affected by the `buffer_max_size` configuration option, allowing the composed log record to grow beyond this size.
-Hence, the `skip_long_lines` option will not be applied to multiline messages. 
-* It is not possible to get the time key from the body of the multiline message. However, it can be extracted and set as a new key by using a filter.
+- The multiline parser isn't affected by the `buffer_max_size` configuration option, allowing the composed log record to grow beyond this size. The `skip_long_lines` option won't be applied to multiline messages.
+- It's not possible to get the time key from the body of the multiline message. However, it can be extracted and set as a new key by using a filter.
 
 ## Get structured data from multiline message
 
-Fluent-bit supports `/pat/m` option. It allows `.` matches a new line. It is useful to parse multiline log.
+Fluent-bit supports the `/pat/m` option. It allows `.` matches a new line, which can be used to parse multiline logs.
 
-The following example is to get `date` and `message` from concatenated log.
+The following example retrieves `date` and `message` from concatenated logs.
 
 Example files content:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+This is the primary Fluent Bit YAML configuration file. It includes the `parsers_multiline.conf` and tails the file `test.log`  by applying the multiline parser `multiline-regex-test`. It also parses concatenated log by applying parser `named-capture-test`.  Then it sends the processing to the standard output.
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+  parsers_file: parsers_multiline.yaml
+
+pipeline:
+  inputs:
+    - name: tail
+      path: test.log
+      read_from_head: true
+      multiline.parser: multiline-regex-test
+
+  filters:
+    - name: parser
+      match: '*'
+      key_name: log
+      parser: named-capture-test
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-This is the primary Fluent Bit configuration file. It includes the `parsers_multiline.conf` and tails the file `test.log` by applying the multiline parser `multiline-regex-test`. It also parses concatenated log by applying parser `named-capture-test`. Then it sends the processing to the standard output.
 
-```
+This is the primary Fluent Bit classic configuration file. It includes the `parsers_multiline.conf` and tails the file  `test.log` by applying the multiline parser `multiline-regex-test`. It also parses concatenated log by applying parser  `named-capture-test`. Then it sends the processing to the standard output.
+
+```text
 [SERVICE]
-    flush        1
-    log_level    info
-    parsers_file parsers_multiline.conf
+  flush        1
+  log_level    info
+  parsers_file parsers_multiline.conf
 
 [INPUT]
-    name             tail
-    path             test.log
-    read_from_head   true
-    multiline.parser multiline-regex-test
+  name             tail
+  path             test.log
+  read_from_head   true
+  multiline.parser multiline-regex-test
 
 [FILTER]
-    name             parser
-    match            *
-    key_name         log
-    parser           named-capture-test
+  name             parser
+  match            *
+  key_name         log
+  parser           named-capture-test
 
 [OUTPUT]
-    name             stdout
-    match            *
+  name             stdout
+  match            *
 ```
+
 {% endtab %}
+{% tab title="parsers_multiline.yaml" %}
 
-{% tab title="parsers_multiline.conf" %}
-This second file defines a multiline parser for the example.
+This file defines a multiline parser for the YAML example.
 
-```
-[MULTILINE_PARSER]
-    name          multiline-regex-test
-    type          regex
-    flush_timeout 1000
+```yaml
+multiline_parsers:
+  - name: multiline-regex-test
+    type: regex
+    flush_timeout: 1000
     #
     # Regex rules for multiline parsing
     # ---------------------------------
@@ -237,20 +339,57 @@ This second file defines a multiline parser for the example.
     #
     # rules |   state name  | regex pattern                  | next state
     # ------|---------------|--------------------------------------------
-    rule      "start_state"   "/([a-zA-Z]+ \d+ \d+\:\d+\:\d+)(.*)/"  "cont"
-    rule      "cont"          "/^\s+at.*/"                     "cont"
+    rules:
+      - state: start_state
+        regex: '/([a-zA-Z]+ \d+ \d+\:\d+\:\d+)(.*)/'
+        next_state:  cont
+
+      - state: cont
+        regex: '/^\s+at.*/'
+        next_state: cont
+
+parsers:
+  - name: named-capture-test
+    format: regex
+    regex: '/^(?<date>[a-zA-Z]+ \d+ \d+\:\d+\:\d+) (?<message>.*)/m'
+ ```
+
+{% endtab %}
+{% tab title="parsers_multiline.conf" %}
+
+This file defines a multiline parser for the classic example.
+
+```text
+[MULTILINE_PARSER]
+  name          multiline-regex-test
+  type          regex
+  flush_timeout 1000
+  #
+  # Regex rules for multiline parsing
+  # ---------------------------------
+  #
+  # configuration hints:
+  #
+  #  - first state always has the name: start_state
+  #  - every field in the rule must be inside double quotes
+  #
+  # rules |   state name  | regex pattern                  | next state
+  # ------|---------------|--------------------------------------------
+  rule      "start_state"   "/([a-zA-Z]+ \d+ \d+\:\d+\:\d+)(.*)/"  "cont"
+  rule      "cont"          "/^\s+at.*/"                     "cont"
 
 [PARSER]
-    Name named-capture-test
-    Format regex
-    Regex /^(?<date>[a-zA-Z]+ \d+ \d+\:\d+\:\d+) (?<message>.*)/m
+  Name named-capture-test
+  Format regex
+  Regex /^(?<date>[a-zA-Z]+ \d+ \d+\:\d+\:\d+) (?<message>.*)/m
 ```
-{% endtab %}
 
+{% endtab %}
 {% tab title="test.log" %}
-An example file with multiline content:
 
-```
+The example log file with multiline content:
+
+```text
 single line...
 Dec 14 06:41:08 Exception in thread "main" java.lang.RuntimeException: Something has gone wrong, aborting!
     at com.myproject.module.MyProject.badMethod(MyProject.java:22)
@@ -259,25 +398,29 @@ Dec 14 06:41:08 Exception in thread "main" java.lang.RuntimeException: Something
     at com.myproject.module.MyProject.someMethod(MyProject.java:10)
     at com.myproject.module.MyProject.main(MyProject.java:6)
 another line...
-
 ```
+
 {% endtab %}
 {% endtabs %}
 
-By running Fluent Bit with the given configuration file you will obtain:
+By running Fluent Bit with the corresponding configuration file you will obtain:
 
-```
-$ fluent-bit -c fluent-bit.conf
+```shell
+# For YAML configuration.
+$ ./fluent-bit --config fluent-bit.yaml
+
+# For classic configuration
+$ ./fluent-bit --config fluent-bit.conf
 
-[0] tail.0: [1669160706.737650473, {"log"=>"single line...
+[0] tail.0: [[1750333602.460984000, {}], {"log"=>"single line...
 "}]
-[1] tail.0: [1669160706.737657687, {"date"=>"Dec 14 06:41:08", "message"=>"Exception in thread "main" java.lang.RuntimeException: Something has gone wrong, aborting!
+[1] tail.0: [[1750333602.460998000, {}], {"date"=>"Dec 14 06:41:08", "message"=>"Exception in thread "main" java.lang.RuntimeException: Something has gone wrong, aborting!
     at com.myproject.module.MyProject.badMethod(MyProject.java:22)
     at com.myproject.module.MyProject.oneMoreMethod(MyProject.java:18)
     at com.myproject.module.MyProject.anotherMethod(MyProject.java:14)
     at com.myproject.module.MyProject.someMethod(MyProject.java:10)
     at com.myproject.module.MyProject.main(MyProject.java:6)
 "}]
-[2] tail.0: [1669160706.737657687, {"log"=>"another line...
+[2] tail.0: [[1750333602.460998000, {}], {"log"=>"another line...
 "}]
 ```
\ No newline at end of file
diff --git a/administration/configuring-fluent-bit/unit-sizes.md b/administration/configuring-fluent-bit/unit-sizes.md
index 391c53a06..8808b589e 100644
--- a/administration/configuring-fluent-bit/unit-sizes.md
+++ b/administration/configuring-fluent-bit/unit-sizes.md
@@ -1,13 +1,12 @@
-# Unit Sizes
+# Unit sizes
 
-Certain configuration directives in Fluent Bit refer to unit sizes such as when defining the size of a buffer or specific limits, we can find these in plugins like [Tail Input](https://github.com/fluent/fluent-bit-docs/tree/5f926fd1330690179b8c1edab90d672699599ec7/administration/input/tail.md), [Forward Input](https://github.com/fluent/fluent-bit-docs/tree/5f926fd1330690179b8c1edab90d672699599ec7/administration/input/forward.md) or in generic properties like [Mem\_Buf\_Limit](https://github.com/fluent/fluent-bit-docs/tree/5f926fd1330690179b8c1edab90d672699599ec7/administration/configuring-fluent-bit/backpressure.md).
+Some configuration directives in [Fluent Bit](http://fluentbit.io) refer to unit sizes such as when defining the size of a buffer or specific limits. Plugins like [Tail Input](../../pipeline/inputs/tail.md), [Forward Input](../../pipeline/inputs/forward.md), or generic properties like [`Mem_Buf_Limit`](../backpressure.md) use unit sizes.
 
-Starting from [Fluent Bit](http://fluentbit.io) v0.11.10, all unit sizes have been standardized across the core and plugins, the following table describes the options that can be used and what they mean:
+Fluent Bit v0.11.10 standardized unit sizes across the core and plugins. The following table describes the options that can be used and what they mean:
 
 | Suffix | Description | Example |
 | :--- | :--- | :--- |
-|  | When a suffix is **not** specified, it's assumed that the value given is a bytes representation. | Specifying a value of 32000, means 32000 bytes |
-| k, K, KB, kb | Kilobyte: a unit of memory equal to 1,000 bytes. | 32k means 32000 bytes. |
-| m, M, MB, mb | Megabyte: a unit of memory equal to 1,000,000 bytes | 1M means 1000000 bytes |
-| g, G, GB, gb | Gigabyte: a unit of memory equal to 1,000,000,000 bytes | 1G means 1000000000 bytes |
-
+|  | When a suffix isn't specified, assume that the value given is a bytes representation. | Specifying a value of `32000` means 32000 bytes. |
+| `k`, `K`, `KB`, `kb` | Kilobyte: a unit of memory equal to 1,000 bytes. | `32k` means 32000 bytes. |
+| `m`, `M`, `MB`, `mb` | Megabyte: a unit of memory equal to 1,000,000 bytes. | `1M` means 1000000 bytes. |
+| `g`, `G`, `GB`, `gb` | Gigabyte: a unit of memory equal to 1,000,000,000 bytes. | `1G` means 1000000000 bytes. |
diff --git a/administration/configuring-fluent-bit/yaml/README.md b/administration/configuring-fluent-bit/yaml/README.md
index ce6e7f8c4..7d8c51566 100644
--- a/administration/configuring-fluent-bit/yaml/README.md
+++ b/administration/configuring-fluent-bit/yaml/README.md
@@ -1,3 +1,44 @@
-# Fluent Bit YAML configuration
+# YAML configuration
 
-YAML configuration feature was introduced since FLuent Bit version 1.9 as experimental, and it is production ready since Fluent Bit 2.0.
+## Before you get started
+
+Fluent Bit traditionally offered a `classic` configuration mode, a custom configuration format that's phasing out. While `classic` mode has served well for many years, it has several limitations. Its basic design only supports grouping sections with key-value pairs and lacks the ability to handle sub-sections or complex data structures like lists.
+
+YAML has become essential in a cloud ecosystem. To minimize friction and provide a more intuitive experience for creating data pipelines, users are encouraged to transition to YAML. The YAML format enables features, such as processors, that aren't possible to configure in `classic` mode.
+
+As of Fluent Bit v3.2, you can configure everything in YAML.
+
+## List of available sections
+
+Configuring Fluent Bit with YAML introduces the following root-level sections:
+
+| Section Name | Description |
+|--------------|-------------|
+| `service` | Describes the global configuration for the Fluent Bit service. Optional. If not set, default values will apply. Only one `service` section can be defined. |
+| `parsers` | Lists parsers to be used by components like inputs, processors, filters, or output plugins. You can define multiple `parsers` sections, which can also be loaded from external files included in the main YAML configuration. |
+| `multiline_parsers`  | Lists multiline parsers, functioning similarly to `parsers`. Multiple definitions can exist either in the root or in included files. |
+| `pipeline` | Defines a pipeline composed of inputs, processors, filters, and output plugins. You can define multiple `pipeline` sections, but they won't operate independently. Instead, all components will be merged into a single pipeline internally. |
+| `plugins` | Specifies the path to external plugins (`.so` files) to be loaded by Fluent Bit at runtime. |
+| `upstream_servers` | Refers to a group of node endpoints that can be referenced by output plugins that support this feature. |
+| `env` | Sets a list of environment variables for Fluent Bit. System environment variables are available, while the ones defined in the configuration apply only to Fluent Bit. |
+
+## Section documentation
+
+To access detailed configuration guides for each section, use the following links:
+
+- [Service Section documentation](service-section.md)
+  - Overview of global settings, configuration options, and examples.
+- [Parsers Section documentation](parsers-section.md)
+  - Detailed guide on defining parsers and supported formats.
+- [Multiline Parsers Section documentation](multiline-parsers-section.md)
+  - Explanation of multiline parsing configuration.
+- [Pipeline Section documentation](pipeline-section.md)
+  - Details on setting up pipelines and using processors.
+- [Plugins Section documentation](plugins-section.md)
+  - How to load external plugins.
+- [Upstream Servers Section documentation](upstream-servers-section.md)
+  - Guide on setting up and using upstream nodes with supported plugins.
+- [Environment Variables Section documentation](environment-variables-section.md)
+  - Information on setting environment variables and their scope within Fluent Bit.
+- [Includes Section documentation](includes-section.md)
+  - Description on how to include external YAML files.
diff --git a/administration/configuring-fluent-bit/yaml/configuration-file.md b/administration/configuring-fluent-bit/yaml/configuration-file.md
index 0205ccc5f..23be9488f 100644
--- a/administration/configuring-fluent-bit/yaml/configuration-file.md
+++ b/administration/configuring-fluent-bit/yaml/configuration-file.md
@@ -1,36 +1,40 @@
 ---
-description: This page describes the yaml configuration file used by Fluent Bit
+description: Learn about the YAML configuration file used by Fluent Bit
 ---
 
-# YAML Configuration File
+# YAML configuration file
+
+<img referrerpolicy="no-referrer-when-downgrade"
+src="https://static.scarf.sh/a.png?x-pxid=864c6f0e-8977-4838-8772-84416943548e" alt="" />
 
 One of the ways to configure Fluent Bit is using a YAML configuration file that works at a global scope.
 
 The YAML configuration file supports the following sections:
 
-* Env
-* Includes
-* Service
-* Pipeline
-  * Inputs
-  * Filters
-  * Outputs
+- `Env`
+- `Includes`
+- `Service`
+- `Pipeline`
+  - `Inputs`
+  - `Filters`
+  - `Outputs`
+
+The YAML configuration file doesn't support the following sections:
 
-The YAML configuration file does not support the following sections yet:
-* Parsers
+- `Parsers`
 
 {% hint style="info" %}
-YAML configuration is used in the smoke tests for containers, so an always-correct up-to-date example is here: <https://github.com/fluent/fluent-bit/blob/master/packaging/testing/smoke/container/fluent-bit.yaml>.
+YAML configuration is used in the smoke tests for containers. An always-correct up-to-date example is here: <https://github.com/fluent/fluent-bit/blob/master/packaging/testing/smoke/container/fluent-bit.yaml>.
 {% endhint %}
 
-## Env <a href="config_env" id="config_env"></a>
+## `env`
 
-The _env_ section allows the definition of configuration variables that will be used later in the configuration file.
+The `env` section allows the definition of configuration variables that will be used later in the configuration file.
 
 Example:
 
 ```yaml
-# setting up a local environment variable
+# Set up a local environment variable
 env:
     flush_interval: 1
 
@@ -41,11 +45,9 @@ service:
     http_server: on
 ```
 
+## Includes
 
-
-## Includes<a href="config_env" id="config_env"></a>
-
-The _includes_ section allows the files to be merged into the YAML configuration to be identified as a list of filenames. If no path is provided, then the file is assumed to be in a folder relative to the file referencing it.
+The `includes` section allows the files to be merged into the YAML configuration to be identified as a list of filenames. If no path is provided, then the file is assumed to be in a folder relative to the file referencing it.
 
 Example:
 
@@ -57,31 +59,31 @@ includes:
 
 ```
 
-## Service <a href="config_section" id="config_section"></a>
-
-The _service_ section defines the global properties of the service. The Service keys available as of this version are described in the following table:
-
-| Key             | Description                                                                                                                                                                                                                                                                                             | Default Value |
-| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- |
-| flush           | Set the flush time in `seconds.nanoseconds`. The engine loop uses a Flush timeout to define when is required to flush the records ingested by input plugins through the defined output plugins.                                                                                                         | 5             |
-| grace           | Set the grace time in `seconds` as an Integer value. The engine loop uses a Grace timeout to define the wait time on exit                                                                                                                                                                               | 5             |
-| daemon          | Boolean value to set if Fluent Bit should run as a Daemon (background) or not. Allowed values are: yes, no, on, and off.  note: If you are using a Systemd based unit like the one we provide in our packages, do not turn on this option.                                                            | Off           |
-| dns.mode        | Sets the primary transport layer protocol used by the asynchronous DNS resolver, which can be overridden on a per plugin basis                                                                                                                                                                       | UDP           |
-| log_file        | Absolute path for an optional log file. By default, all logs are redirected to the standard error interface (stderr).                                                                                                                                                                                   |               |
-| log_level       | Set the logging verbosity level. Allowed values are: off, error, warn, info, debug and trace. Values are accumulative, e.g., if 'debug' is set, it will include error, warning, info, and debug.  Note that _trace_ mode is only available if Fluent Bit was built with the _WITH\_TRACE_ option enabled. | info          |
-| parsers_file    | Path for a `parsers` configuration file. Only a single entry is currently supported.                                                                                                                                                                                               |               |
-| plugins_file    | Path for a `plugins` configuration file. A _plugins_ configuration file allows the definition of paths for external plugins; for an example, [see here](https://github.com/fluent/fluent-bit/blob/master/conf/plugins.conf).                                                         |               |
-| streams_file    | Path for the Stream Processor configuration file. To learn more about Stream Processing configuration go [here](../../../stream-processing/introduction.md).                                                                                                                                               |               |
-| http_server     | Enable built-in HTTP Server                                                                                                                                                                                                                                                                             | Off           |
-| http_listen     | Set listening interface for HTTP Server when it's enabled                                                                                                                                                                                                                                               | 0.0.0.0       |
-| http_port       | Set TCP Port for the HTTP Server                                                                                                                                                                                                                                                                        | 2020          |
-| coro_stack_size | Set the coroutines stack size in bytes. The value must be greater than the page size of the running system. Don't set too small a value (say 4096), or coroutine threads can overrun the stack buffer. Do not change the default value of this parameter unless you know what you are doing.            | 24576         |
-| scheduler.cap   | Set a maximum retry time in seconds. The property is supported from v1.8.7.                                                                                                                                                                                                                             | 2000          |
-| scheduler.base  | Sets the base of exponential backoff. The property is supported from v1.8.7.                                                                                                                                                                                                                          | 5             |
-| json.convert_nan_to_null | If enabled, NaN is converted to null when fluent-bit converts msgpack to json.    | false         |
-| sp.convert_from_str_to_num | If enabled, Stream processor converts from number string to number type.        | true          |
-
-The following is an example of a _service_ section:
+## Service
+
+The `service` section defines the global properties of the service. The Service keys available as of this version are described in the following table:
+
+| Key | Description | Default Value |
+| --- | ----------- | ------------- |
+| `flush`  | Set the flush time in `seconds.nanoseconds`. The engine loop uses a Flush timeout to define when to flush the records ingested by input plugins through the defined output plugins. | `5` |
+| `grace`  | Set the grace time in `seconds` as an Integer value. The engine loop uses a Grace timeout to define the wait time on exit. | `5` |
+| `daemon` | Boolean value to set if Fluent Bit should run as a Daemon (background) or not. Allowed values are: `yes`, `no`, `on`, and `off`. If you are using a Systemd based unit like the one provided in the Fluent Bit packages, don't turn on this option. | `Off` |
+| `dns.mode` | Sets the primary transport layer protocol used by the asynchronous DNS resolver, which can be overridden on a per plugin basis | `UDP` |
+| `log_file` | Absolute path for an optional log file. By default, all logs are redirected to the standard error interface(`stderr`). | _none_ |
+| `log_level` | Set the logging verbosity level. Allowed values are: `off`, `error`, `warn`, `info`, `debug`, and `trace`. Values are accumulative. For example, if `debug` is set, it will include `error`, `warning`, `info`, and `debug`. `trace` mode is only available if Fluent Bit was built with the `WITH_TRACE` option enabled. | `info` |
+| `parsers_file` | Path for a `parsers` configuration file. Only a single entry is supported. | _none_ |
+| `plugins_file` | Path for a `plugins` configuration file. A `plugins` configuration file allows the definition of paths for external plugins; for an example, [see here](https://github.com/fluent/fluent-bit/blob/master/conf/plugins.conf). | _none_ |
+| `streams_file` | Path for the Stream Processor configuration file. Learn more about [Stream Processing configuration](../../../stream-processing/introduction.md). | _none_ |
+| `http_server` | Enable built-in HTTP server. | `Off` |
+| `http_listen` | Set listening interface for HTTP server when it's enabled. | `0.0.0.0` |
+| `http_port` | Set TCP Port for the HTTP server | `2020` |
+| `coro_stack_size` | Set the coroutines stack size in bytes. The value must be greater than the page size of the running system. Don't set too small a value (for example, `4096`), or coroutine threads can overrun the stack buffer. Don't change the default value of this parameter unless you know what you are doing. | `24576` |
+| `scheduler.cap`   | Set a maximum retry time in seconds. Supported from v1.8.7. | `2000` |
+| `scheduler.base`  | Sets the base of exponential backoff. Supported from v1.8.7. | `5` |
+| `json.convert_nan_to_null` | If enabled, NaN is converted to null when Fluent Bit converts `msgpack` to JSON. | `false` |
+| `sp.convert_from_str_to_num` | If enabled, Stream processor converts from number string to number type. | `true |
+
+The following is an example of a `service` section:
 
 ```yaml
 service:
@@ -90,11 +92,11 @@ service:
     log_level: debug
 ```
 
-For scheduler and retry details, please check there: [scheduling and retries](../../scheduling-and-retries.md#Scheduling-and-Retries)
+For scheduler and retry details, see [scheduling and retries](../../scheduling-and-retries.md#Scheduling-and-Retries)
 
-## Pipeline <a href="config_pipeline" id="config_pipeline"></a>
+## Pipeline
 
-A _pipeline_ section will define a complete pipeline configuration, including _inputs_, _filters_ and _outputs_ subsections.
+A `pipeline` section will define a complete pipeline configuration, including `inputs`, `filters`, and `outputs` subsections.
 
 ```yaml
 pipeline:
@@ -106,7 +108,9 @@ pipeline:
         ...
 ```
 
-Each of the subsections for _inputs_, _filters_ and _outputs_ constitutes an array of maps that has the parameters for each. Most properties are either simple strings or numbers so can be define directly, ie:
+Each of the subsections for `inputs`, `filters`, and `outputs` constitutes an array of maps that has the parameters for each. Most properties are either strings or numbers and can be defined directly.
+
+For example:
 
 ```yaml
 pipeline:
@@ -119,9 +123,9 @@ pipeline:
           port: 8080
 ```
 
-This pipeline consists of two _inputs_; a tail plugin and an http server plugin. Each plugin has its own map in the array of _inputs_ consisting of simple properties. To use more advanced properties that consist of multiple values the property itself can be defined using an array, ie: the _record_ and _allowlist_key_ properties for the _record_modifier_ _filter_:
+This pipeline consists of two `inputs`: a tail plugin and an HTTP server plugin. Each plugin has its own map in the array of `inputs` consisting of basic properties. To use more advanced properties that consist of multiple values the property itself can be defined using an array, such as the `record` and `allowlist_key` properties for the `record_modifier` `filter`:
 
-```
+```yaml
 pipeline:
     inputs:
         - name: tail
@@ -139,23 +143,23 @@ pipeline:
               - message
 ```
 
-In the cases where each value in a list requires two values they must be separated by a space, such as in the _record_ property for the _record_modifier_ filter.
+In the cases where each value in a list requires two values they must be separated by a space, such as in the `record` property for the `record_modifier` filter.
 
-### Input <a href="config_input" id="config_input"></a>
+### Input
 
-An _input_ section defines a source (related to an input plugin). Here we will describe the base configuration for each _input_ section. Note that each input plugin may add it own configuration keys:
+An `input` section defines a source (related to an input plugin). Each section has a base configuration. Each input plugin can add it own configuration keys:
 
-| Key         | Description                                                                                                                                             |
-| ----------- |-------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Name        | Name of the input plugin. Defined as subsection of the _inputs_ section.                                                                                |
-| Tag         | Tag name associated to all records coming from this plugin.                                                                                             |
-| Log_Level   | Set the plugin's logging verbosity level. Allowed values are: off, error, warn, info, debug and trace. Defaults to the _SERVICE_ section's _Log_Level._ |
+| Key | Description |
+| --- |------------ |
+| `Name` | Name of the input plugin. Defined as subsection of the `inputs` section. |
+| `Tag` | Tag name associated to all records coming from this plugin. |
+| `Log_Level` | Set the plugin's logging verbosity level. Allowed values are: `off`, `error`, `warn`, `info`, `debug`, and `trace`. Defaults to the `SERVICE` section's `Log_Level`. |
 
-The _Name_ is mandatory and it lets Fluent Bit know which input plugin should be loaded. The _Tag_ is mandatory for all plugins except for the _input forward_ plugin (as it provides dynamic tags).
+The `Name` is mandatory and defines for Fluent Bit which input plugin should be loaded. `Tag` is mandatory for all plugins except for the `input forward` plugin which provides dynamic tags.
 
 #### Example input
 
-The following is an example of an _input_ section for the _cpu_ plugin.
+The following is an example of an `input` section for the `cpu` plugin.
 
 ```yaml
 pipeline:
@@ -164,22 +168,22 @@ pipeline:
           tag: my_cpu
 ```
 
-### Filter <a href="config_filter" id="config_filter"></a>
+### Filter
 
-A _filter_ section defines a filter (related to a filter plugin). Here we will describe the base configuration for each _filter_ section. Note that each filter plugin may add its own configuration keys:
+A `filter` section defines a filter (related to a filter plugin). Each section has a base configuration and each filter plugin can add its own configuration keys:
 
 | Key         | Description                                                  |
 | ----------- | ------------------------------------------------------------ |
-| Name        | Name of the filter plugin. Defined as a subsection of the _filters_ section. |
-| Match       | A pattern to match against the tags of incoming records. It's case-sensitive and supports the star (\*) character as a wildcard. |
-| Match_Regex | A regular expression to match against the tags of incoming records. Use this option if you want to use the full regex syntax. |
-| Log_Level   | Set the plugin's logging verbosity level. Allowed values are: off, error, warn, info, debug and trace. Defaults to the _SERVICE_ section's _Log_Level._ |
+| `Name`        | Name of the filter plugin. Defined as a subsection of the `filters` section. |
+| `Match`       | A pattern to match against the tags of incoming records. It's case-sensitive and supports the star (`*`) character as a wildcard. |
+| `Match_Regex` | A regular expression to match against the tags of incoming records. Use this option if you want to use the full regular expression syntax. |
+| `Log_Level`   | Set the plugin's logging verbosity level. Allowed values are: `off`, `error`, `warn`, `info`, `debug`, and `trace`. Defaults to the `SERVICE` section's `Log_Level`. |
 
-The _Name_ is mandatory and it lets Fluent Bit know which filter plugin should be loaded. The _Match_ or _Match_Regex_ is mandatory for all plugins. If both are specified, _Match_Regex_ takes precedence.
+`Name` is mandatory and lets Fluent Bit know which filter plugin should be loaded. The `Match` or `Match_Regex` is mandatory for all plugins. If both are specified, `Match_Regex` takes precedence.
 
 #### Example filter
 
-The following is an example of a _filter_ section for the grep plugin:
+The following is an example of a `filter` section for the `grep` plugin:
 
 ```yaml
 pipeline:
@@ -189,20 +193,20 @@ pipeline:
           regex: log aa
 ```
 
-### Output <a href="config_output" id="config_output"></a>
+### Output
 
-The _outputs_ section specify a destination that certain records should follow after a Tag match. Currently, Fluent Bit can route up to 256 _OUTPUT_ plugins. The configuration supports the following keys:
+The `outputs` section specifies a destination that certain records should follow after a `Tag` match. Fluent Bit can route up to 256 `OUTPUT` plugins. The configuration supports the following keys:
 
 | Key         | Description                                                  |
 | ----------- | ------------------------------------------------------------ |
-| Name        | Name of the output plugin. Defined as a subsection of the _outputs_ section. |
-| Match       | A pattern to match against the tags of incoming records. It's case-sensitive and supports the star (\*) character as a wildcard. |
-| Match_Regex | A regular expression to match against the tags of incoming records. Use this option if you want to use the full regex syntax. |
-| Log_Level   | Set the plugin's logging verbosity level. Allowed values are: off, error, warn, info, debug and trace. The output log level defaults to the _SERVICE_ section's _Log_Level._ |
+| `Name`        | Name of the output plugin. Defined as a subsection of the `outputs` section. |
+| `Match`       | A pattern to match against the tags of incoming records. It's case-sensitive and supports the star (`*`) character as a wildcard. |
+| `Match_Regex` | A regular expression to match against the tags of incoming records. Use this option if you want to use the full regular expression syntax. |
+| `Log_Level`   | Set the plugin's logging verbosity level. Allowed values are: `off`, `error`, `warn`, `info`, `debug`, and `trace`. The output log level defaults to the `SERVICE` section's `Log_Level`. |
 
 #### Example output
 
-The following is an example of an _output_ section:
+The following is an example of an `output` section:
 
 ```yaml
 pipeline:
@@ -211,7 +215,7 @@ pipeline:
           match: 'my*cpu'
 ```
 
-#### Example: collecting CPU metrics
+#### Collecting `cpu` metrics example
 
 The following configuration file example demonstrates how to collect CPU metrics and flush the results every five seconds to the standard output:
 
@@ -230,17 +234,17 @@ pipeline:
           match: 'my*cpu'
 ```
 
-## Processors <a href="config_processors" id="config_processors"></a>
+## Processors
 
-In recent versions of Fluent-Bit, the input and output plugins can run in separate threads. In Fluent-Bit 2.1.2, we have implemented a new interface called "processor" to extend the processing capabilities in input and output plugins directly without routing the data. This interface allows users to apply data transformations and filtering to incoming data records before they are processed further in the pipeline.
+Fluent Bit 2.1.2 and greater implements an interface called `processor` to extend the processing capabilities in input and output plugins directly without routing the data. The input and output plugins can run in separate threads. This interface allows users to apply data transformations and filtering to incoming data records before they're processed further in the pipeline.
 
-This functionality is only exposed in YAML configuration and not in classic configuration mode due to the restriction of nested levels of configuration.
+This capability is only exposed in YAML configuration and not in classic configuration mode due to the restriction of nested levels of configuration.
 
 [Processor example](configuration-file.md#example-using-processors)
 
-### Example: Using processors.
+### Example: Using processors
 
-The following configuration file example demonstrates the use of processors to change the log record in the input plugin section by adding a new key "hostname" with the value "monox", and we use lua to append the tag to the log record. Also in the ouput plugin section we added a new key named "output" with the value "new data". All these without the need of routing the logs further in the pipeline.
+The following configuration file example demonstrates the use of processors to change the log record in the input plugin section by adding a new key `hostname` with the value `monox`. It uses Lua to append the tag to the log record. The output plugin section adds a new key named `output` with the value `new data`.
 
 ```yaml
   service:
diff --git a/administration/configuring-fluent-bit/yaml/environment-variables-section.md b/administration/configuring-fluent-bit/yaml/environment-variables-section.md
new file mode 100644
index 000000000..e982c443e
--- /dev/null
+++ b/administration/configuring-fluent-bit/yaml/environment-variables-section.md
@@ -0,0 +1,65 @@
+# Environment variables
+
+The `env` section lets you define environment variables directly within the configuration file. These variables can then be used to dynamically replace values throughout your configuration using the `${VARIABLE_NAME}` syntax.
+
+Variables set in this section can't be overridden by system environment variables.
+
+Values set in the `env` section are case-sensitive. However, as a best practice, Fluent Bit recommends using uppercase names for environment variables. The following example defines two variables, `FLUSH_INTERVAL` and `STDOUT_FMT`, which can be accessed in the configuration using `${FLUSH_INTERVAL}` and `${STDOUT_FMT}`:
+
+```yaml
+env:
+  FLUSH_INTERVAL: 1
+  STDOUT_FMT: 'json_lines'
+
+service:
+  flush: ${FLUSH_INTERVAL}
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: random
+
+  outputs:
+    - name: stdout
+      match: '*'
+      format: ${STDOUT_FMT}
+```
+
+## Predefined variables
+
+Fluent Bit provides a set of predefined environment variables that can be used in your configuration:
+
+| Name | Description |
+| ---- | ----------- |
+| `${HOSTNAME}` | The system's hostname. |
+
+## External variables
+
+In addition to variables defined in the configuration file or the predefined ones, Fluent Bit can access system environment variables set in the user space. These external variables can be referenced in the configuration using the same `${VARIABLE_NAME}` pattern.
+
+Variables set in the `env` section can't be overridden by system environment variables.
+
+For example, to set the `FLUSH_INTERVAL` system environment variable to `2` and use it in your configuration:
+
+```shell
+export FLUSH_INTERVAL=2
+```
+
+In the configuration file, you can then access this value as follows:
+
+```yaml
+service:
+  flush: ${FLUSH_INTERVAL}
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: random
+
+  outputs:
+    - name: stdout
+      match: '*'
+      format: json_lines
+```
+
+This approach lets you manage and override configuration values using environment variables, providing flexibility in various deployment environments.
\ No newline at end of file
diff --git a/administration/configuring-fluent-bit/yaml/includes-section.md b/administration/configuring-fluent-bit/yaml/includes-section.md
new file mode 100644
index 000000000..216f89fed
--- /dev/null
+++ b/administration/configuring-fluent-bit/yaml/includes-section.md
@@ -0,0 +1,28 @@
+# Includes
+
+The `includes` section lets you specify additional YAML configuration files to be merged into the current configuration. These files are identified as a list of filenames and can include relative or absolute paths. If no absolute path is provided, the file is assumed to be located in a directory relative to the file that references it.
+
+Use this section to organize complex configurations into smaller, manageable files and include them as needed.
+
+## Usage
+
+The following example demonstrates how to include additional YAML files using relative path references. This is the file system path structure:
+
+```text
+├── fluent-bit.yaml
+├── inclusion-1.yaml
+└── subdir
+    └── inclusion-2.yaml
+```
+
+The content of `fluent-bit.yaml`:
+
+```yaml
+includes:
+  - inclusion-1.yaml
+  - subdir/inclusion-2.yaml
+```
+
+Ensure that the included files are formatted correctly and contain valid YAML configurations for seamless integration.
+
+If a path isn't specified as absolute, it will be treated as relative to the file that includes it.
diff --git a/administration/configuring-fluent-bit/yaml/multiline-parsers-section.md b/administration/configuring-fluent-bit/yaml/multiline-parsers-section.md
new file mode 100644
index 000000000..570f3dc58
--- /dev/null
+++ b/administration/configuring-fluent-bit/yaml/multiline-parsers-section.md
@@ -0,0 +1,25 @@
+# Multiline parsers
+
+Multiline parsers are used to combine logs that span multiple events into a single, cohesive message. Use this parser for handling stack traces, error logs, or any log entry that contains multiple lines of information.
+
+In YAML configuration, the syntax for defining multiline parsers differs slightly from the classic configuration format introducing minor breaking changes, specifically on how the rules are defined.
+
+The following example demonstrates how to define a multiline parser directly in the main configuration file, and how to include additional definitions from external files:
+
+```yaml
+multiline_parsers:
+  - name: multiline-regex-test
+    type: regex
+    flush_timeout: 1000
+    rules:
+      - state: start_state
+        regex: '/([a-zA-Z]+ \d+ \d+:\d+:\d+)(.*)/'
+        next_state: cont
+      - state: cont
+        regex: '/^\s+at.*/'
+        next_state: cont
+```
+
+This example defines a multiline parser named `multiline-regex-test` that uses regular expressions to handle multi-event logs. The parser contains two rules: the first rule transitions from `start_state` to cont when a matching log entry is detected, and the second rule continues to match subsequent lines.
+
+For more detailed information on configuring multiline parsers, including advanced options and use cases, refer to the Configuring Multiline Parsers documentation.
diff --git a/administration/configuring-fluent-bit/yaml/parsers-section.md b/administration/configuring-fluent-bit/yaml/parsers-section.md
new file mode 100644
index 000000000..bb946758a
--- /dev/null
+++ b/administration/configuring-fluent-bit/yaml/parsers-section.md
@@ -0,0 +1,23 @@
+# Parsers
+
+Parsers enable Fluent Bit components to transform unstructured data into a structured internal representation. You can define parsers either directly in the main configuration file or in separate external files for better organization.
+
+This page provides a general overview of how to declare parsers.
+
+The main section name is `parsers`, and it lets you define a list of parser configurations. The following example demonstrates how to set up two basic parsers:
+
+```yaml
+parsers:
+  - name: json
+    format: json
+
+  - name: docker
+    format: json
+    time_key: time
+    time_format: "%Y-%m-%dT%H:%M:%S.%L"
+    time_keep: true
+```
+
+You can define multiple parsers sections, either within the main configuration file or distributed across included files.
+
+For more detailed information on parser options and advanced configurations, refer to the [Configuring Parsers](../../../pipeline/parsers/configuring-parser.md) documentation.
diff --git a/administration/configuring-fluent-bit/yaml/pipeline-section.md b/administration/configuring-fluent-bit/yaml/pipeline-section.md
new file mode 100644
index 000000000..21a0f7381
--- /dev/null
+++ b/administration/configuring-fluent-bit/yaml/pipeline-section.md
@@ -0,0 +1,184 @@
+# Pipeline
+
+The `pipeline` section defines the flow of how data is collected, processed, and sent to its final destination. It encompasses the following core concepts:
+
+| Name | Description |
+| ---- | ----------- |
+| `inputs` | Specifies the name of the plugin responsible for collecting or receiving data. This component serves as the data source in the pipeline. Examples of input plugins include `tail`, `http`, and `random`. |
+| `processors` | **Unique to YAML configuration**, processors are specialized plugins that handle data processing directly attached to input plugins. Unlike filters, processors aren't dependent on tag or matching rules. Instead, they work closely with the input to modify or enrich the data before it reaches the filtering or output stages. Processors are defined within an input plugin section. |
+| `filters` | Filters are used to transform, enrich, or discard events based on specific criteria. They allow matching tags using strings or regular expressions, providing a more flexible way to manipulate data. Filters run as part of the main event loop and can be applied across multiple inputs and filters. Examples of filters include `modify`, `grep`, and `nest`. |
+| `outputs` | Defines the destination for processed data. Outputs specify where the data will be sent, such as to a remote server, a file, or another service. Each output plugin is configured with matching rules to determine which events are sent to that destination. Common output plugins include `stdout`, `elasticsearch`, and `kafka`. |
+
+## Example configuration
+
+{% hint style="info" %}
+
+**Note:** Processors can be enabled only by using the YAML configuration format. Classic mode configuration format  doesn't support processors.
+
+{% endhint %}
+
+Here's an example of a pipeline configuration:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+    inputs:
+        - name: tail
+          path: /var/log/example.log
+          parser: json
+
+          processors:
+              logs:
+                  - name: record_modifier
+
+    filters:
+        - name: grep
+          match: '*'
+          regex: key pattern
+
+    outputs:
+        - name: stdout
+          match: '*'
+```
+
+{% endtab %}
+{% endtabs %}
+
+## Pipeline processors
+
+Processors operate on specific signals such as logs, metrics, and traces. They're attached to an input plugin and must specify the signal type they will process.
+
+### Example of a processor
+
+In the following example, the `content_modifier` processor inserts or updates (upserts) the key `my_new_key` with the value `123` for all log records generated by the tail plugin. This processor is only applied to log signals:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+parsers:
+    - name: json
+      format: json
+
+pipeline:
+      inputs:
+          - name: tail
+            path: /var/log/example.log
+            parser: json
+
+            processors:
+                logs:
+                    - name: content_modifier
+                      action: upsert
+                      key: my_new_key
+                      value: 123
+
+      filters:
+          - name: grep
+            match: '*'
+            regex: key pattern
+
+      outputs:
+          - name: stdout
+            match: '*'
+```
+
+{% endtab %}
+{% endtabs %}
+
+Here is a more complete example with multiple processors:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+    log_level: info
+    http_server: on
+    http_listen: 0.0.0.0
+    http_port: 2021
+
+pipeline:
+    inputs:
+        - name: random
+          tag: test-tag
+          interval_sec: 1
+
+          processors:
+              logs:
+                  - name: modify
+                    add: hostname monox
+
+                  - name: lua
+                    call: append_tag
+                    code: |
+                      function append_tag(tag, timestamp, record)
+                          new_record = record
+                          new_record["tag"] = tag
+                          return 1, timestamp, new_record
+                      end
+
+    outputs:
+        - name: stdout
+          match: '*'
+
+          processors:
+              logs:
+                  - name: lua
+                    call: add_field
+                    code: |
+                      function add_field(tag, timestamp, record)
+                          new_record = record
+                          new_record["output"] = "new data"
+                          return 1, timestamp, new_record
+                      end
+```
+
+{% endtab %}
+{% endtabs %}
+
+Processors can be attached to inputs and outputs.
+
+### How processors are different from filters
+
+While processors and filters are similar in that they can transform, enrich, or drop data from the pipeline, there is a significant difference in how they operate:
+
+- Processors: Run in the same thread as the input plugin when the input plugin is configured to be threaded (threaded: true). This design provides better performance, especially in multi-threaded setups.
+
+- Filters: Run in the main event loop. When multiple filters are used, they can introduce performance overhead, particularly under heavy workloads.
+
+## Running filters as processors
+
+You can configure existing [Filters](https://docs.fluentbit.io/manual/pipeline/filters) to run as processors. There are no specific changes needed; you use the filter name as if it were a native processor.
+
+### Example of a filter running as a processor
+
+In the following example, the `grep` filter is used as a processor to filter log events based on a pattern:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+parsers:
+    - name: json
+      format: json
+
+pipeline:
+    inputs:
+        - name: tail
+          path: /var/log/example.log
+          parser: json
+
+          processors:
+              logs:
+                  - name: grep
+                    regex: log aa
+    outputs:
+        - name: stdout
+          match: '*'
+```
+
+{% endtab %}
+{% endtabs %}
diff --git a/administration/configuring-fluent-bit/yaml/plugins-section.md b/administration/configuring-fluent-bit/yaml/plugins-section.md
new file mode 100644
index 000000000..c446ada1d
--- /dev/null
+++ b/administration/configuring-fluent-bit/yaml/plugins-section.md
@@ -0,0 +1,50 @@
+# Plugins
+
+Fluent Bit comes with a variety of built-in plugins, and also supports loading external plugins at runtime. This feature is especially useful for loading Go or WebAssembly (Wasm) plugins that are built as shared object files (`.so`). Fluent Bit YAML configuration provides the following ways to load these external plugins:
+
+## Inline YAML
+
+You can specify external plugins directly within your main YAML configuration file using the `plugins` section. Here's an example:
+
+```yaml
+plugins:
+  - /path/to/out_gstdout.so
+
+service:
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: random
+
+  outputs:
+    - name: gstdout
+      match: '*'
+```
+
+## YAML plugins file included using the `plugins_file` option
+
+You can load external plugins from a separate YAML file by specifying the `plugins_file` option in the service section for better modularity.
+
+To configure this:
+
+```yaml
+service:
+  log_level: info
+  plugins_file: extra_plugins.yaml
+
+pipeline:
+  inputs:
+    - name: random
+
+  outputs:
+    - name: gstdout
+      match: '*'
+```
+
+In this setup, the `extra_plugins.yaml` file might contain the following plugins section:
+
+```yaml
+plugins:
+  - /other/path/to/out_gstdout.so
+```
diff --git a/administration/configuring-fluent-bit/yaml/service-section.md b/administration/configuring-fluent-bit/yaml/service-section.md
new file mode 100644
index 000000000..ffa6581db
--- /dev/null
+++ b/administration/configuring-fluent-bit/yaml/service-section.md
@@ -0,0 +1,46 @@
+# Service
+
+The `service` section defines global properties of the service. The available configuration keys are:
+
+| Key | Description                                                                                                                                                                                                                                                                                                                                                                                                                                          | Default |
+|---|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---|
+| `flush` | Sets the flush time in `seconds.nanoseconds`. The engine loop uses a flush timeout to determine when to flush records ingested by input plugins to output plugins.                                                                                                                                                                                                                                                                                   | `1` |
+| `grace` | Sets the grace time in `seconds` as an integer value. The engine loop uses a grace timeout to define the wait time before exiting.                                                                                                                                                                                                                                                                                                                   | `5` |
+| `daemon` | Boolean. Specifies whether Fluent Bit should run as a daemon (background process). Allowed values are: `yes`, `no`, `on`, and `off`. Don't enable when using a Systemd-based unit, such as the one provided in Fluent Bit packages.                                                                                                                                                                                                                  | `off` |
+| `dns.mode` | Sets the primary transport layer protocol used by the asynchronous DNS resolver. Can be overridden on a per-plugin basis.                                                                                                                                                                                                                                                                                                                            | `UDP` |
+| `log_file` | Absolute path for an optional log file. By default, all logs are redirected to the standard error interface (stderr).                                                                                                                                                                                                                                                                                                                                | _none_ |
+| `log_level` | Sets the logging verbosity level. Allowed values are: `off`, `error`, `warn`, `info`, `debug`, and `trace`. Values are cumulative. If `debug` is set, it will include `error`, `warn`, `info`, and `debug`. Trace mode is only available if Fluent Bit was built with the _`WITH_TRACE`_ option enabled.                                                                                                                                             | `info` |
+| `parsers_file` | Path for a `parsers` configuration file. Multiple `parsers_file` entries can be defined within the section. However, with the new YAML configuration schema, defining parsers using this key is now optional. Parsers can be declared directly in the `parsers` section of your YAML configuration, offering a more streamlined and integrated approach.                                                                                             | _none_ |
+| `plugins_file` | Path for a `plugins` configuration file. This file specifies the paths to external plugins (.so files) that Fluent Bit can load at runtime. With the new YAML schema, the `plugins_file` key is optional. External plugins can now be referenced directly within the `plugins` section, simplifying the plugin management process. [See an example](https://github.com/fluent/fluent-bit/blob/master/conf/plugins.conf).                             | _none_ |
+| `streams_file` | Path for the Stream Processor configuration file. This file defines the rules and operations for stream processing within Fluent Bit. The `streams_file` key is optional, as Stream Processor configurations can be defined directly in the `streams` section of the YAML schema. This flexibility allows for easier and more centralized configuration. [Learn more about Stream Processing configuration](../../../stream-processing/introduction.md). | _none_ |
+| `http_server` | Enables the built-in HTTP Server.                                                                                                                                                                                                                                                                                                                                                                                                                    | `off` |
+| `http_listen` | Sets the listening interface for the HTTP Server when it's enabled.                                                                                                                                                                                                                                                                                                                                                                                  | `0.0.0.0` |
+| `http_port` | Sets the TCP port for the HTTP Server.                                                                                                                                                                                                                                                                                                                                                                                                               | `2020` |
+| `hot_reload` | Enables [hot reloading](../../hot-reload.md) of configuration with SIGHUP.                                                                                                                                                                                                                                                                                                                                                                           | `on` |
+| `coro_stack_size` | Sets the coroutine stack size in bytes. The value must be greater than the page size of the running system. Setting the value too small (`4096`) can cause coroutine threads to overrun the stack buffer. The default value of this parameter shouldn't be changed.                                                                                                                                                                                  | `24576` |
+| `scheduler.cap` | Sets a maximum retry time in seconds. Supported in v1.8.7 and greater.                                                                                                                                                                                                                                                                                                                                                                               | `2000` |
+| `scheduler.base` | Sets the base of exponential backoff. Supported in v1.8.7 and greater.                                                                                                                                                                                                                                                                                                                                                                               | `5` |
+| `json.convert_nan_to_null` | If enabled, `NaN` is converted to `null` when Fluent Bit converts `msgpack` to `json`.                                                                                                                                                                                                                                                                                                                                                               | `false` |
+| `sp.convert_from_str_to_num` | If enabled, the Stream Processor converts strings that represent numbers to a numeric type.                                                                                                                                                                                                                                                                                                                                                          | `true` |
+
+## Configuration example
+
+The following configuration example that defines a `service` section with [hot reloading](../../hot-reload.md) enabled and a pipeline with a `random` input and `stdout` output:
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+  http_server: true
+  http_listen: 0.0.0.0
+  http_port: 2020
+  hot_reload: on
+
+pipeline:
+  inputs:
+    - name: random
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
diff --git a/administration/configuring-fluent-bit/yaml/upstream-servers-section.md b/administration/configuring-fluent-bit/yaml/upstream-servers-section.md
new file mode 100644
index 000000000..0301c3462
--- /dev/null
+++ b/administration/configuring-fluent-bit/yaml/upstream-servers-section.md
@@ -0,0 +1,40 @@
+# Upstream servers
+
+The `upstream_servers` section defines a group of endpoints, referred to as nodes. Nodes are used by output plugins to distribute data in a round-robin fashion. Use this section for plugins that require load balancing when sending data. Examples of plugins that support this capability include [Forward](https://docs.fluentbit.io/manual/pipeline/outputs/forward) and [Elasticsearch](https://docs.fluentbit.io/manual/pipeline/outputs/elasticsearch).
+
+The `upstream_servers` section require specifying a `name` for the group and a list
+of `nodes`. The following example defines two upstream server groups, `forward-balancing` and `forward-balancing-2`:
+
+```yaml
+upstream_servers:
+  - name: forward-balancing
+    nodes:
+      - name: node-1
+        host: 127.0.0.1
+        port: 43000
+
+      - name: node-2
+        host: 127.0.0.1
+        port: 44000
+
+      - name: node-3
+        host: 127.0.0.1
+        port: 45000
+        tls: true
+        tls_verify: false
+        shared_key: secret
+
+  - name: forward-balancing-2
+    nodes:
+      - name: node-A
+        host: 192.168.1.10
+        port: 50000
+
+      - name: node-B
+        host: 192.168.1.11
+        port: 51000
+```
+
+Each node in the `upstream_servers` group must specify a `name`, `host`, and `port`. Additional settings like `tls`, `tls_verify`, and `shared_key` can be configured for secure communication.
+
+While the `upstream_servers` section can be defined globally, some output plugins might require the configuration to be specified in a separate YAML file. Consult the documentation for each specific output plugin to understand its requirements.
diff --git a/administration/hot-reload.md b/administration/hot-reload.md
index 5a60b21c6..77caf885c 100644
--- a/administration/hot-reload.md
+++ b/administration/hot-reload.md
@@ -2,64 +2,76 @@
 description: Enable hot reload through SIGHUP signal or an HTTP endpoint
 ---
 
-# Hot Reload
+# Hot reload
 
-Fluent Bit supports the hot reloading feature when enabled via the configuration file or command line with `-Y` or `--enable-hot-reload` option.
+Fluent Bit supports the reloading feature when enabled in the configuration file or on the command line with `-Y` or `--enable-hot-reload` option.
 
-## Getting Started
+Hot reloading is supported on Linux, macOS, and Windows operating systems.
 
-To get started with reloading via HTTP, the first step is to enable the HTTP Server from the configuration file:
+## Update the configuration
 
-```toml
+To get started with reloading over HTTP, enable the HTTP Server in the configuration file:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  http_server: on
+  http_listen: 0.0.0.0
+  http_port: 2020
+  hot_reload: on
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [SERVICE]
-    HTTP_Server  On
-    HTTP_Listen  0.0.0.0
-    HTTP_PORT    2020
-    Hot_Reload   On
-...
+  HTTP_Server  On
+  HTTP_Listen  0.0.0.0
+  HTTP_PORT    2020
+  Hot_Reload   On
 ```
 
-The above configuration snippet will enable the HTTP endpoint for hot reloading.
+{% endtab %}
+{% endtabs %}
 
 ## How to reload
 
-### Via HTTP
+After updating the configuration, use one of the following methods to perform a hot reload:
 
-Hot reloading can be kicked via HTTP endpoints that are:
+### HTTP
 
-* `PUT /api/v2/reload`
-* `POST /api/v2/reload`
+Use the following HTTP endpoints to perform a hot reload:
 
-If users don't enable the hot reloading feature, hot reloading via these endpoints will not work.
+- `PUT /api/v2/reload`
+- `POST /api/v2/reload`
 
 For using curl to reload Fluent Bit, users must specify an empty request body as:
 
-```text
-$ curl -X POST -d '{}' localhost:2020/api/v2/reload
+```shell
+curl -X POST -d '{}' localhost:2020/api/v2/reload
 ```
 
-### Via Signal
-
-Hot reloading also can be kicked via `SIGHUP`.
+Obtain a count of hot reload using the HTTP endpoint:
 
-`SIGHUP` signal is not supported on Windows. So, users can't enable this feature on Windows.
+- `GET /api/v2/reload`
 
-## How to confirm reloaded or not
-
-### via HTTP
-
-The number of hot reloaded count can be obtained via the HTTP endpoint that is:
-
-* `GET /api/v2/reload`
-
-The endpoint returns the count of hot-reloaded as follows:
+The endpoint returns `hot_reload_count` as follows:
 
 ```json
 {"hot_reload_count":3}
 ```
 
-The default value of that number is 0.
+The default value of the counter is `0`.
+
+### Signal
+
+Hot reloading can be used with `SIGHUP`.
+
+`SIGHUP` signal isn't supported on Windows.
 
-## Limitations
+## Confirm a reload
 
-The hot reloading feature is currently working on Linux, macOS and Windows.
+Use one of the following methods to confirm the reload occurred.
diff --git a/administration/http-proxy.md b/administration/http-proxy.md
index 840aca9ac..7928cc56b 100644
--- a/administration/http-proxy.md
+++ b/administration/http-proxy.md
@@ -1,63 +1,63 @@
 ---
-description: Enable traffic through a proxy server via HTTP_PROXY environment variable
+description: Enable traffic through a proxy server using the HTTP_PROXY environment variable.
 ---
 
-# HTTP Proxy
+# HTTP proxy
 
-Fluent Bit supports configuring an HTTP proxy for all egress HTTP/HTTPS traffic via the `HTTP_PROXY` or `http_proxy` environment variable.
+Fluent Bit supports configuring an HTTP proxy for all egress HTTP/HTTPS traffic using the `HTTP_PROXY` or `http_proxy` environment variable.
 
 The format for the HTTP proxy environment variable is `http://USER:PASS@HOST:PORT`, where:
 
-* `USER` is the username when using basic authentication.
-* `PASS` is the password when using basic authentication.
-* `HOST` is the HTTP proxy hostname or IP address.
-* `PORT` is the port the HTTP proxy is listening on.
+- _`USER`_ is the username when using basic authentication.
+- _`PASS`_ is the password when using basic authentication.
+- _`HOST`_ is the HTTP proxy hostname or IP address.
+- _`PORT`_ is the port the HTTP proxy is listening on.
 
 To use an HTTP proxy with basic authentication, provide the username and password:
 
-```bash
+```text
 HTTP_PROXY='http://example_user:example_pass@proxy.example.com:8080'
 ```
 
 When no authentication is required, omit the username and password:
 
-```bash
+```text
 HTTP_PROXY='http://proxy.example.com:8080'
 ```
 
-The `HTTP_PROXY` environment variable is a [standard way](https://docs.docker.com/network/proxy/#use-environment-variables) for setting a HTTP proxy in a containerized environment, and it is also natively supported by any application written in Go. Therefore, we follow and implement the same convention for Fluent Bit. For convenience and compatibility, the `http_proxy` environment variable is also supported. When both the `HTTP_PROXY` and `http_proxy` environment variables are provided, `HTTP_PROXY` will be preferred.
+The `HTTP_PROXY` environment variable is a [standard way](https://docs.docker.com/network/proxy/#use-environment-variables) of setting a HTTP proxy in a containerized environment, and it's also natively supported by any application written in Go. Fluent Bit implements the same convention. The `http_proxy` environment variable is also supported. When both the `HTTP_PROXY` and `http_proxy` environment variables are provided, `HTTP_PROXY` will be preferred.
 
 {% hint style="info" %}
-**Note**: The [HTTP output plugin](https://docs.fluentbit.io/manual/pipeline/outputs/http) also supports configuring an HTTP proxy. This configuration continues to work, however it _should not_ be used together with the `HTTP_PROXY` or `http_proxy` environment variable. This is because under the hood, the environment variable based proxy configuration is implemented by setting up a TCP connection tunnel via [HTTP CONNECT](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/CONNECT). Unlike the plugin's implementation, this supports both HTTP and HTTPS egress traffic.
+
+The [HTTP output plugin](https://docs.fluentbit.io/manual/pipeline/outputs/http) also supports configuring an HTTP proxy. This configuration works, but shouldn't be used with the `HTTP_PROXY` or `http_proxy` environment variable. The environment variable-based proxy configuration is implemented by creating a TCP connection tunnel using [HTTP CONNECT](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/CONNECT). Unlike the plugin's implementation, this supports both HTTP and HTTPS egress traffic.
+
 {% endhint %}
 
-# NO_PROXY
+## `NO_PROXY`
 
-Not all traffic should flow through the HTTP proxy. In this case, the `NO_PROXY` or `no_proxy` environment variable should be used.
+Use the `NO_PROXY` environment variable when traffic shouldn't flow through the HTTP proxy. The `no_proxy` environment variable is also supported. When both `NO_PROXY` and `no_proxy` environment variables are provided, `NO_PROXY` takes precedence.
 
-The format for the no proxy environment variable is a comma-separated list of hostnames or IP addresses whose traffic should not flow through the HTTP proxy.
+The format for the `no_proxy` environment variable is a comma-separated list of host names or IP addresses.
 
-A domain name matches itself and all its subdomains (i.e. `foo.com` matches `foo.com` and `bar.foo.com`):
+A domain name matches itself and all of its subdomains (for example, `example.com` matches both `example.com` and `test.example.com`):
 
-```bash
+```text
 NO_PROXY='foo.com,127.0.0.1,localhost'
 ```
 
-A domain with a leading `.` only matches its subdomains (i.e. `.foo.com` matches `bar.foo.com` but not `foo.com`):
+A domain with a leading dot (`.`) matches only its subdomains (for example, `.example.com` matches `test.example.com` but not `example.com`):
 
-```bash
-NO_PROXY='.foo.com,127.0.0.1,localhost'
+```text
+NO_PROXY='.example.com,127.0.0.1,localhost'
 ```
 
-One typical use case for `NO_PROXY` is when running Fluent Bit in a Kubernetes environment, where we want:
+As an example, you might use `NO_PROXY` when running Fluent Bit in a Kubernetes environment, where and you want:
 
-* All real egress traffic to flow through an HTTP proxy.
-* All local Kubernetes traffic to not flow through the HTTP proxy.
+- All real egress traffic to flow through an HTTP proxy.
+- All local Kubernetes traffic to not flow through the HTTP proxy.
 
-In this case, we can set:
+In this case, set:
 
-```bash
+```text
 NO_PROXY='127.0.0.1,localhost,kubernetes.default.svc'
 ```
-
-For convenience and compatibility, the `no_proxy` environment variable is also supported. When both the `NO_PROXY` and `no_proxy` environment variables are provided, `NO_PROXY` will be preferred.
diff --git a/administration/memory-management.md b/administration/memory-management.md
index dd8d33f4c..b54e63783 100644
--- a/administration/memory-management.md
+++ b/administration/memory-management.md
@@ -1,28 +1,27 @@
-# Memory Management
+# Memory management
 
-In certain scenarios it would be ideal to estimate how much memory Fluent Bit could be using, this is very useful for containerized environments where memory limits are a must.
+You might need to estimate how much memory Fluent Bit could be using in scenarios like containerized environments where memory limits are essential.
 
-In order to that we will assume that the input plugins have set the **Mem\_Buf\_Limit** option \(you can learn more about it in the [Backpressure](backpressure.md) section\).
+To make an estimate, in-use input plugins must set the `Mem_Buf_Limit`option. Learn more about it in [Backpressure](backpressure.md).
 
 ## Estimating
 
-Input plugins append data independently, so in order to do an estimation, a limit should be imposed through the **Mem\_Buf\_Limit** option. If the limit was set to _10MB_ we need to estimate that in the worse case, the output plugin likely could use _20MB_.
+Input plugins append data independently. To make an estimation, impose a limit with the `Mem_Buf_Limit` option. If the limit was set to `10MB`, you can estimate that in the worst case, the output plugin likely could use `20MB`.
 
-Fluent Bit has an internal binary representation for the data being processed, but when this data reaches an output plugin, it will likely create its own representation in a new memory buffer for processing. 
-The best examples are the [InfluxDB](../pipeline/outputs/influxdb.md) and [Elasticsearch](../pipeline/outputs/elasticsearch.md) output plugins, both need to convert the binary representation to their respective custom JSON formats before it can be sent to the backend servers.
+Fluent Bit has an internal binary representation for the data being processed. When this data reaches an output plugin, it can create its own representation in a new memory buffer for processing. The best examples are the [InfluxDB](../pipeline/outputs/influxdb.md) and [Elasticsearch](../pipeline/outputs/elasticsearch.md) output plugins, which need to convert the binary representation to their respective custom JSON formats before sending data to the backend servers.
 
-So, if we impose a limit of _10MB_ for the input plugins and consider the worse case scenario of the output plugin consuming _20MB_ extra, as a minimum we need \(_30MB_ x 1.2\) = **36MB**.
+When imposing a limit of `10MB` for the input plugins, and a worst case scenario of the output plugin consuming `20MB`, you need to allocate a minimum (`30MB` x 1.2) = `36MB`.
 
-## Glibc and Memory Fragmentation
+## Glibc and memory fragmentation
 
-It is well known that in intensive environments where memory allocations happen in the orders of magnitude, the default memory allocator provided by Glibc could lead to high fragmentation, reporting a high memory usage by the service.
+In intensive environments where memory allocations happen in the orders of magnitude, the default memory allocator provided by Glibc could lead to high fragmentation, reporting a high memory usage by the service.
 
-It's strongly suggested that in any production environment, Fluent Bit should be built with [jemalloc](http://jemalloc.net/) enabled \(e.g. `-DFLB_JEMALLOC=On`\). Jemalloc is an alternative memory allocator that can reduce fragmentation \(among others things\) resulting in better performance.
+It's strongly suggested that in any production environment, Fluent Bit should be built with [jemalloc](http://jemalloc.net/) enabled (`-DFLB_JEMALLOC=On`). The jemalloc implementation of `malloc` is an alternative memory allocator that can reduce fragmentation, resulting in better performance.
 
-You can check if Fluent Bit has been built with Jemalloc using the following command:
+Use the following command to determine if Fluent Bit has been built with jemalloc:
 
-```text
-$ bin/fluent-bit -h | grep JEMALLOC
+```shell
+fluent-bit -h | grep JEMALLOC
 ```
 
 The output should look like:
@@ -34,5 +33,4 @@ FLB_HAVE_PROXY_GO FLB_HAVE_JEMALLOC JEMALLOC_MANGLE FLB_HAVE_REGEX
 FLB_HAVE_C_TLS FLB_HAVE_SETJMP FLB_HAVE_ACCEPT4 FLB_HAVE_INOTIFY
 ```
 
-If the FLB\_HAVE\_JEMALLOC option is listed in _Build Flags_, everything will be fine.
-
+If the `FLB_HAVE_JEMALLOC` option is listed in `Build Flags`, jemalloc is enabled.
diff --git a/administration/monitoring.md b/administration/monitoring.md
index 0d6fae6dc..065215731 100644
--- a/administration/monitoring.md
+++ b/administration/monitoring.md
@@ -2,56 +2,86 @@
 description: Learn how to monitor your Fluent Bit data pipelines
 ---
 
-# Monitoring
+# Monitor data pipelines
 
-Fluent Bit comes with built-it features to allow you to monitor the internals of your pipeline, connect to Prometheus and Grafana, Health checks  and also connectors to use external services for such purposes:
+<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=e9ca51eb-7faf-491d-a62e-618a21c94506" />
 
-* [HTTP Server: JSON and Prometheus Exporter-style metrics](monitoring.md#http-server)
-* [Grafana Dashboards and Alerts](monitoring.md#grafana-dashboard-and-alerts)
-* [Health Checks](monitoring.md#health-check-for-fluent-bit)
-* [Calyptia Cloud: hosted service to monitor and visualize your pipelines](monitoring.md#calyptia-cloud)
+Fluent Bit includes features for monitoring the internals of your pipeline, in addition to connecting to Prometheus and Grafana, Health checks, and connectors to use external services:
 
-## HTTP Server
+- [HTTP Server: JSON and Prometheus Exporter-style metrics](monitoring.md#http-server)
+- [Grafana Dashboards and Alerts](monitoring.md#grafana-dashboard-and-alerts)
+- [Health Checks](monitoring.md#health-check-for-fluent-bit)
+- [Telemetry Pipeline: hosted service to monitor and visualize your pipelines](monitoring.md#telemetry-pipeline)
 
-Fluent Bit comes with a built-in HTTP Server that can be used to query internal information and monitor metrics of each running plugin.
+## HTTP server
 
-The monitoring interface can be easily integrated with Prometheus since we support it native format.
+Fluent Bit includes an HTTP server for querying internal information and monitoring metrics of each running plugin.
 
-### Getting Started
+You can integrate the monitoring interface with Prometheus.
 
-To get started, the first step is to enable the HTTP Server from the configuration file:
+### Get started
 
+To get started, enable the HTTP server from the configuration file. The following configuration instructs Fluent Bit to start an HTTP server on TCP port `2020` and listen on all network interfaces:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  http_server: on
+  http_listen: 0.0.0.0
+  http_port: 2020
+
+pipeline:
+  inputs:
+    - name: cpu
+
+  outputs:
+    - name: stdout
+      match: '*'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [SERVICE]
-    HTTP_Server  On
-    HTTP_Listen  0.0.0.0
-    HTTP_PORT    2020
+  HTTP_Server  On
+  HTTP_Listen  0.0.0.0
+  HTTP_PORT    2020
 
 [INPUT]
-    Name cpu
+  Name cpu
 
 [OUTPUT]
-    Name  stdout
-    Match *
+  Name  stdout
+  Match *
 ```
 
-the above configuration snippet will instruct Fluent Bit to start it HTTP Server on TCP Port 2020 and listening on all network interfaces:
+{% endtab %}
+{% endtabs %}
+
+Start Fluent Bit with the corresponding configuration chosen previously:
 
+```shell
+# For YAML configuration.
+$ fluent-bit --config fluent-bit.yaml
+
+# For classic configuration.
+$ fluent-bit --config fluent-bit.conf
 ```
-$ bin/fluent-bit -c fluent-bit.conf
-Fluent Bit v1.4.0
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
 
+Fluent Bit starts and generates output in your terminal:
+
+```shell
+...
 [2020/03/10 19:08:24] [ info] [engine] started
 [2020/03/10 19:08:24] [ info] [http_server] listen iface=0.0.0.0 tcp_port=2020
 ```
 
-now with a simple **curl** command is enough to gather some information:
+Use `curl` to gather information about the HTTP server. The following command sends the command output to the `jq` program, which outputs human-readable JSON data to the terminal.
 
-```
+```shell
 $ curl -s http://127.0.0.1:2020 | jq
 {
   "fluent-bit": {
@@ -78,151 +108,240 @@ $ curl -s http://127.0.0.1:2020 | jq
 }
 ```
 
-Note that we are sending the _curl_ command output to the _jq_ program which helps to make the JSON data easy to read from the terminal. Fluent Bit doesn't aim to do JSON pretty-printing.
-
-### REST API Interface
-
-Fluent Bit aims to expose useful interfaces for monitoring, as of Fluent Bit v0.14 the following end points are available:
-
-| URI                        | Description                                                                                                                                                        | Data Format           |
-| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------- |
-| /                          | Fluent Bit build information                                                                                                                                       | JSON                  |
-| /api/v1/uptime             | Get uptime information in seconds and human readable format                                                                                                        | JSON                  |
-| /api/v1/metrics            | Internal metrics per loaded plugin                                                                                                                                 | JSON                  |
-| /api/v1/metrics/prometheus | Internal metrics per loaded plugin ready to be consumed by a Prometheus Server                                                                                     | Prometheus Text 0.0.4 |
-| /api/v1/storage            | Get internal metrics of the storage layer / buffered data. This option is enabled only if in the `SERVICE` section the property `storage.metrics` has been enabled | JSON                  |
-| /api/v1/health             | Fluent Bit health check result                                                                                                                                     | String                |
-| /api/v2/metrics            | Internal metrics per loaded plugin                                                                                                                                 | [cmetrics text format](https://github.com/fluent/cmetrics) |
-| /api/v2/metrics/prometheus | Internal metrics per loaded plugin ready to be consumed by a Prometheus Server                                                                                     | Prometheus Text 0.0.4 |
-| /api/v2/reload             | Execute hot reloading or get the status of hot reloading. For more details, please refer to the [hot-reloading documentation](hot-reload.md).                                 | JSON                  |
-
-### Metric Descriptions
-
-#### For v1 metrics
-
-The following are detailed descriptions for the metrics outputted in prometheus format by `/api/v1/metrics/prometheus`.
-
-The following definitions are key to understand:
-* record: a single message collected from a source, such as a single long line in a file. 
-* chunk: Fluent Bit input plugin instances ingest log records and store them in chunks.  A batch of records in a chunk are tracked together as a single unit; the Fluent Bit engine attempts to fit records into chunks of at most 2 MB, but the size can vary at runtime. Chunks are then sent to an output. An output plugin instance can either successfully send the full chunk to the destination and mark it as successful, or it can fail the chunk entirely if an unrecoverable error is encountered, or it can ask for the chunk to be retried.
-
-| Metric Name                            | Labels                                          | Description                                                                                                                                                                                                                                                                                  | Type    | Unit    |
-|----------------------------------------|-------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|---------|
-| fluentbit_input_bytes_total            | name: the name or alias for the input instance  | The number of bytes of log records that this input instance has successfully ingested                                                                                                                                                                                                        | counter | bytes   |
-| fluentbit_input_records_total          | name: the name or alias for the input instance  | The number of log records this input has successfully ingested                                                                                                                                                                                                                               | counter | records |
-| fluentbit_output_dropped_records_total | name: the name or alias for the output instance | The number of log records that have been dropped by the output. This means they met an unrecoverable error or retries expired for their chunk.                                                                                                                                               | counter | records |
-| fluentbit_output_errors_total          | name: the name or alias for the output instance | The number of chunks that have faced an error (either unrecoverable or retriable). This is the number of times a chunk has failed, and does not correspond with the number of error messages you see in the Fluent Bit log output.                                                           | counter | chunks  |
-| fluentbit_output_proc_bytes_total      | name: the name or alias for the output instance | The number of bytes of log records that this output instance has *successfully* sent. This is the total byte size of all unique chunks sent by this output. If a record is not sent due to some error, then it will not count towards this metric.                                           | counter | bytes   |
-| fluentbit_output_proc_records_total    | name: the name or alias for the output instance | The number of log records that this output instance has *successfully* sent. This is the total record count of all unique chunks sent by this output. If a record is not successfully sent, it does not count towards this metric.                                                           | counter | records |
-| fluentbit_output_retried_records_total | name: the name or alias for the output instance | The number of log records that experienced a retry. Note that this is calculated at the chunk level, the count increased when an entire chunk is marked for retry. An output plugin may or may not perform multiple actions that generate many error messages when uploading a single chunk. | counter | records |
-| fluentbit_output_retries_failed_total  | name: the name or alias for the output instance | The number of times that retries expired for a chunk. Each plugin configures a Retry_Limit which applies to chunks. Once the Retry_Limit has been reached for a chunk it is discarded and this metric is incremented.                                                                        | counter | chunks  |
-| fluentbit_output_retries_total         | name: the name or alias for the output instance | The number of times this output instance requested a retry for a chunk.                                                                                                                                                                                                                      | counter | chunks  |
-| fluentbit_uptime                       |                                                 | The number of seconds that Fluent Bit has been running.                                                                                                                                                                                                                                      | counter | seconds |
-| process_start_time_seconds             |                                                 | The Unix Epoch time stamp for when Fluent Bit started.                                                                                                                                                                                                                                       | gauge   | seconds |
-
-
-The following are detailed descriptions for the metrics outputted in JSON format by `/api/v1/storage`.
-
-
-| Metric Key                                  | Description                                                                                                                                                              | Unit    |
-|---------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|
-| chunks.total_chunks                         | The total number of chunks of records that Fluent Bit is currently buffering                                                                                             | chunks  |
-| chunks.mem_chunks                           | The total number of chunks that are buffered in memory at this time. Note that chunks can be both in memory and on the file system at the same time.                     | chunks  |
-| chunks.fs_chunks                            | The total number of chunks saved to the filesystem.                                                                                                                      | chunks  |
-| chunks.fs_chunks_up                         | A chunk is "up" if it is in memory. So this is the count of chunks that are both in filesystem and in memory.                                                            | chunks  |
-| chunks.fs_chunks_down                       | The count of chunks that are "down" and thus are only in the filesystem.                                                                                                 | chunks  |
-|                                             |                                                                                                                                                                          |         |
-| input_chunks.{plugin name}.status.overlimit | Is this input instance over its configured Mem_Buf_Limit?                                                                                                                | boolean |
-| input_chunks.{plugin name}.status.mem_size  | The size of memory that this input is consuming to buffer logs in chunks.                                                                                                | bytes   |
-| input_chunks.{plugin name}.status.mem_limit | The buffer memory limit (Mem_Buf_Limit) that applies to this input plugin.                                                                                               | bytes   |
-|                                             |                                                                                                                                                                          |         |
-| input_chunks.{plugin name}.chunks.total     | The current total number of chunks owned by this input instance.                                                                                                         | chunks  |
-| input_chunks.{plugin name}.chunks.up        | The current number of chunks that are "up" in memory for this input. Chunks that are "up" will also be in the filesystem layer as well if filesystem storage is enabled. | chunks  |
-| input_chunks.{plugin name}.chunks.down      | The current number of chunks that are "down" in the filesystem for this input.                                                                                           | chunks  |
-| input_chunks.{plugin name}.chunks.busy      | "Busy" chunks are chunks that are being processed/sent by outputs and are not eligible to have new data appended.                                                        | chunks  |
-| input_chunks.{plugin name}.chunks.busy_size | The sum of the byte size of each chunk which is currently marked as busy.                                                                                                | bytes   |
-
-#### For v2 metrics
-
-The following are detailed descriptions for the metrics outputted in prometheus format by `/api/v2/metrics/prometheus` or `/api/v2/metrics`.
-
-The following definitions are key to understand:
-* record: a single message collected from a source, such as a single long line in a file.
-* chunk: Fluent Bit input plugin instances ingest log records and store them in chunks.  A batch of records in a chunk are tracked together as a single unit; the Fluent Bit engine attempts to fit records into chunks of at most 2 MB, but the size can vary at runtime. Chunks are then sent to an output. An output plugin instance can either successfully send the full chunk to the destination and mark it as successful, or it can fail the chunk entirely if an unrecoverable error is encountered, or it can ask for the chunk to be retried.
-
-| Metric Name                                | Labels                                                                  | Description                                                                                                                                                                                                                                                                                  | Type    | Unit    |
-|--------------------------------------------|-------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|---------|
-| fluentbit\_input\_bytes\_total             | name: the name or alias for the input instance                          | The number of bytes of log records that this input instance has successfully ingested                                                                                                                                                                                                        | counter | bytes   |
-| fluentbit\_input\_records\_total           | name: the name or alias for the input instance                          | The number of log records this input has successfully ingested                                                                                                                                                                                                                               | counter | records |
-| fluentbit\_filter\_bytes\_total            | name: the name or alias for the filter instance                         | The number of bytes of log records that this filter instance has successfully ingested                                                                                                                                                                                                       | counter | bytes   |
-| fluentbit\_filter\_records\_total          | name: the name or alias for the filter instance                         | The number of log records this filter has successfully ingested                                                                                                                                                                                                                              | counter | records |
-| fluentbit\_filter\_added\_records\_total   | name: the name or alias for the filter instance                         | The number of log records that have been added by the filter. This means they added into the data pipeline.                                                                                                                                                                                  | counter | records |
-| fluentbit\_filter\_dropped\_records\_total | name: the name or alias for the filter instance                         | The number of log records that have been dropped by the filter. This means they removed from the data pipeline.                                                                                                                                                                              | counter | records |
-| fluentbit\_output\_dropped\_records\_total | name: the name or alias for the output instance                         | The number of log records that have been dropped by the output. This means they met an unrecoverable error or retries expired for their chunk.                                                                                                                                               | counter | records |
-| fluentbit\_output\_errors\_total           | name: the name or alias for the output instance                         | The number of chunks that have faced an error (either unrecoverable or retriable). This is the number of times a chunk has failed, and does not correspond with the number of error messages you see in the Fluent Bit log output.                                                           | counter | chunks  |
-| fluentbit\_output\_proc\_bytes\_total      | name: the name or alias for the output instance                         | The number of bytes of log records that this output instance has *successfully* sent. This is the total byte size of all unique chunks sent by this output. If a record is not sent due to some error, then it will not count towards this metric.                                           | counter | bytes   |
-| fluentbit\_output\_proc\_records\_total    | name: the name or alias for the output instance                         | The number of log records that this output instance has *successfully* sent. This is the total record count of all unique chunks sent by this output. If a record is not successfully sent, it does not count towards this metric.                                                           | counter | records |
-| fluentbit\_output\_retried\_records\_total | name: the name or alias for the output instance                         | The number of log records that experienced a retry. Note that this is calculated at the chunk level, the count increased when an entire chunk is marked for retry. An output plugin may or may not perform multiple actions that generate many error messages when uploading a single chunk. | counter | records |
-| fluentbit\_output\_retries\_failed\_total  | name: the name or alias for the output instance                         | The number of times that retries expired for a chunk. Each plugin configures a Retry\_Limit which applies to chunks. Once the Retry\_Limit has been reached for a chunk it is discarded and this metric is incremented.                                                                      | counter | chunks  |
-| fluentbit\_output\_retries\_total          | name: the name or alias for the output instance                         | The number of times this output instance requested a retry for a chunk.                                                                                                                                                                                                                      | counter | chunks  |
-| fluentbit\_uptime                          | hostname: the hostname on running fluent-bit                            | The number of seconds that Fluent Bit has been running.                                                                                                                                                                                                                                      | counter | seconds |
-| fluentbit\_process\_start\_time\_seconds   | hostname: the hostname on running fluent-bit                            | The Unix Epoch time stamp for when Fluent Bit started.                                                                                                                                                                                                                                       | gauge   | seconds |
-| fluentbit\_build\_info                     | hostname: the hostname, version: the version of fluent-bit, os: OS type | Build version information. The returned value is originated from initializing the Unix Epoch time stamp of config context.                                                                                                                                                                   | gauge   | seconds |
-| fluentbit\_hot\_reloaded\_times            | hostname: the hostname on running fluent-bit                            | Collect the count of hot reloaded times.                                                                                                                                                                                                                                                     | gauge   | seconds |
-
-The following are detailed descriptions for the metrics which is collected by storage layer.
-
-
-| Metric Name                                     | Labels                                          | Description                                                                                                                                                              | Type    | Unit    |
-|-------------------------------------------------|-------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|---------|
-| fluentbit\_input\_chunks.storage\_chunks        | None                                            | The total number of chunks of records that Fluent Bit is currently buffering                                                                                             | gauge   | chunks  |
-| fluentbit\_storage\_mem\_chunk                  | None                                            | The total number of chunks that are buffered in memory at this time. Note that chunks can be both in memory and on the file system at the same time.                     | gauge   | chunks  |
-| fluentbit\_storage\_fs\_chunks                  | None                                            | The total number of chunks saved to the filesystem.                                                                                                                      | gauge   | chunks  |
-| fluentbit\_storage\_fs\_chunks\_up              | None                                            | A chunk is "up" if it is in memory. So this is the count of chunks that are both in filesystem and in memory.                                                            | gauge   | chunks  |
-| fluentbit\_storage\_fs\_chunks\_down            | None                                            | The count of chunks that are "down" and thus are only in the filesystem.                                                                                                 | gauge   | chunks  |
-| fluentbit\_storage\_fs\_chunks\_busy            | None                                            | The total number of chunks are in a busy state.                                                                                                                          | gauge   | chunks  |
-| fluentbit\_storage\_fs\_chunks\_busy\_bytes     | None                                            | The total bytes of chunks are in a busy state.                                                                                                                           | gauge   | bytes   |
-|                                                 |                                                 |                                                                                                                                                                          |         |         |
-| fluentbit\_input\_storage\_overlimit            | name: the name or alias for the input instance  | Is this input instance over its configured Mem\_Buf\_Limit?                                                                                                              | gauge   | boolean |
-| fluentbit\_input\_storage\_memory\_bytes        | name: the name or alias for the input instance  | The size of memory that this input is consuming to buffer logs in chunks.                                                                                                | gauge   | bytes   |
-|                                                 |                                                 |                                                                                                                                                                          |         |         |
-| fluentbit\_input\_storage\_chunks               | name: the name or alias for the input instance  | The current total number of chunks owned by this input instance.                                                                                                         | gauge   | chunks  |
-| fluentbit\_input\_storage\_chunks\_up           | name: the name or alias for the input instance  | The current number of chunks that are "up" in memory for this input. Chunks that are "up" will also be in the filesystem layer as well if filesystem storage is enabled. | gauge   | chunks  |
-| fluentbit\_input\_storage\_chunks\_down         | name: the name or alias for the input instance  | The current number of chunks that are "down" in the filesystem for this input.                                                                                           | gauge   | chunks  |
-| fluentbit\_input\_storage\_chunks\_busy         | name: the name or alias for the input instance  | "Busy" chunks are chunks that are being processed/sent by outputs and are not eligible to have new data appended.                                                        | gauge   | chunks  |
-| fluentbit\_input\_storage\_chunks\_busy\_bytes  | name: the name or alias for the input instance  | The sum of the byte size of each chunk which is currently marked as busy.                                                                                                | gauge   | bytes   |
-|                                                 |                                                 |                                                                                                                                                                          |         |         |
-| fluentbit\_output\_upstream\_total\_connections | name: the name or alias for the output instance | The sum of the connection count of each output plugins.                                                                                                                  | gauge   | bytes   |
-| fluentbit\_output\_upstream\_busy\_connections  | name: the name or alias for the output instance | The sum of the connection count in a busy state of each output plugins.                                                                                                  | gauge   | bytes   |
-
-### Uptime Example
+### REST API interface
+
+Fluent Bit exposes the following endpoints for monitoring.
+
+| URI                        | Description   | Data format           |
+| -------------------------- | ------------- | --------------------- |
+| `/`                          | Fluent Bit build information. | JSON |
+| `/api/v1/uptime`             | Return uptime information in seconds. | JSON |
+| `/api/v1/metrics`            | Display internal metrics per loaded plugin. | JSON                  |
+| `/api/v1/metrics/prometheus` | Display internal metrics per loaded plugin in Prometheus Server format. | Prometheus Text 0.0.4 |
+| `/api/v1/storage`            | Get internal metrics of the storage layer / buffered data. This option is enabled only if in the `SERVICE` section of the property `storage.metrics` is enabled. | JSON |
+| `/api/v1/health`             | Display the Fluent Bit health check result. | String |
+| `/api/v2/metrics`            | Display internal metrics per loaded plugin. | [cmetrics text format](https://github.com/fluent/cmetrics) |
+| `/api/v2/metrics/prometheus` | Display internal metrics per loaded plugin ready in Prometheus Server format. | Prometheus Text 0.0.4 |
+| `/api/v2/reload`             | Execute hot reloading or get the status of hot reloading. See the [hot-reloading documentation](hot-reload.md). | JSON |
+
+### v1 metrics
+
+The following descriptions apply to v1 metric endpoints.
+
+#### `/api/v1/metrics/prometheus` endpoint
+
+The following descriptions apply to metrics outputted in Prometheus format by the `/api/v1/metrics/prometheus` endpoint.
+
+The following terms are key to understanding how Fluent Bit processes metrics:
+
+- **Record**: a single message collected from a source, such as a single long line in a file.
+- **Chunk**: log records ingested and stored by Fluent Bit input plugin instances. A batch of records in a chunk are tracked together as a single unit.
+
+  The Fluent Bit engine attempts to fit records into chunks of at most `2 MB`, but the size can vary at runtime. Chunks are then sent to an output. An output plugin instance can successfully send the full chunk to the destination and mark it as successful, or it can fail the chunk entirely if an unrecoverable error is encountered, or it can ask for the chunk to be retried.
+
+| Metric name | Labels | Description | Type | Unit |
+| ----------- | ------ | ----------- | ---- | ---- |
+| `fluentbit_input_bytes_total`          | name: the name or alias for the input instance  | The number of bytes of log records that this input instance has ingested successfully. | counter | bytes   |
+| `fluentbit_input_records_total`        | name: the name or alias for the input instance  | The number of log records this input ingested successfully. | counter | records |
+| `fluentbit_output_dropped_records_total` | name: the name or alias for the output instance | The number of log records dropped by the output. These records hit an unrecoverable error or retries expired for their chunk. | counter | records |
+| `fluentbit_output_errors_total`        | name: the name or alias for the output instance | The number of chunks with an error that's either unrecoverable or unable to retry. This metric represents the number of times a chunk failed, and doesn't correspond with the number of error messages visible in the Fluent Bit log output. | counter | chunks  |
+| `fluentbit_output_proc_bytes_total`      | name: the name or alias for the output instance | The number of bytes of log records that this output instance sent successfully. This metric represents the total byte size of all unique chunks sent by this output. If a record isn't sent due to some error, it doesn't count towards this metric. | counter | bytes   |
+| `fluentbit_output_proc_records_total`    | name: the name or alias for the output instance | The number of log records that this output instance sent successfully. This metric represents the total record count of all unique chunks sent by this output. If a record isn't sent successfully, it doesn't count towards this metric. | counter | records |
+| `fluentbit_output_retried_records_total` | name: the name or alias for the output instance | The number of log records that experienced a retry. This metric is calculated at the chunk level, the count increased when an entire chunk is marked for retry. An output plugin might perform multiple actions that generate many error messages when uploading a single chunk. | counter | records |
+| `fluentbit_output_retries_failed_total` | name: the name or alias for the output instance | The number of times that retries expired for a chunk. Each plugin configures a `Retry_Limit`, which applies to chunks. When the `Retry_Limit` is exceeded, the chunk is discarded and this metric is incremented. | counter | chunks  |
+| `fluentbit_output_retries_total`         | name: the name or alias for the output instance | The number of times this output instance requested a retry for a chunk. | counter | chunks  |
+| `fluentbit_uptime` | | The number of seconds that Fluent Bit has been running. | counter | seconds |
+| `process_start_time_seconds` | | The Unix Epoch timestamp for when Fluent Bit started. | gauge   | seconds |
+
+#### `/api/v1/storage` endpoint
+
+The following descriptions apply to metrics outputted in JSON format by the `/api/v1/storage` endpoint.
+
+| Metric Key                                    | Description   | Unit    |
+|-----------------------------------------------|---------------|---------|
+| `chunks.total_chunks`                         | The total number of chunks of records that Fluent Bit is currently buffering. | chunks  |
+| `chunks.mem_chunks`                           | The total number of chunks that are currently buffered in memory. Chunks can be both in memory and on the file system at the same time. | chunks  |
+| `chunks.fs_chunks`                            | The total number of chunks saved to the filesystem. | chunks  |
+| `chunks.fs_chunks_up`                         | The count of chunks that are both in file system and in memory. | chunks  |
+| `chunks.fs_chunks_down`                       | The count of chunks that are only in the file system. | chunks  |
+| `input_chunks.{plugin name}.status.overlimit` | Indicates whether the input instance exceeded its configured `Mem_Buf_Limit.` | boolean |
+| `input_chunks.{plugin name}.status.mem_size`  | The size of memory that this input is consuming to buffer logs in chunks. | bytes   |
+| `input_chunks.{plugin name}.status.mem_limit` | The buffer memory limit (`Mem_Buf_Limit`) that applies to this input plugin. | bytes   |
+| `input_chunks.{plugin name}.chunks.total`     | The current total number of chunks owned by this input instance. | chunks  |
+| `input_chunks.{plugin name}.chunks.up`        | The current number of chunks that are in memory for this input. If file system storage is enabled, chunks that are "up" are also stored in the filesystem layer. | chunks  |
+| `input_chunks.{plugin name}.chunks.down`      | The current number of chunks that are "down" in the filesystem for this input. | chunks  |
+| `input_chunks.{plugin name}.chunks.busy`      | Chunks are that are being processed or sent by outputs and aren't eligible to have new data appended. | chunks  |
+| `input_chunks.{plugin name}.chunks.busy_size` | The sum of the byte size of each chunk which is currently marked as busy. | bytes   |
+
+### v2 metrics
+
+The following descriptions apply to v2 metric endpoints.
+
+#### `/api/v2/metrics/prometheus` or `/api/v2/metrics` endpoint
+
+The following descriptions apply to metrics outputted in Prometheus format by the `/api/v2/metrics/prometheus` or `/api/v2/metrics` endpoints.
+
+The following terms are key to understanding how Fluent Bit processes metrics:
+
+- **Record**: a single message collected from a source, such as a single long line in a file.
+- **Chunk**: log records ingested and stored by Fluent Bit input plugin instances. A batch of records in a chunk are tracked together as a single unit.
+
+  The Fluent Bit engine attempts to fit records into chunks of at most `2 MB`, but the size can vary at runtime. Chunks are then sent to an output. An output plugin instance can either successfully send the full chunk to the destination and mark it as successful, or it can fail the chunk entirely if an unrecoverable error is encountered, or it can ask for the chunk to be retried.
+
+| Metric Name                                | Labels                                                                  | Description | Type    | Unit    |
+|--------------------------------------------|-------------------------------------------------------------------------|-------------|---------|---------|
+| `fluentbit_input_bytes_total`            | name: the name or alias for the input instance  | The number of bytes of log records that this input instance has ingested successfully. | counter | bytes   |
+| `fluentbit_input_records_total`          | name: the name or alias for the input instance  | The number of log records this input ingested successfully. | counter | records |
+| `fluentbit_filter_bytes_total`           | name: the name or alias for the filter instance | The number of bytes of log records that this filter instance has ingested successfully. | counter | bytes   |
+| `fluentbit_filter_records_total`         | name: the name or alias for the filter instance | The number of log records this filter has ingested successfully. | counter | records |
+| `fluentbit_filter_added_records_total`   | name: the name or alias for the filter instance | The number of log records added by the filter into the data pipeline. | counter | records |
+| `fluentbit_filter_drop_records_total`    | name: the name or alias for the filter instance | The number of log records dropped by the filter and removed from the data pipeline. | counter | records |
+| `fluentbit_output_dropped_records_total` | name: the name or alias for the output instance | The number of log records dropped by the output. These records hit an unrecoverable error or retries expired for their chunk. | counter | records |
+| `fluentbit_output_errors_total`          | name: the name or alias for the output instance | The number of chunks with an error that's either unrecoverable or unable to retry. This metric represents the number of times a chunk failed, and doesn't correspond with the number of error messages visible in the Fluent Bit log output. | counter | chunks  |
+| `fluentbit_output_proc_bytes_total`      | name: the name or alias for the output instance | The number of bytes of log records that this output instance sent successfully. This metric represents the total byte size of all unique chunks sent by this output. If a record isn't sent due to some error, it doesn't count towards this metric. | counter | bytes   |
+| `fluentbit_output_proc_records_total`    | name: the name or alias for the output instance | The number of log records that this output instance sent successfully. This metric represents the total record count of all unique chunks sent by this output. If a record isn't sent successfully, it doesn't count towards this metric. | counter | records |
+| `fluentbit_output_retried_records_total` | name: the name or alias for the output instance | The number of log records that experienced a retry. This metric is calculated at the chunk level, the count increased when an entire chunk is marked for retry. An output plugin might perform multiple actions that generate many error messages when uploading a single chunk. | counter | records |
+| `fluentbit_output_retries_failed_total` | name: the name or alias for the output instance | The number of times that retries expired for a chunk. Each plugin configures a `Retry_Limit`, which applies to chunks. When the `Retry_Limit` is exceeded, the chunk is discarded and this metric is incremented. | counter | chunks  |
+| `fluentbit_output_retries_total`        | name: the name or alias for the output instance | The number of times this output instance requested a retry for a chunk. | counter | chunks  |
+| `fluentbit_output_latency_seconds`      | input: the name of the input plugin instance, output: the name of the output plugin instance | End-to-end latency from chunk creation to successful delivery. Provides observability into chunk-level pipeline performance. | histogram | seconds |
+| `fluentbit_uptime`                      | hostname: the hostname on running Fluent Bit | The number of seconds that Fluent Bit has been running. | counter | seconds |
+| `fluentbit_process_start_time_seconds`  | hostname: the hostname on running Fluent Bit | The Unix Epoch time stamp for when Fluent Bit started. | gauge   | seconds |
+| `fluentbit_build_info`                  | hostname: the hostname, version: the version of Fluent Bit, os: OS type | Build version information. The returned value is originated from initializing the Unix Epoch time stamp of configuration context. | gauge   | seconds |
+| `fluentbit_hot_reloaded_times`          | hostname: the hostname on running Fluent Bit | Collect the count of hot reloaded times. | gauge   | seconds |
+
+#### Storage layer
+
+The following are detailed descriptions for the metrics collected by the storage layer.
+
+| Metric Name                                 | Labels                       | Description   | Type    | Unit    |
+|---------------------------------------------|------------------------------|---------------|---------|---------|
+| `fluentbit_input_chunks.storage_chunks`     | None                         | The total number of chunks of records that Fluent Bit is currently buffering. | gauge | chunks |
+| `fluentbit_storage_mem_chunk`               | None                         | The total number of chunks that are currently buffered in memory. Chunks can be both in memory and on the file system at the same time. | gauge | chunks |
+| `fluentbit_storage_fs_chunks`               | None                         | The total number of chunks saved to the file system. | gauge | chunks |
+| `fluentbit_storage_fs_chunks_up`            | None                         | The count of chunks that are both in file system and in memory. | gauge | chunks |
+| `fluentbit_storage_fs_chunks_down`          | None                         | The count of chunks that are only in the file system. | gauge | chunks |
+| `fluentbit_storage_fs_chunks_busy`          | None                         | The total number of chunks are in a busy state. | gauge | chunks |
+| `fluentbit_storage_fs_chunks_busy_bytes`    | None                         | The total bytes of chunks are in a busy state. | gauge | bytes |
+| `fluentbit_input_storage_overlimit`         | name: the name or alias for the input instance  | Indicates whether the input instance exceeded its configured `Mem_Buf_Limit.` | gauge | boolean |
+| `fluentbit_input_storage_memory_bytes`      | name: the name or alias for the input instance  | The size of memory that this input is consuming to buffer logs in chunks. | gauge | bytes |
+| `fluentbit_input_storage_chunks`            | name: the name or alias for the input instance  | The current total number of chunks owned by this input instance. | gauge | chunks |
+| `fluentbit_input_storage_chunks_up`         | name: the name or alias for the input instance  | The current number of chunks that are in memory for this input. If file system storage is enabled, chunks that are "up" are also stored in the filesystem layer. | gauge | chunks |
+| `fluentbit_input_storage_chunks_down`       | name: the name or alias for the input instance  | The current number of chunks that are "down" in the filesystem for this input. | gauge | chunks |
+| `fluentbit_input_storage_chunks_busy`       | name: the name or alias for the input instance  | Chunks are that are being processed or sent by outputs and aren't eligible to have new data appended. | gauge | chunks |
+| `fluentbit_input_storage_chunks_busy_bytes` | name: the name or alias for the input instance  | The sum of the byte size of each chunk which is currently marked as busy. | gauge | bytes |
+| `fluentbit_output_upstream_total_connections` | name: the name or alias for the output instance | The sum of the connection count of each output plugins. | gauge | bytes |
+| `fluentbit_output_upstream_busy_connections` | name: the name or alias for the output instance | The sum of the connection count in a busy state of each output plugins.                                                                                                  | gauge   | bytes   |
+
+### Output latency metric
+
+Introduced in Fluent Bit 4.0.6, the `fluentbit_output_latency_seconds` histogram metric captures end-to-end latency from the time a chunk is created by an input plugin until it's successfully delivered by an output plugin. This provides observability into chunk-level pipeline performance and helps identify slowdowns or bottlenecks in the output path.
+
+#### Bucket configuration
+
+The histogram uses the following default bucket boundaries, designed around the Fluent Bit typical flush interval of 1 second:
+
+```text
+0.5, 1.0, 1.5, 2.5, 5.0, 10.0, 20.0, 30.0, +Inf
+```
 
-Query the service uptime with the following command:
+These boundaries provide:
+
+- High resolution around 1&nbsp;s latency: Captures normal operation near the default flush interval.
+- Small backpressure detection: Identifies minor delays in the 1-2.5&nbsp;s range.
+- Bottleneck identification: Detects retry cycles, network stalls, or plugin bottlenecks in higher ranges.
+- Complete coverage**: The `+Inf` bucket ensures all latencies are captured.
+
+#### Example output
+
+When exposed through the Fluent Bit built-in HTTP server, the metric appears in Prometheus format:
+
+```text
+# HELP fluentbit_output_latency_seconds End-to-end latency in seconds
+# TYPE fluentbit_output_latency_seconds histogram
+fluentbit_output_latency_seconds_bucket{le="0.5",input="random.0",output="stdout.0"} 0
+fluentbit_output_latency_seconds_bucket{le="1.0",input="random.0",output="stdout.0"} 1
+fluentbit_output_latency_seconds_bucket{le="1.5",input="random.0",output="stdout.0"} 6
+fluentbit_output_latency_seconds_bucket{le="2.5",input="random.0",output="stdout.0"} 6
+fluentbit_output_latency_seconds_bucket{le="5.0",input="random.0",output="stdout.0"} 6
+fluentbit_output_latency_seconds_bucket{le="10.0",input="random.0",output="stdout.0"} 6
+fluentbit_output_latency_seconds_bucket{le="20.0",input="random.0",output="stdout.0"} 6
+fluentbit_output_latency_seconds_bucket{le="30.0",input="random.0",output="stdout.0"} 6
+fluentbit_output_latency_seconds_bucket{le="+Inf",input="random.0",output="stdout.0"} 6
+fluentbit_output_latency_seconds_sum{input="random.0",output="stdout.0"} 6.0015411376953125
+fluentbit_output_latency_seconds_count{input="random.0",output="stdout.0"} 6
+```
+
+#### Use cases
 
+**Performance monitoring**: Monitor overall pipeline health by tracking latency percentiles:
+
+```promql
+# 95th percentile latency
+histogram_quantile(0.95, rate(fluentbit_output_latency_seconds_bucket[5m]))
+
+# Average latency
+rate(fluentbit_output_latency_seconds_sum[5m]) / rate(fluentbit_output_latency_seconds_count[5m])
+```
+
+**Bottleneck detection**: Identify specific input/output pairs experiencing high latency:
+
+```promql
+# Outputs with highest average latency
+topk(5, rate(fluentbit_output_latency_seconds_sum[5m]) / rate(fluentbit_output_latency_seconds_count[5m]))
+```
+
+**SLA monitoring**: Track how many chunks are delivered within acceptable time bounds:
+
+```promql
+# Percentage of chunks delivered within 2 seconds
+(
+  rate(fluentbit_output_latency_seconds_bucket{le="2.0"}[5m]) /
+  rate(fluentbit_output_latency_seconds_count[5m])
+) * 100
+```
+
+**Alerting**: Create alerts for degraded pipeline performance:
+
+```yaml
+# Example Prometheus alerting rule
+- alert: FluentBitHighLatency
+  expr: histogram_quantile(0.95, rate(fluentbit_output_latency_seconds_bucket[5m])) > 5
+  for: 2m
+  labels:
+    severity: warning
+  annotations:
+    summary: "Fluent Bit pipeline experiencing high latency"
+    description: "95th percentile latency is {{ $value }}s for {{ $labels.input }} -> {{ $labels.output }}"
 ```
-$ curl -s http://127.0.0.1:2020/api/v1/uptime | jq
+
+### Uptime example
+
+Query the service uptime with the following command:
+
+```shell
+curl -s http://127.0.0.1:2020/api/v1/uptime | jq
 ```
 
-it should print a similar output like this:
+The command prints a similar output like this:
 
-```javascript
+```json
 {
   "uptime_sec": 8950000,
   "uptime_hr": "Fluent Bit has been running:  103 days, 14 hours, 6 minutes and 40 seconds"
 }
 ```
 
-### Metrics Examples
+### Metrics example
 
 Query internal metrics in JSON format with the following command:
 
-```bash
-$ curl -s http://127.0.0.1:2020/api/v1/metrics | jq
+```shell
+curl -s http://127.0.0.1:2020/api/v1/metrics | jq
 ```
 
-it should print a similar output like this:
+The command prints a similar output like this:
 
-```javascript
+```json
 {
   "input": {
     "cpu.0": {
@@ -242,17 +361,17 @@ it should print a similar output like this:
 }
 ```
 
-### Metrics in Prometheus format
+### Query metrics in Prometheus format
 
 Query internal metrics in Prometheus Text 0.0.4 format:
 
-```bash
-$ curl -s http://127.0.0.1:2020/api/v1/metrics/prometheus
+```shell
+curl -s http://127.0.0.1:2020/api/v1/metrics/prometheus
 ```
 
-this time the same metrics will be in Prometheus format instead of JSON:
+This command returns the same metrics in Prometheus format instead of JSON:
 
-```
+```text
 fluentbit_input_records_total{name="cpu.0"} 57 1509150350542
 fluentbit_input_bytes_total{name="cpu.0"} 18069 1509150350542
 fluentbit_output_proc_records_total{name="stdout.0"} 54 1509150350542
@@ -262,31 +381,57 @@ fluentbit_output_retries_total{name="stdout.0"} 0 1509150350542
 fluentbit_output_retries_failed_total{name="stdout.0"} 0 1509150350542
 ```
 
-### Configuring Aliases
+### Configure aliases
+
+By default, configured plugins on runtime get an internal name in the format `_plugin_name.ID_`. For monitoring purposes, this can be confusing if many plugins of the same type were configured. To make a distinction each configured input or output section can get an _alias_ that will be used as the parent name for the metric.
+
+The following example sets an alias to the `INPUT` section of the configuration file, which is using the [CPU](../pipeline/inputs/cpu-metrics.md) input plugin:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-By default configured plugins on runtime get an internal name in the format _plugin_name.ID_. For monitoring purposes, this can be confusing if many plugins of the same type were configured. To make a distinction each configured input or output section can get an _alias_ that will be used as the parent name for the metric.
+```yaml
+service:
+  http_server: on
+  http_listen: 0.0.0.0
+  http_port: 2020
 
-The following example set an alias to the INPUT section which is using the [CPU](../pipeline/inputs/cpu-metrics.md) input plugin:
+pipeline:
+  inputs:
+    - name: cpu
+      alias: server1_cpu
 
+  outputs:
+    - name: stdout
+      alias: raw_output
+      match: '*'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [SERVICE]
-    HTTP_Server  On
-    HTTP_Listen  0.0.0.0
-    HTTP_PORT    2020
+  HTTP_Server  On
+  HTTP_Listen  0.0.0.0
+  HTTP_PORT    2020
 
 [INPUT]
-    Name  cpu
-    Alias server1_cpu
+  Name  cpu
+  Alias server1_cpu
 
 [OUTPUT]
-    Name  stdout
-    Alias raw_output
-    Match *
+  Name  stdout
+  Alias raw_output
+  Match *
 ```
 
-Now when querying the metrics we get the aliases in place instead of the plugin name:
+{% endtab %}
+{% endtabs %}
+
+When querying the related metrics, the aliases are returned instead of the plugin name:
 
-```javascript
+```json
 {
   "input": {
     "server1_cpu": {
@@ -306,106 +451,110 @@ Now when querying the metrics we get the aliases in place instead of the plugin
 }
 ```
 
-## Grafana Dashboard and Alerts
+## Grafana dashboard and alerts
 
-Fluent Bit's exposed [prometheus style metrics](https://docs.fluentbit.io/manual/administration/monitoring) can be leveraged to create dashboards and alerts.
+<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=0b83cb05-4f52-4853-83cc-f4539b64044d" />
 
-The provided [example dashboard](https://github.com/fluent/fluent-bit-docs/tree/8172a24d278539a1420036a9434e9f56d987a040/monitoring/dashboard.json) is heavily inspired by [Banzai Cloud](https://banzaicloud.com)'s [logging operator dashboard](https://grafana.com/grafana/dashboards/7752) but with a few key differences such as the use of the `instance` label (see [why here](https://www.robustperception.io/controlling-the-instance-label)), stacked graphs and a focus on Fluent Bit metrics.
+You can create Grafana dashboards and alerts using Fluent Bit exposed Prometheus style metrics.
 
-![dashboard](../.gitbook/assets/dashboard.png)
+The provided [example dashboard](https://github.com/fluent/fluent-bit-docs/blob/master/monitoring/dashboard.json) is heavily inspired by [Banzai Cloud](https://github.com/banzaicloud)'s [logging operator dashboard](https://grafana.com/grafana/dashboards/7752) with a few key differences, such as the use of the `instance` label, stacked graphs, and a focus on Fluent Bit metrics. See [this blog post](https://www.robustperception.io/controlling-the-instance-label) for more information.
 
-### Alerts
+![dashboard](/.gitbook/assets/dashboard.png)
 
-Sample alerts are available [here](https://github.com/fluent/fluent-bit-docs/tree/8172a24d278539a1420036a9434e9f56d987a040/monitoring/alerts.yaml).
+### Alerts
 
-## Health Check for Fluent Bit
+Sample alerts [are available](https://github.com/fluent/fluent-bit-docs/blob/master/monitoring/alerts.yaml).
 
-Fluent bit now supports four new configs to set up the health check.
+## Health check for Fluent Bit
 
-| Config Name            | Description                                                                                                                                                                                                                                                                                                                             | Default Value |
-| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ------------- |
-| Health_Check           | enable Health check feature                                                                                                                                                                                                                                                                                                             | Off           |
-| HC_Errors_Count        | the error count to meet the unhealthy requirement, this is a sum for all output plugins in a defined HC_Period, example for output error: ` [2022/02/16 10:44:10] [ warn] [engine] failed to flush chunk '1-1645008245.491540684.flb', retry in 7 seconds: task_id=0, input=forward.1 > output=cloudwatch_logs.3 (out_id=3)`            | 5             |
-| HC_Retry_Failure_Count | the retry failure count to meet the unhealthy requirement, this is a sum for all output plugins in a defined HC_Period, example for retry failure: `[2022/02/16 20:11:36] [ warn] [engine] chunk '1-1645042288.260516436.flb' cannot be retried: task_id=0, input=tcp.3 > output=cloudwatch_logs.1 `                                    | 5             |
-| HC_Period              | The time period by second to count the error and retry failure data point                                                                                                                                                                                                                                                               | 60            |
+Fluent Bit supports the following configurations to set up the health check.
 
-*Note: Not every error log means an error nor be counted, the errors retry failures count only on specific errors which is the example in config table description*
+| Configuration name     | Description | Default       |
+| ---------------------- | ------------| ------------- |
+| `Health_Check`           | Enable Health check feature | `Off` |
+| `HC_Errors_Count`       | the error count to meet the unhealthy requirement, this is a sum for all output plugins in a defined `HC_Period`, example for output error: `[2022/02/16 10:44:10] [ warn] [engine] failed to flush chunk '1-1645008245.491540684.flb', retry in 7 seconds: task_id=0, input=forward.1 > output=cloudwatch_logs.3 (out_id=3)` | `5` |
+| `HC_Retry_Failure_Count` | the retry failure count to meet the unhealthy requirement, this is a sum for all output plugins in a defined `HC_Period`, example for retry failure: `[2022/02/16 20:11:36] [ warn] [engine] chunk '1-1645042288.260516436.flb' cannot be retried: task_id=0, input=tcp.3 > output=cloudwatch_logs.1` | `5` |
+| `HC_Period` | The time period by second to count the error and retry failure data point | `60` |
 
-So the feature works as: Based on the HC_Period customer setup, if the real error number is over `HC_Errors_Count` or retry failure is over `HC_Retry_Failure_Count`, fluent bit will be considered as unhealthy. The health endpoint will return HTTP status 500 and String `error`. Otherwise it's healthy, will return HTTP status 200 and string `ok`
+Not every error log means an error to be counted. The error retry failures count only on specific errors, which is the example in configuration table description.
 
-The equation is: 
-```
-health status = (HC_Errors_Count > HC_Errors_Count config value) OR (HC_Retry_Failure_Count > HC_Retry_Failure_Count config value) IN the HC_Period interval
-```
-*Note: the HC_Errors_Count and HC_Retry_Failure_Count only count for output plugins and count a sum for errors and retry failures from all output plugins which is running.*
+Based on the `HC_Period` setting, if the real error number is over `HC_Errors_Count`, or retry failure is over `HC_Retry_Failure_Count`, Fluent Bit is considered unhealthy. The health endpoint returns an HTTP status `500` and an `error` message. Otherwise, the endpoint returns HTTP status `200` and an `ok` message.
 
-See the config example:
+The equation to calculate this behavior is:
 
+```text
+health status = (HC_Errors_Count > HC_Errors_Count config value) OR
+(HC_Retry_Failure_Count > HC_Retry_Failure_Count config value) IN
+the HC_Period interval
 ```
-[SERVICE]
-    HTTP_Server  On
-    HTTP_Listen  0.0.0.0
-    HTTP_PORT    2020
-    Health_Check On 
-    HC_Errors_Count 5 
-    HC_Retry_Failure_Count 5 
-    HC_Period 5 
-
-[INPUT]
-    Name  cpu
 
-[OUTPUT]
-    Name  stdout
-    Match *
-```
+The `HC_Errors_Count` and `HC_Retry_Failure_Count` only count for output plugins and count a sum for errors and retry failures from all running output plugins.
 
-The command to call health endpoint
+The following configuration examples show how to define these settings:
 
-```bash
-$ curl -s http://127.0.0.1:2020/api/v1/health
-```
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-Based on the fluent bit status, the result will be:
+```yaml
+service:
+  http_server: on
+  http_listen: 0.0.0.0
+  http_port: 2020
+  health_check: on
+  hc_errors_count: 5
+  hc_retry_failure_count: 5
+  hc_period: 5
 
-* HTTP status 200 and "ok" in response to healthy status
-* HTTP status 500 and "error" in response for unhealthy status
+pipeline:
+  inputs:
+    - name: cpu
 
-With the example config, the health status is determined by following equation:
+  outputs:
+    - name: stdout
+      match: '*'
 ```
-Health status = (HC_Errors_Count > 5) OR (HC_Retry_Failure_Count > 5) IN 5 seconds
-```
-If (HC_Errors_Count > 5) OR (HC_Retry_Failure_Count > 5) IN 5 seconds is TRUE, then it's unhealthy.
-
-If (HC_Errors_Count > 5) OR (HC_Retry_Failure_Count > 5) IN 5 seconds is FALSE, then it's healthy.
 
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-## Calyptia
+```text
+[SERVICE]
+  HTTP_Server  On
+  HTTP_Listen  0.0.0.0
+  HTTP_PORT    2020
+  Health_Check On
+  HC_Errors_Count 5
+  HC_Retry_Failure_Count 5
+  HC_Period 5
 
-[Calyptia](https://calyptia.com/free-trial) is a hosted service that allows you to monitor your Fluent Bit agents including data flow, metrics and configurations.
+[INPUT]
+  Name  cpu
 
-![](../.gitbook/assets/image-19-.png)
+[OUTPUT]
+  Name  stdout
+  Match *
+```
 
-### Get Started with Calyptia Cloud
+{% endtab %}
+{% endtabs %}
 
-Register your Fluent Bit agent will take **less than one minute**, steps:
+Use the following command to call the health endpoint:
 
-* Go to the calyptia core console and sign-in
-* On the left menu click on settings and generate/copy your API key
+```shell
+curl -s http://127.0.0.1:2020/api/v1/health
+```
 
-In your Fluent Bit configuration file, append the following configuration section:
+With the example configuration, the health status is determined by the following equation:
 
+```text
+Health status = (HC_Errors_Count > 5) OR (HC_Retry_Failure_Count > 5) IN 5 seconds
 ```
-[CUSTOM]
-    name     calyptia
-    api_key  <YOUR_API_KEY>
-```
-
-Make sure to replace your API key in the configuration.\
-\
-After a few seconds upon restart your Fluent Bit agent, the Calyptia Cloud Dashboard will list your agent. Metrics will take around 30 seconds to shows up.
 
-![](../.gitbook/assets/agent.png)
+- If this equation evaluates to `TRUE`, then Fluent Bit is unhealthy.
+- If this equation evaluates to `FALSE`, then Fluent Bit is healthy.
 
-###  Contact Calyptia
+## Telemetry Pipeline
 
-If  want to get in touch with Calyptia team, just send an email to [hello@calyptia.com](mailto:hello@calyptia.com)
+[Telemetry Pipeline](https://chronosphere.io/platform/telemetry-pipeline/) is a
+hosted service that lets you monitor your Fluent Bit agents including data flow,
+metrics, and configurations.
diff --git a/administration/multithreading.md b/administration/multithreading.md
new file mode 100644
index 000000000..2e68452de
--- /dev/null
+++ b/administration/multithreading.md
@@ -0,0 +1,42 @@
+---
+description: Learn how to run Fluent Bit in multiple threads for improved scalability.
+---
+
+# Multithreading
+
+Fluent Bit has one event loop to handle critical operations, like managing
+timers, receiving internal messages, scheduling flushes, and handling retries.
+This event loop runs in the main Fluent Bit thread.
+
+To free up resources in the main thread, you can configure
+[inputs](../pipeline/inputs/README.md) and [outputs](../pipeline/outputs/README.md)
+to run in their own self-contained threads. However, inputs and outputs implement
+multithreading in distinct ways: inputs can run in `threaded` mode, and outputs
+can use one or more `workers`.
+
+Threading also affects certain processes related to inputs and outputs. For example,
+[filters](../pipeline/filters/README.md) always run in the main thread, but
+[processors](../pipeline/processors/README.md) run in the self-contained threads of
+their respective inputs or outputs, if applicable.
+
+## Inputs
+
+When inputs collect telemetry data, they can either perform this process
+inside the main Fluent Bit thread or inside a separate dedicated thread. You can
+configure this behavior by enabling or disabling the `threaded` setting.
+
+All inputs are capable of running in threaded mode, but certain inputs always
+run in threaded mode regardless of configuration. These always-threaded inputs are:
+
+- [Kubernetes Events](../pipeline/inputs/kubernetes-events.md)
+- [Node Exporter Metrics](../pipeline/inputs/node-exporter-metrics.md)
+- [Process Exporter Metrics](../pipeline/inputs/process-exporter-metrics.md)
+- [Windows Exporter Metrics](../pipeline/inputs/windows-exporter-metrics.md)
+
+Inputs aren't internally aware of multithreading. If an input runs in threaded mode, Fluent Bit manages the logistics of that input's thread.
+
+## Outputs
+
+When outputs flush data, they can either perform this operation inside the main Fluent Bit thread or inside a separate dedicated thread called a _worker_. Each output can have one or more workers running in parallel, and each worker can handle multiple concurrent flushes. You can configure this behavior by changing the value of the `workers` setting.
+
+All outputs are capable of running in multiple workers, and each output has a default value of `0`, `1`, or `2` workers. However, even if an output uses workers by default, you can safely reduce the number of workers under the default or disable workers entirely.
diff --git a/administration/networking.md b/administration/networking.md
index 8179e6d3c..efd17162b 100644
--- a/administration/networking.md
+++ b/administration/networking.md
@@ -1,108 +1,148 @@
 # Networking
 
-[Fluent Bit](https://fluentbit.io) implements a unified networking interface that is exposed to components like plugins. This interface abstract all the complexity of general I/O and is fully configurable.
+[Fluent Bit](https://fluentbit.io) implements a unified networking interface that's exposed to components like plugins. This interface abstracts the complexity of general I/O and is fully configurable.
 
-A common use case is when a component or plugin needs to connect to a service to send and receive data. Despite the operational mode sounds easy to deal with, there are many factors that can make things hard like unresponsive services, networking latency or any kind of connectivity error. The networking interface aims to abstract and simplify the network I/O handling, minimize risks and optimize performance.
+A common use case is when a component or plugin needs to connect with a service to send and receive data. There are many challenges to handle like unresponsive services, networking latency, or any kind of connectivity error. The networking interface aims to abstract and simplify the network I/O handling, minimize risks, and optimize performance.
 
-## Concepts
+## Networking concepts
 
-### TCP Connect Timeout
+Fluent Bit uses the following networking concepts:
 
-Most of the time creating a new TCP connection to a remote server is straightforward and takes a few milliseconds. But there are cases where DNS resolving, slow network or incomplete TLS handshakes might create long delays, or incomplete connection statuses.
+### TCP connect timeout
 
-The `net.connect_timeout` allows to configure the maximum time to wait for a connection to be established, note that this value already considers the TLS handshake process.
+Typically, creating a new TCP connection to a remote server is straightforward and takes a few milliseconds. However, there are cases where DNS resolving, a slow network, or incomplete TLS handshakes might create long delays, or incomplete connection statuses.
 
-The `net.connect_timeout_log_error` indicates if an error should be logged in case of connect timeout. If disabled, the timeout is logged as debug level message instead.
+- `net.connect_timeout` lets you configure the maximum time to wait for a connection to be established. This value already considers the TLS handshake process.
 
-### TCP Source Address
+- `net.connect_timeout_log_error` indicates if an error should be logged in case of connect timeout. If disabled, the timeout is logged as a debug level message.
 
-On environments with multiple network interfaces, might be desired to choose which interface to use for our data that will flow through the network.
+### TCP source address
 
-The `net.source_address` allows to specify which network address must be used for a TCP connection and data flow.
+On environments with multiple network interfaces, you can choose which interface to use for Fluent Bit data that will flow through the network.
 
-### Connection Keepalive
+Use `net.source_address` to specify which network address to use for a TCP connection and data flow.
 
-TCP is a _connected oriented_ channel, to deliver and receive data from a remote end-point in most of cases we use a TCP connection. This TCP connection can be created and destroyed once is not longer needed, this approach has pros and cons, here we will refer to the opposite case: keep the connection open.
+### Connection keepalive
 
-The concept of `Connection Keepalive` refers to the ability of the client \(Fluent Bit on this case\) to keep the TCP connection open in a persistent way, that means that once the connection is created and used, instead of close it, it can be recycled. This feature offers many benefits in terms of performance since communication channels are always established before hand.
+A connection keepalive refers to the ability of a client to keep the TCP connection open in a persistent way. This feature offers many benefits in terms of performance because communication channels are always established beforehand.
 
-Any component that uses TCP channels like HTTP or [TLS](transport-security.md), can take advantage of this feature. For configuration purposes use the `net.keepalive` property.
+Any component that uses TCP channels like HTTP or [TLS](transport-security.md), can take use feature. For configuration purposes use the `net.keepalive` property.
 
-### Connection Keepalive Idle Timeout
+### Connection keepalive idle timeout
 
-If a connection is keepalive enabled, there might be scenarios where the connection can be unused for long periods of time. Having an idle keepalive connection is not helpful and is recommendable to keep them alive if they are used.
-
-In order to control how long a keepalive connection can be idle, we expose the configuration property called `net.keepalive_idle_timeout`.
+If a connection keepalive is enabled, there might be scenarios where the connection can be unused for long periods of time. Unused connections can be removed. To control how long a keepalive connection can be idle, Fluent Bit uses a configuration property called `net.keepalive_idle_timeout`.
 
 ### DNS mode
 
-If a transport layer protocol is specified, the plugin whose configuration section the `net.dns.mode` setting is specified on overrides the global `dns.mode` value and issues DNS requests using the specified protocol which can be either TCP or UDP
+The global `dns.mode` value issues DNS requests using the specified protocol, either TCP or UDP. If a transport layer protocol is specified, plugins that configure the `net.dns.mode` setting override the global setting.
+
+### Maximum connections per worker
+
+For optimal performance, Fluent Bit tries to deliver data quickly and create TCP connections on-demand and in keepalive mode. In highly scalable environments, you might limit how many connections are created in parallel.
 
-### Max Connections Per Worker
+Use the `net.max_worker_connections` property in the output plugin section to set the maximum number of allowed connections. This property acts at the worker level. For example, if you have five workers and `net.max_worker_connections` is set to 10, a maximum of 50 connections is allowed. If the limit is reached, the output plugin issues a retry.
 
-By default, Fluent Bit tries to deliver data as faster as possible and create TCP connections on-demand and in keepalive mode for performance reasons. In high-scalable environments, the user might want to control how many connections are done in parallel by setting a limit.
+### Listener backlog
 
-This can be done by the configuration property called `net.max_worker_connections` that can be used in the output plugins sections.
-This feature acts at the worker level, e.g., if you have 5 workers and `net.max_worker_connections` is set to 10, a max of 50 connections will be allowed.
-If the limit is reached, the output plugin will issue a retry.
+When Fluent Bit listens for incoming connections (for example, in input plugins like HTTP, TCP, OpenTelemetry, Forward, and Syslog), the operating system maintains a queue of pending connections. The `net.backlog` option controls the maximum number of pending connections that can be queued before new connection attempts are refused. Increasing this value can help Fluent Bit handle bursts of incoming connections more gracefully. The default value is `128`.
 
+{% hint style="info" %}
 
-## Configuration Options
+On Linux, the effective backlog value might be capped by the kernel parameter `net.core.somaxconn`. If you need to allow a greater number of pending connections, you can increase this system setting.
 
-For plugins that rely on networking I/O, the following section describes the network configuration properties available and how they can be used to optimize performance or adjust to different configuration needs:
+{% endhint %}
 
-| Property | Description                                                                                                                               | Default       |
-| :--- |:------------------------------------------------------------------------------------------------------------------------------------------|:--------------|
-| `net.connect_timeout` | Set maximum time expressed in seconds to wait for a TCP connection to be established, this include the TLS handshake time.                | 10            |
-| `net.connect_timeout_log_error` | On connection timeout, specify if it should log an error. When disabled, the timeout is logged as a debug message.                        | true          |
-| `net.dns.mode` | Select the primary DNS connection type (TCP or UDP). Can be set in the [SERVICE] section and overridden on a per plugin basis if desired. |               |
-| `net.dns.prefer_ipv4` | Prioritize IPv4 DNS results when trying to establish a connection.                                                                        | false         |
-| `net.dns.resolver`| Select the primary DNS resolver type (LEGACY or ASYNC).                                                                                   |               |
-| `net.keepalive` | Enable or disable connection keepalive support. Accepts a boolean value: on / off.                                                        | on            |
-| `net.keepalive_idle_timeout` | Set maximum time expressed in seconds for an idle keepalive connection.                                                                   | 30            |
-| `net.keepalive_max_recycle` | Set maximum number of times a keepalive connection can be used before it is retired.                                                      | 2000          |
-| `net.max_worker_connections` | Set maximum number of TCP connections that can be established per worker.                                                                 | 0 (unlimited) |
-| `net.source_address` | Specify network address to bind for data traffic.                                                                                         |               |
+## Configuration options
+
+The following table describes the network configuration properties available and their usage in optimizing performance or adjusting configuration needs for plugins that rely on networking I/O:
+
+| Property | Description | Default |
+| :------- |:------------|:--------|
+| `net.connect_timeout` | Set maximum time expressed in seconds to wait for a TCP connection to be established, including the TLS handshake time. | `10` |
+| `net.connect_timeout_log_error` | On connection timeout, specify if it should log an error. When disabled, the timeout is logged as a debug message. | `true` |
+| `net.dns.mode` | Select the primary DNS connection type (TCP or UDP). Can be set in the `[SERVICE]` section and overridden on a per plugin basis if desired. | _none_ |
+| `net.dns.prefer_ipv4` | Prioritize IPv4 DNS results when trying to establish a connection. | `false` |
+| `net.dns.resolver`| Select the primary DNS resolver type (`LEGACY` or `ASYNC`). | _none_ |
+| `net.keepalive` | Enable or disable connection keepalive support. Accepts a Boolean value: `on` or `off`.  | `on` |
+| `net.keepalive_idle_timeout` | Set maximum time expressed in seconds for an idle keepalive connection. | `30` |
+| `net.keepalive_max_recycle` | Set maximum number of times a keepalive connection can be used before it's retired. | `2000` |
+| `net.max_worker_connections` | Set maximum number of TCP connections that can be established per worker. | `0` (unlimited) |
+| `net.source_address` | Specify network address to bind for data traffic. | _none_ |
+| `net.backlog` | Set the maximum number of pending connections for listening sockets. This option requires Fluent Bit version 4.0.4 or later. | `128` |
 
 ## Example
 
-As an example, we will send 5 random messages through a TCP output connection, in the remote side we will use `nc` \(netcat\) utility to see the data.
+This example sends five random messages through a TCP output connection. The remote side uses the `nc` (netcat) utility to see the data.
+
+Use the following configuration snippet of your choice in a corresponding file named `fluent-bit.yaml` or `fluent-bit.conf`:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name:  random
+      samples: 5
+
+  outputs:
+    - name: tcp
+      match: '*'
+      host: 127.0.0.1
+      port: 9090
+      format: json_lines
+      # Networking Setup
+      net.dns.mode: TCP
+      net.connect_timeout: 5
+      net.source_address: 127.0.0.1
+      net.keepalive: on
+      net.keepalive_idle_timeout: 10
+```
 
-Put the following configuration snippet in a file called `fluent-bit.conf`:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [SERVICE]
-    flush     1
-    log_level info
+  flush     1
+  log_level info
 
 [INPUT]
-    name      random
-    samples   5
+  name      random
+  samples   5
 
 [OUTPUT]
-    name      tcp
-    match     *
-    host      127.0.0.1
-    port      9090
-    format    json_lines
-    # Networking Setup
-    net.dns.mode                TCP
-    net.connect_timeout         5
-    net.source_address          127.0.0.1
-    net.keepalive               on
-    net.keepalive_idle_timeout  10
+  name      tcp
+  match     *
+  host      127.0.0.1
+  port      9090
+  format    json_lines
+  # Networking Setup
+  net.dns.mode                TCP
+  net.connect_timeout         5
+  net.source_address          127.0.0.1
+  net.keepalive               on
+  net.keepalive_idle_timeout  10
 ```
 
+{% endtab %}
+{% endtabs %}
+
 In another terminal, start `nc` and make it listen for messages on TCP port 9090:
 
-```text
-$ nc -l 9090
+```shell
+nc -l 9090
 ```
 
-Now start Fluent Bit with the configuration file written above and you will see the data flowing to netcat:
+Start Fluent Bit with the configuration file you defined previously to see data flowing to netcat:
 
-```text
+```shell
 $ nc -l 9090
+
 {"date":1587769732.572266,"rand_value":9704012962543047466}
 {"date":1587769733.572354,"rand_value":7609018546050096989}
 {"date":1587769734.572388,"rand_value":17035865539257638950}
@@ -110,6 +150,6 @@ $ nc -l 9090
 {"date":1587769736.572277,"rand_value":527581343064950185}
 ```
 
-If the `net.keepalive` option is not enabled, Fluent Bit will close the TCP connection and netcat will quit, here we can see how the keepalive connection works.
+If the `net.keepalive` option isn't enabled, Fluent Bit closes the TCP connection and netcat quits.
 
-After the 5 records arrive, the connection will keep idle and after 10 seconds it will be closed due to `net.keepalive_idle_timeout`.
+After the five records arrive, the connection idles. After 10 seconds, the connection closes due to `net.keepalive_idle_timeout`.
\ No newline at end of file
diff --git a/administration/performance.md b/administration/performance.md
new file mode 100644
index 000000000..90a22ddb5
--- /dev/null
+++ b/administration/performance.md
@@ -0,0 +1,58 @@
+# Performance tips
+
+Fluent Bit is designed for high performance and minimal resource usage. Depending on your use case, you can optimize further using specific configuration options to achieve faster performance or reduce resource consumption.
+
+## Reading files with `tail`
+
+The `Tail` input plugin is used to read data from files on the filesystem. By default, it uses a small memory buffer of `32KB` per monitored file. While this is sufficient for most generic use cases and helps keep memory usage low when monitoring many files, there are scenarios where you might want to increase performance by using more memory.
+
+If your files are typically larger than `32KB`, consider increasing the buffer size to speed up file reading. For example, you can experiment with a buffer size of `128KB`:
+
+```yaml
+pipeline:
+  inputs:
+    - name: tail
+      path: '/var/log/containers/*.log'
+      buffer_chunk_size: 128kb
+      buffer_max_size: 128kb
+```
+
+By increasing the buffer size, Fluent Bit will make fewer system calls (read(2)) to read the data, reducing CPU usage and improving performance.
+
+## Fluent Bit and SIMD for JSON encoding
+
+Starting in Fluent Bit v3.2, performance improvements have been introduced for JSON encoding. Plugins that convert logs from the Fluent Bit internal binary representation
+to JSON can now do so up to 30% faster using Single Instruction, Multiple Data (SIMD) optimizations.
+
+### Enabling SIMD support
+
+Ensure that your Fluent Bit binary is built with SIMD support. This feature is available for architectures such as x86_64, amd64, aarch64, and arm64. As of now, SIMD is only enabled by default in Fluent Bit container images.
+
+You can check if SIMD is enabled by looking for the following log entry when Fluent Bit starts:
+
+```text
+[2024/11/10 22:25:53] [ info] [fluent bit] version=3.2.0, commit=12cb22e0e9, pid=74359
+[2024/11/10 22:25:53] [ info] [storage] ver=1.5.2, type=memory, sync=normal, checksum=off, max_chunks_up=128
+[2024/11/10 22:25:53] [ info] [simd    ] SSE2
+[2024/11/10 22:25:53] [ info] [cmetrics] version=0.9.8
+[2024/11/10 22:25:53] [ info] [ctraces ] version=0.5.7
+[2024/11/10 22:25:53] [ info] [sp] stream processor started
+```
+
+Look for the `simd` entry, which will indicate the SIMD support type, such as `SSE2`, `NEON`, or `none`.
+
+If your Fluent Bit binary wasn't built with SIMD enabled and you are using a supported platform, you can build Fluent Bit from source using the CMake option `-DFLB_SIMD=On`.
+
+## Run input plugins in threaded mode
+
+By default, most of input plugins runs in the same system thread than the main event loop, however by configuration you can instruct them to run in a separate thread which will allow you to take advantage of other CPU cores in your system.
+
+To run an input plugin in threaded mode, add `threaded: true` as in the following example:
+
+```yaml
+pipeline:
+  inputs:
+    - name: tail
+      path: '/var/log/containers/*.log'
+      threaded: true
+```
diff --git a/administration/scheduling-and-retries.md b/administration/scheduling-and-retries.md
index 67100acc7..649882fc3 100644
--- a/administration/scheduling-and-retries.md
+++ b/administration/scheduling-and-retries.md
@@ -1,29 +1,29 @@
-# Scheduling and Retries
+# Scheduling and retries
 
-[Fluent Bit](https://fluentbit.io) has an Engine that helps to coordinate the data ingestion from input plugins and calls the _Scheduler_ to decide when it is time to flush the data through one or multiple output plugins. The Scheduler flushes new data at a fixed time of seconds and the _Scheduler_ retries when asked.
+<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=a70a6008-106f-43c8-8930-243806371482" />
 
-Once an output plugin gets called to flush some data, after processing that data it can notify the Engine three possible return statuses:
+[Fluent Bit](https://fluentbit.io) has an engine that helps to coordinate the data ingestion from input plugins. The engine calls the _scheduler_ to decide when it's time to flush the data through one or multiple output plugins. The scheduler flushes new data at a fixed number of seconds, and retries when asked.
 
-* OK
-* Retry
-* Error
+When an output plugin gets called to flush some data, after processing that data it can notify the engine using these possible return statuses:
 
-If the return status was **OK**, it means it was successfully able to process and flush the data. If it returned an **Error** status, it means that an unrecoverable error happened and the engine should not try to flush that data again. If a **Retry** was requested, the _Engine_ will ask the _Scheduler_ to retry to flush that data, the Scheduler will decide how many seconds to wait before that happens.
+- `OK`: Data successfully processed and flushed.
+- `Retry`: If a retry is requested, the engine asks the scheduler to retry flushing that data. The scheduler decides how many seconds to wait before retry.
+- `Error`: An unrecoverable error occurred and the engine shouldn't try to flush that data again.
 
-## Configuring Wait Time for Retry
+## Configure wait time for retry
 
-The Scheduler provides two configuration options called **scheduler.cap** and **scheduler.base** which can be set in the Service section.
+The scheduler provides two configuration options, called `scheduler.cap` and `scheduler.base`, which can be set in the Service section. These determine the waiting time before a retry happens.
 
-| Key | Description | Default Value | 
-| -- | ------------| --------------| 
-| scheduler.cap | Set a maximum retry time in seconds. The property is supported from v1.8.7. | 2000 | 
-| scheduler.base | Set a base of exponential backoff. The property is supported from v1.8.7. | 5 |
+| Key | Description | Default |
+| --- | ------------| --------------|
+| `scheduler.cap` | Set a maximum retry time in seconds. Supported in v1.8.7 or later. | `2000` |
+| `scheduler.base` | Set a base of exponential backoff. Supported in v1.8.7 or later. | `5` |
 
-These two configuration options determine the waiting time before a retry will happen. 
+The `scheduler.base` determines the lower bound of time and the `scheduler.cap` determines the upper bound for each retry.
 
-Fluent Bit uses an exponential backoff and jitter algorithm to determine the waiting time before a retry.
+Fluent Bit uses an exponential backoff and jitter algorithm to determine the waiting time before a retry. The waiting time is a random number between a configurable upper and lower bound. For a detailed explanation of the exponential backoff and jitter algorithm, see [Exponential Backoff And Jitter](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/).
 
-The waiting time is a random number between a configurable upper and lower bound.
+For example:
 
 For the Nth retry, the lower bound of the random number will be:
 
@@ -33,68 +33,108 @@ The upper bound will be:
 
 `min(base * (Nth power of 2), cap)`
 
-Given an example where `base` is set to 3 and `cap` is set to 30. 
+For example:
 
-1st retry: The lower bound will be 3, the upper bound will be 3 * 2 = 6. So the waiting time will be a random number between (3, 6).
+When `base` is set to 3 and `cap` is set to 30:
 
-2nd retry: the lower bound will be 3, the upper bound will be 3 * (2 * 2) = 12. So the waiting time will be a random number between (3, 12).
+First retry: The lower bound will be 3. The upper bound will be `3 * 2 = 6`. The waiting time will be a random number between (3, 6).
 
-3rd retry: the lower bound will be 3, the upper bound will be 3 * (2 * 2 * 2) = 24. So the waiting time will be a random number between (3, 24).
+Second retry: The lower bound will be 3. The upper bound will be `3 * (2 * 2) = 12`. The waiting time will be a random number between (3, 12).
 
-4th retry: the lower bound will be 3, since 3 * (2 * 2 * 2 * 2) = 48 > 30, the upper bound will be 30. So the waiting time will be a random number between (3, 30).
+Third retry: The lower bound will be 3. The upper bound will be `3 * (2 * 2 * 2) =24`. The waiting time will be a random number between (3, 24).
 
-Basically, the **scheduler.base** determines the lower bound of time between each retry and the **scheduler.cap** determines the upper bound.
+Fourth retry: The lower bound will be 3, because `3 * (2 * 2 * 2 * 2) = 48` > `30`. The upper bound will be 30. The waiting time will be a random number between (3, 30).
 
-For a detailed explanation of the exponential backoff and jitter algorithm, please check this [blog](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/).
+### Wait time example
 
-### Example
+The following example configures the `scheduler.base` as `3` seconds and `scheduler.cap` as `30` seconds.
 
-The following example configures the **scheduler.base** as 3 seconds and **scheduler.cap** as 30 seconds. 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 5
+  daemon: off
+  log_level: debug
+  scheduler.base: 3
+  scheduler.cap: 30
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [SERVICE]
-    Flush            5
-    Daemon           off
-    Log_Level        debug
-    scheduler.base   3
-    scheduler.cap    30
+  Flush            5
+  Daemon           off
+  Log_Level        debug
+  scheduler.base   3
+  scheduler.cap    30
 ```
 
+{% endtab %}
+{% endtabs %}
+
 The waiting time will be:
 
-| Nth retry | waiting time range (seconds) |
-| --- | --- | 
+| Nth retry | Waiting time range (seconds) |
+| --- | --- |
 | 1 | (3, 6)  |
 | 2 | (3, 12) |
 | 3 | (3, 24) |
 | 4 | (3, 30) |
 
-## Configuring Retries
+## Configure retries
 
-The Scheduler provides a simple configuration option called **Retry\_Limit**, which can be set independently on each output section. This option allows us to disable retries or impose a limit to try N times and then discard the data after reaching that limit:
+The scheduler provides a configuration option called `Retry_Limit`, which can be set independently for each output section. This option lets you disable retries or impose a limit to try N times and then discard the data after reaching that limit:
 
 |  | Value | Description |
 | :--- | :--- | :--- |
-| Retry\_Limit | N | Integer value to set the maximum number of retries allowed. N must be &gt;= 1 \(default: 1\) |
-| Retry\_Limit | `no_limits` or `False` | When Retry\_Limit is set to `no_limits` or`False`, means that there is not limit for the number of retries that the Scheduler can do. |
-| Retry\_Limit | no\_retries | When Retry\_Limit is set to no\_retries, means that retries are disabled and Scheduler would not try to send data to the destination if it failed the first time. |
+| `Retry_Limit` | N | Integer value to set the maximum number of retries allowed. N must be &gt;= 1 (default: `1`) |
+| `Retry_Limit` | `no_limits` or `False` | When set there no limit for the number of retries that the scheduler can do. |
+| `Retry_Limit` | `no_retries` | When set, retries are disabled and scheduler doesn't try to send data to the destination if it failed the first time. |
+
+### Retry example
 
-### Example
+The following example configures two outputs, where the HTTP plugin has an unlimited number of retries, and the Elasticsearch plugin have a limit of `5` retries:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: http
+      host: 192.168.5.6
+      port: 8080
+      retry_limit: false
+
+    - name: es
+      host: 192.168.5.20
+      port: 9200
+      logstash_format: on
+      retry_limit: 5
+```
 
-The following example configures two outputs where the HTTP plugin has an unlimited number of while the Elasticsearch plugin have a limit of 5 retries:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [OUTPUT]
-    Name        http
-    Host        192.168.5.6
-    Port        8080
-    Retry_Limit False
+  Name        http
+  Host        192.168.5.6
+  Port        8080
+  Retry_Limit False
 
 [OUTPUT]
-    Name            es
-    Host            192.168.5.20
-    Port            9200
-    Logstash_Format On
-    Retry_Limit     5
+  Name            es
+  Host            192.168.5.20
+  Port            9200
+  Logstash_Format On
+  Retry_Limit     5
 ```
 
+{% endtab %}
+{% endtabs %}
\ No newline at end of file
diff --git a/administration/transport-security.md b/administration/transport-security.md
index f2a644c8a..82eaef1f0 100644
--- a/administration/transport-security.md
+++ b/administration/transport-security.md
@@ -1,84 +1,87 @@
 
-# Transport Security
+# TLS
 
-Fluent Bit provides integrated support for _Transport Layer Security_ \(TLS\) and it predecessor _Secure Sockets Layer_ \(SSL\) respectively. In this section we will refer as TLS only for both implementations.
+Fluent Bit provides integrated support for Transport Layer Security (TLS) and its predecessor Secure Sockets Layer (SSL). This section refers only to TLS for both implementations.
 
 Both input and output plugins that perform Network I/O can optionally enable TLS and configure the behavior. The following table describes the properties available:
 
 | Property | Description | Default |
 | :--- | :--- | :--- |
-| tls | enable or disable TLS support | Off |
-| tls.verify | force certificate validation | On |
-| tls.debug | Set TLS debug verbosity level. It accept the following values: 0 \(No debug\), 1 \(Error\), 2 \(State change\), 3 \(Informational\) and 4 Verbose | 1 |
-| tls.ca\_file | absolute path to CA certificate file |  |
-| tls.ca\_path | absolute path to scan for certificate files |  |
-| tls.crt\_file | absolute path to Certificate file |  |
-| tls.key\_file | absolute path to private Key file |  |
-| tls.key\_passwd | optional password for tls.key\_file file |  |
-| tls.vhost | hostname to be used for TLS SNI extension |  |
-
-*Note : in order to use TLS on input plugins the user is expected to provide both a certificate and private key*
-
-The listed properties can be enabled in the configuration file, specifically on each output plugin section or directly through the command line.
-
-The following **output** plugins can take advantage of the TLS feature:
-
-* [Amazon S3](../pipeline/outputs/s3.md)
-* [Apache SkyWalking](../pipeline/outputs/skywalking.md)
-* [Azure](../pipeline/outputs/azure.md)
-* [Azure Blob](../pipeline/outputs/azure_blob.md)
-* [Azure Data Explorer (Kusto)](../pipeline/outputs/azure_kusto.md)
-* [Azure Logs Ingestion API](../pipeline/outputs/azure_logs_ingestion.md)
-* [BigQuery](../pipeline/outputs/bigquery.md)
-* [Datadog](../pipeline/outputs/datadog.md)
-* [Elasticsearch](../pipeline/outputs/elasticsearch.md)
-* [Forward](../pipeline/outputs/forward.md)
-* [GELF](../pipeline/outputs/gelf.md)
-* [Google Chronicle](../pipeline/outputs/chronicle.md)
-* [HTTP](../pipeline/outputs/http.md)
-* [InfluxDB](../pipeline/outputs/influxdb.md)
-* [Kafka REST Proxy](../pipeline/outputs/kafka-rest-proxy.md)
-* [LogDNA](../pipeline/outputs/logdna.md)
-* [Loki](../pipeline/outputs/loki.md)
-* [New Relic](../pipeline/outputs/new-relic.md)
-* [OpenSearch](../pipeline/outputs/opensearch.md)
-* [OpenTelemetry](../pipeline/outputs/opentelemetry.md)
-* [Oracle Cloud Infrastructure Logging Analytics](../pipeline/outputs/oci-logging-analytics.md)
-* [Prometheus Remote Write](../pipeline/outputs/prometheus-remote-write.md)
-* [Slack](../pipeline/outputs/slack.md)
-* [Splunk](../pipeline/outputs/splunk.md)
-* [Stackdriver](../pipeline/outputs/stackdriver.md)
-* [Syslog](../pipeline/outputs/syslog.md)
-* [TCP & TLS](../pipeline/outputs/tcp-and-tls.md)
-* [Treasure Data](../pipeline/outputs/treasure-data.md)
-* [WebSocket](../pipeline/outputs/websocket.md)
-
-The following **input** plugins can take advantage of the TLS feature:
-
-* [Docker Events](../pipeline/inputs/docker-events.md)
-* [Elasticsearch (Bulk API)](../pipeline/inputs/elasticsearch.md)
-* [Forward](../pipeline/inputs/forward.md)
-* [Health](../pipeline/inputs/health.md)
-* [HTTP](../pipeline/inputs/http.md)
-* [Kubernetes Events](../pipeline/inputs/kubernetes-events.md)
-* [MQTT](../pipeline/inputs/mqtt.md)
-* [NGINX Exporter Metrics](../pipeline/inputs/nginx.md)
-* [OpenTelemetry](../pipeline/inputs/opentelemetry.md)
-* [Prometheus Scrape Metrics](../pipeline/inputs/prometheus-scrape-metrics.md)
-* [Prometheus Remote Write](../pipeline/inputs/prometheus-remote-write.md)
-* [Splunk (HTTP HEC)](../pipeline/inputs/splunk.md)
-* [Syslog](../pipeline/inputs/syslog.md)
-* [TCP](../pipeline/inputs/tcp.md)
-
-In addition, other plugins implements a sub-set of TLS support, meaning, with restricted configuration:
-
-* [Kubernetes Filter](../pipeline/filters/kubernetes.md)
+| `tls` | Enable or disable TLS support. | `Off` |
+| `tls.verify` | Force certificate validation. | `On` |
+| `tls.verify_hostname` | Force TLS verification of host names. | `Off` |
+| `tls.debug` | Set TLS debug verbosity level. Accepted values: `0` (No debug), `1` (Error), `2` (State change), `3` (Informational) and `4`. (Verbose) | `1` |
+| `tls.ca_file` | Absolute path to CA certificate file. | _none_ |
+| `tls.ca_path` | Absolute path to scan for certificate files. | _none_ |
+| `tls.crt_file` | Absolute path to Certificate file. | _none_ |
+| `tls.key_file` | Absolute path to private Key file. | _none_ |
+| `tls.key_passwd` | Optional password for `tls.key_file` file. | _none_ |
+| `tls.vhost` | Hostname to be used for TLS SNI extension. | _none_ |
+
+To use TLS on input plugins, you must provide both a certificate and a private key.
+
+The listed properties can be enabled in the configuration file, specifically in each output plugin section or directly through the command line.
+
+The following output plugins can take advantage of the TLS feature:
+
+- [Amazon S3](../pipeline/outputs/s3.md)
+- [Apache SkyWalking](../pipeline/outputs/skywalking.md)
+- [Azure](../pipeline/outputs/azure.md)
+- [Azure Blob](../pipeline/outputs/azure_blob.md)
+- [Azure Data Explorer (Kusto)](../pipeline/outputs/azure_kusto.md)
+- [Azure Logs Ingestion API](../pipeline/outputs/azure_logs_ingestion.md)
+- [BigQuery](../pipeline/outputs/bigquery.md)
+- [Dash0](../pipeline/outputs/dash0.md)
+- [Datadog](../pipeline/outputs/datadog.md)
+- [Elasticsearch](../pipeline/outputs/elasticsearch.md)
+- [Forward](../pipeline/outputs/forward.md)
+- [GELF](../pipeline/outputs/gelf.md)
+- [Google Chronicle](../pipeline/outputs/chronicle.md)
+- [HTTP](../pipeline/outputs/http.md)
+- [InfluxDB](../pipeline/outputs/influxdb.md)
+- [Kafka REST Proxy](../pipeline/outputs/kafka-rest-proxy.md)
+- [LogDNA](../pipeline/outputs/logdna.md)
+- [Loki](../pipeline/outputs/loki.md)
+- [New Relic](../pipeline/outputs/new-relic.md)
+- [OpenSearch](../pipeline/outputs/opensearch.md)
+- [OpenTelemetry](../pipeline/outputs/opentelemetry.md)
+- [Oracle Cloud Infrastructure Logging Analytics](../pipeline/outputs/oci-logging-analytics.md)
+- [Prometheus Remote Write](../pipeline/outputs/prometheus-remote-write.md)
+- [Slack](../pipeline/outputs/slack.md)
+- [Splunk](../pipeline/outputs/splunk.md)
+- [Stackdriver](../pipeline/outputs/stackdriver.md)
+- [Syslog](../pipeline/outputs/syslog.md)
+- [TCP and TLS](../pipeline/outputs/tcp-and-tls.md)
+- [Treasure Data](../pipeline/outputs/treasure-data.md)
+- [WebSocket](../pipeline/outputs/websocket.md)
+
+The following input plugins can take advantage of the TLS feature:
+
+- [Docker Events](../pipeline/inputs/docker-events.md)
+- [Elasticsearch (Bulk API)](../pipeline/inputs/elasticsearch.md)
+- [Forward](../pipeline/inputs/forward.md)
+- [Health](../pipeline/inputs/health.md)
+- [HTTP](../pipeline/inputs/http.md)
+- [Kubernetes Events](../pipeline/inputs/kubernetes-events.md)
+- [MQTT](../pipeline/inputs/mqtt.md)
+- [NGINX Exporter Metrics](../pipeline/inputs/nginx.md)
+- [OpenTelemetry](../pipeline/inputs/opentelemetry.md)
+- [Prometheus Scrape Metrics](../pipeline/inputs/prometheus-scrape-metrics.md)
+- [Prometheus Remote Write](../pipeline/inputs/prometheus-remote-write.md)
+- [Splunk (HTTP HEC)](../pipeline/inputs/splunk.md)
+- [Syslog](../pipeline/inputs/syslog.md)
+- [TCP](../pipeline/inputs/tcp.md)
+
+In addition, other plugins implement a subset of TLS support, with restricted configuration:
+
+- [Kubernetes Filter](../pipeline/filters/kubernetes.md)
 
 ## Example: enable TLS on HTTP input
-By default HTTP input plugin uses plain TCP, enabling TLS from the command line can be done with:
 
-```text
-./bin/fluent-bit -i http \
+By default, the HTTP input plugin uses plain TCP. Run the following command to enable TLS:
+
+```shell
+fluent-bit -i http \
            -p port=9999 \
            -p tls=on \
            -p tls.verify=off \
@@ -88,61 +91,116 @@ By default HTTP input plugin uses plain TCP, enabling TLS from the command line
            -m '*'
 ```
 
-In the command line above, the two properties _tls_ and _tls.verify_ where enabled for demonstration purposes \(we strongly suggest always keep verification ON\).
+{% hint style="info" %}
+
+See the Tips and Tricks section for details on generating `self_signed.crt` and `self_signed.key` files shown in these examples.
+
+{% endhint %}
+
+In the previous command, the two properties `tls` and `tls.verify` are set for demonstration purposes. Always enable verification in production environments.
 
 The same behavior can be accomplished using a configuration file:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: http
+      port: 9999
+      tls: on
+      tls.verify: off
+      tls.cert_file: self_signed.crt
+      tls.key_file: self_signed.key
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
 ```text
 [INPUT]
-    name http
-    port 9999
-    tls on
-    tls.verify off
-    tls.crt_file self_signed.crt
-    tls.key_file self_signed.key
+  name http
+  port 9999
+  tls on
+  tls.verify off
+  tls.crt_file self_signed.crt
+  tls.key_file self_signed.key
 
 [OUTPUT]
-    Name       stdout
-    Match      *
+  Name       stdout
+  Match      *
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ## Example: enable TLS on HTTP output
 
-By default HTTP output plugin uses plain TCP, enabling TLS from the command line can be done with:
+By default, the HTTP output plugin uses plain TCP. Run the following command to enable TLS:
 
-```text
-$ fluent-bit -i cpu -t cpu -o http://192.168.2.3:80/something \
-    -p tls=on         \
-    -p tls.verify=off \
-    -m '*'
+```shell
+fluent-bit -i cpu -t cpu -o http://192.168.2.3:80/something \
+           -p tls=on         \
+           -p tls.verify=off \
+           -m '*'
 ```
 
-In the command line above, the two properties _tls_ and _tls.verify_ where enabled for demonstration purposes \(we strongly suggest always keep verification ON\).
+In the previous command, the properties `tls` and `tls.verify` are enabled for demonstration purposes. Always enable verification in production environments.
 
 The same behavior can be accomplished using a configuration file:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
+
+  outputs:
+    - name: http
+      match: '*'
+      host: 192.168.2.3
+      port: 80
+      uri: /something
+      tls: on
+      tls.verify: off
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
 ```text
 [INPUT]
-    Name  cpu
-    Tag   cpu
+  Name  cpu
+  Tag   cpu
 
 [OUTPUT]
-    Name       http
-    Match      *
-    Host       192.168.2.3
-    Port       80
-    URI        /something
-    tls        On
-    tls.verify Off
+  Name       http
+  Match      *
+  Host       192.168.2.3
+  Port       80
+  URI        /something
+  tls        On
+  tls.verify Off
 ```
 
-## Tips and Tricks
+{% endtab %}
+{% endtabs %}
 
-### Generate your own self signed certificates for testing purposes.
+## Tips and tricks
 
-This will generate a 4096 bit RSA key pair and a certificate that is signed using SHA-256 with the expiration date set to 30 days in the future, `test.host.net` set as common name and since we opted out of `DES` the private key will be stored in plain text.
+### Generate a self-signed certificates for testing purposes
 
-```
+The following command generates a 4096-bit RSA key pair and a certificate that's signed using `SHA-256` with the expiration date set to 30 days in the future. In this example, `test.host.net` is set as the common name. This example opts out of `DES`, so the private key is stored in plain text.
+
+```shell
 openssl req -x509 \
             -newkey rsa:4096 \
             -sha256 \
@@ -154,20 +212,109 @@ openssl req -x509 \
 
 ### Connect to virtual servers using TLS
 
-Fluent Bit supports [TLS server name indication](https://en.wikipedia.org/wiki/Server_Name_Indication). If you are serving multiple hostnames on a single IP address \(a.k.a. virtual hosting\), you can make use of `tls.vhost` to connect to a specific hostname.
+Fluent Bit supports [TLS server name indication](https://en.wikipedia.org/wiki/Server_Name_Indication). If you are serving multiple host names on a single IP address (for example, using virtual hosting), you can make use of `tls.vhost` to connect to a specific hostname.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
+
+  outputs:
+    - name: forward
+      match: '*'
+      host: 192.168.10.100
+      port: 24224
+      tls: on
+      tls.verify: off
+      tls.ca_file: '/etc/certs/fluent.crt'
+      tls.vhost: 'fluent.example.com'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[INPUT]
+  Name  cpu
+  Tag   cpu
+
+[OUTPUT]
+  Name        forward
+  Match       *
+  Host        192.168.10.100
+  Port        24224
+  tls         On
+  tls.verify  On
+  tls.ca_file /etc/certs/fluent.crt
+  tls.vhost   fluent.example.com
+```
+
+{% endtab %}
+{% endtabs %}
+
+### Verify `subjectAltName`
+
+By default, TLS verification of host names isn't done automatically. As an example, you can extract the X509v3 Subject Alternative Name from a certificate:
+
+```text
+X509v3 Subject Alternative Name:
+    DNS:my.fluent-aggregator.net
+```
+
+This certificate covers only `my.fluent-aggregator.net` so if you use a different hostname it should fail.
+
+To fully verify the alternative name and demonstrate the failure, enable `tls.verify_hostname`:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
+
+  outputs:
+    - name: forward
+      match: '*'
+      host: other.fluent-aggregator.net
+      port: 24224
+      tls: on
+      tls.verify: on
+      tls.verify_hostname: on
+      tls.ca_file: '/path/to/fluent-x509v3-alt-name.crt'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name  cpu
-    Tag   cpu
+  Name  cpu
+  Tag   cpu
 
 [OUTPUT]
-    Name        forward
-    Match       *
-    Host        192.168.10.100
-    Port        24224
-    tls         On
-    tls.verify  On
-    tls.ca_file /etc/certs/fluent.crt
-    tls.vhost   fluent.example.com
+  Name                forward
+  Match               *
+  Host                other.fluent-aggregator.net
+  Port                24224
+  tls                 On
+  tls.verify          On
+  tls.verify_hostname on
+  tls.ca_file         /path/to/fluent-x509v3-alt-name.crt
 ```
+
+{% endtab %}
+{% endtabs %}
+
+This outgoing connect will fail and disconnect:
+
+```text
+[2024/06/17 16:51:31] [error] [tls] error: unexpected EOF with reason: certificate verify failed
+[2024/06/17 16:51:31] [debug] [upstream] connection #50 failed to other.fluent-aggregator.net:24224
+[2024/06/17 16:51:31] [error] [output:forward:forward.0] no upstream connections available
+```
\ No newline at end of file
diff --git a/administration/troubleshooting.md b/administration/troubleshooting.md
index cae5ad2ce..c09c6f340 100644
--- a/administration/troubleshooting.md
+++ b/administration/troubleshooting.md
@@ -1,19 +1,20 @@
 # Troubleshooting
 
-* [Tap Functionality: generate events or records](troubleshooting.md#tap-functionality)
-* [Dump Internals Signal](troubleshooting#dump-internals-signal)
+<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=759ddb3d-b363-4ee6-91fa-21025259767a" />
 
-## Tap Functionality
+- [Tap: generate events or records](#tap)
+- [Dump internals signal](#dump-internals-and-signal)
 
-Tap can be used to generate events or records detailing what messages
-pass through Fluent Bit, at what time and what filters affect them.
+## Tap
 
-### Simple example
+Tap can be used to generate events or records detailing what messages pass through Fluent Bit, at what time and what filters affect them.
 
-First, we will make sure that the container image we are going to use actually supports Fluent Bit Tap (available in Fluent Bit 2.0+):
+### Tap example
+
+Ensure that the container image supports Fluent Bit Tap (available in Fluent Bit 2.0+):
 
 ```shell
-$ docker run --rm -ti fluent/fluent-bit:latest --help | grep trace
+docker run --rm -ti fluent/fluent-bit:latest --help | grep trace
   -Z, --enable-chunk-traceenable chunk tracing, it can be activated either through the http api or the command line
   --trace-input           input to start tracing on startup.
   --trace-output          output to use for tracing on startup.
@@ -21,34 +22,15 @@ $ docker run --rm -ti fluent/fluent-bit:latest --help | grep trace
   --trace                 setup a trace pipeline on startup. Uses a single line, ie: "input=dummy.0 output=stdout output.format='json'"
 ```
 
-If the `--enable-chunk-trace` option is present it means Fluent Bit has support for Fluent Bit Tap but it is disabled by default, so remember to enable it with this option.
+If the `--enable-chunk-trace` option is present, your Fluent Bit version supports Fluent Bit Tap, but it's disabled by default. Use this option to enable it.
 
-You can start fluent-bit with tracing activated from the beginning by using the `trace-input` and `trace-output` properties, like so:
+You can start Fluent Bit with tracing activated from the beginning by using the `trace-input` and `trace-output` properties:
 
-```bash
+```shell
 $ fluent-bit -Z -i dummy -o stdout -f 1 --trace-input=dummy.0 --trace-output=stdout
-Fluent Bit v2.1.8
-* Copyright (C) 2015-2022 The Fluent Bit Authors
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
-
-[2023/07/21 16:27:01] [ info] [fluent bit] version=2.1.8, commit=824ba3dd08, pid=622937
-[2023/07/21 16:27:01] [ info] [storage] ver=1.4.0, type=memory, sync=normal, checksum=off, max_chunks_up=128
-[2023/07/21 16:27:01] [ info] [cmetrics] version=0.6.3
-[2023/07/21 16:27:01] [ info] [ctraces ] version=0.3.1
-[2023/07/21 16:27:01] [ info] [input:dummy:dummy.0] initializing
-[2023/07/21 16:27:01] [ info] [input:dummy:dummy.0] storage_strategy='memory' (memory only)
-[2023/07/21 16:27:01] [ info] [sp] stream processor started
-[2023/07/21 16:27:01] [ info] [output:stdout:stdout.0] worker #0 started
-[2023/07/21 16:27:01] [ info] [fluent bit] version=2.1.8, commit=824ba3dd08, pid=622937
-[2023/07/21 16:27:01] [ info] [storage] ver=1.4.0, type=memory, sync=normal, checksum=off, max_chunks_up=128
-[2023/07/21 16:27:01] [ info] [cmetrics] version=0.6.3
-[2023/07/21 16:27:01] [ info] [ctraces ] version=0.3.1
-[2023/07/21 16:27:01] [ info] [input:emitter:trace-emitter] initializing
-[2023/07/21 16:27:01] [ info] [input:emitter:trace-emitter] storage_strategy='memory' (memory only)
-[2023/07/21 16:27:01] [ info] [sp] stream processor started
-[2023/07/21 16:27:01] [ info] [output:stdout:stdout.0] worker #0 started
-.[0] dummy.0: [[1689971222.068537501, {}], {"message"=>"dummy"}]
+
+...
+[0] dummy.0: [[1689971222.068537501, {}], {"message"=>"dummy"}]
 [0] dummy.0: [[1689971223.068556121, {}], {"message"=>"dummy"}]
 [0] trace: [[1689971222.068677045, {}], {"type"=>1, "trace_id"=>"0", "plugin_instance"=>"dummy.0", "records"=>[{"timestamp"=>1689971222, "record"=>{"message"=>"dummy"}}], "start_time"=>1689971222, "end_time"=>1689971222}]
 [1] trace: [[1689971222.068735577, {}], {"type"=>3, "trace_id"=>"0", "plugin_instance"=>"dummy.0", "records"=>[{"timestamp"=>1689971222, "record"=>{"message"=>"dummy"}}], "start_time"=>1689971222, "end_time"=>1689971222}]
@@ -73,106 +55,65 @@ Fluent Bit v2.1.8
 [2023/07/21 16:27:07] [ info] [output:stdout:stdout.0] thread worker #0 stopped
 ```
 
-If you see the following warning then the `-Z` or `--enable-chunk-tracing` option is missing:
+The following warning indicates the `-Z` or `--enable-chunk-tracing` option is missing:
 
-```bash
+```text
 [2023/07/21 16:26:42] [ warn] [chunk trace] enable chunk tracing via the configuration or  command line to be able to activate tracing.
 ```
 
-Properties can be set for the output using the `--trace-output-property` option:
+Set properties for the output using the `--trace-output-property` option:
 
-```bash
+```shell
 $ fluent-bit -Z -i dummy -o stdout -f 1 --trace-input=dummy.0 --trace-output=stdout --trace-output-property=format=json_lines
-Fluent Bit v2.1.8
-* Copyright (C) 2015-2022 The Fluent Bit Authors
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
-
-[2023/07/21 16:28:59] [ info] [fluent bit] version=2.1.8, commit=824ba3dd08, pid=623170
-[2023/07/21 16:28:59] [ info] [storage] ver=1.4.0, type=memory, sync=normal, checksum=off, max_chunks_up=128
-[2023/07/21 16:28:59] [ info] [cmetrics] version=0.6.3
-[2023/07/21 16:28:59] [ info] [ctraces ] version=0.3.1
-[2023/07/21 16:28:59] [ info] [input:dummy:dummy.0] initializing
-[2023/07/21 16:28:59] [ info] [input:dummy:dummy.0] storage_strategy='memory' (memory only)
-[2023/07/21 16:28:59] [ info] [sp] stream processor started
-[2023/07/21 16:28:59] [ info] [output:stdout:stdout.0] worker #0 started
-[2023/07/21 16:28:59] [ info] [fluent bit] version=2.1.8, commit=824ba3dd08, pid=623170
-[2023/07/21 16:28:59] [ info] [storage] ver=1.4.0, type=memory, sync=normal, checksum=off, max_chunks_up=128
-[2023/07/21 16:28:59] [ info] [cmetrics] version=0.6.3
-[2023/07/21 16:28:59] [ info] [ctraces ] version=0.3.1
-[2023/07/21 16:28:59] [ info] [input:emitter:trace-emitter] initializing
-[2023/07/21 16:28:59] [ info] [input:emitter:trace-emitter] storage_strategy='memory' (memory only)
-[2023/07/21 16:29:00] [ info] [sp] stream processor started
-[2023/07/21 16:29:00] [ info] [output:stdout:stdout.0] worker #0 started
-.[0] dummy.0: [[1689971340.068565891, {}], {"message"=>"dummy"}]
+
+...
+[0] dummy.0: [[1689971340.068565891, {}], {"message"=>"dummy"}]
 [0] dummy.0: [[1689971341.068632477, {}], {"message"=>"dummy"}]
 {"date":1689971340.068745,"type":1,"trace_id":"0","plugin_instance":"dummy.0","records":[{"timestamp":1689971340,"record":{"message":"dummy"}}],"start_time":1689971340,"end_time":1689971340}
 {"date":1689971340.068825,"type":3,"trace_id":"0","plugin_instance":"dummy.0","records":[{"timestamp":1689971340,"record":{"message":"dummy"}}],"start_time":1689971340,"end_time":1689971340}
 [0] dummy.0: [[1689971342.068613646, {}], {"message"=>"dummy"}]
 ```
 
-With that options set the stdout plugin is now emitting traces in `json_lines` format:
+With that option set, the stdout plugin emits traces in `json_lines` format:
 
 ```json
 {"date":1689971340.068745,"type":1,"trace_id":"0","plugin_instance":"dummy.0","records":[{"timestamp":1689971340,"record":{"message":"dummy"}}],"start_time":1689971340,"end_time":1689971340}
 ```
 
-All three options can also be defined using the much more flexible `--trace` option:
+All three options can also be defined using the more flexible `--trace` option:
 
-```bash
-$ fluent-bit -Z -i dummy -o stdout -f 1 --trace="input=dummy.0 output=stdout output.format=json_lines"
+```shell
+fluent-bit -Z -i dummy -o stdout -f 1 --trace="input=dummy.0 output=stdout output.format=json_lines"
 ```
 
-We defined the entire tap pipeline using this configuration: `input=dummy.0 output=stdout output.format=json_lines` which defines the following:
+This example defines the Tap pipeline using this configuration: `input=dummy.0 output=stdout output.format=json_lines` which defines the following:
 
-  * input: dummy.0 (listens to the tag and/or alias `dummy.0`)
-  * output: stdout (outputs to a stdout plugin)
-  * output.format: json_lines (sets the stdout format o `json_lines`)
+- `input`: `dummy.0` listens to the tag or alias `dummy.0`.
+- `output`: `stdout` outputs to a stdout plugin.
+- `output.format`: `json_lines` sets the stdout format to `json_lines`.
 
-Tap support can also be activated and deactivated via the embedded web server:
+Tap support can also be activated and deactivated using the embedded web server:
 
 ```shell
 $ docker run --rm -ti -p 2020:2020 fluent/fluent-bit:latest -Z -H -i dummy -p alias=input_dummy -o stdout -f 1
-Fluent Bit v2.0.0
-* Copyright (C) 2015-2022 The Fluent Bit Authors
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
-
-[2022/10/21 10:03:16] [ info] [fluent bit] version=2.0.0, commit=3000f699f2, pid=1
-[2022/10/21 10:03:16] [ info] [output:stdout:stdout.0] worker #0 started
-[2022/10/21 10:03:16] [ info] [storage] ver=1.3.0, type=memory, sync=normal, checksum=off, max_chunks_up=128
-[2022/10/21 10:03:16] [ info] [cmetrics] version=0.5.2
-[2022/10/21 10:03:16] [ info] [input:dummy:input_dummy] initializing
-[2022/10/21 10:03:16] [ info] [input:dummy:input_dummy] storage_strategy='memory' (memory only)
-[2022/10/21 10:03:16] [ info] [http_server] listen iface=0.0.0.0 tcp_port=2020
-[2022/10/21 10:03:16] [ info] [sp] stream processor started
+
+...
 [0] dummy.0: [1666346597.203307010, {"message"=>"dummy"}]
 [0] dummy.0: [1666346598.204103793, {"message"=>"dummy"}]
-...
-
 ```
 
-In another terminal we can activate Tap by either using the instance id of the input; `dummy.0` or its alias. 
-
-Since the alias is more predictable that is what we will use:
-
+In another terminal, activate Tap by either using the instance id of the input (`dummy.0`) or its alias. The alias is more predictable, and is used here:
 
 ```shell
 $ curl 127.0.0.1:2020/api/v1/trace/input_dummy
+
 {"status":"ok"}
 ```
 
-This response means we have activated Tap, the terminal with Fluent Bit running should now look like this:
+This response means Tap is active. The terminal with Fluent Bit running should now look like this:
 
-```shell
-[0] dummy.0: [1666346615.203253156, {"message"=>"dummy"}]
-[2022/10/21 10:03:36] [ info] [fluent bit] version=2.0.0, commit=3000f699f2, pid=1
-[2022/10/21 10:03:36] [ info] [storage] ver=1.3.0, type=memory, sync=normal, checksum=off, max_chunks_up=128
-[2022/10/21 10:03:36] [ info] [cmetrics] version=0.5.2
-[2022/10/21 10:03:36] [ info] [input:emitter:trace-emitter] initializing
-[2022/10/21 10:03:36] [ info] [input:emitter:trace-emitter] storage_strategy='memory' (memory only)
-[2022/10/21 10:03:36] [ info] [sp] stream processor started
-[2022/10/21 10:03:36] [ info] [output:stdout:stdout.0] worker #0 started
+```text
+...
 [0] dummy.0: [1666346616.203551736, {"message"=>"dummy"}]
 [0] trace: [1666346617.205221952, {"type"=>1, "trace_id"=>"trace.0", "plugin_instance"=>"dummy.0", "plugin_alias"=>"input_dummy", "records"=>[{"timestamp"=>1666346617, "record"=>{"message"=>"dummy"}}], "start_time"=>1666346617, "end_time"=>1666346617}]
 [0] dummy.0: [1666346617.205131790, {"message"=>"dummy"}]
@@ -180,43 +121,44 @@ This response means we have activated Tap, the terminal with Fluent Bit running
 [0] trace: [1666346618.204110867, {"type"=>1, "trace_id"=>"trace.1", "plugin_instance"=>"dummy.0", "plugin_alias"=>"input_dummy", "records"=>[{"timestamp"=>1666346618, "record"=>{[0] dummy.0: [1666346618.204049246, {"message"=>"dummy"}]
 "message"=>"dummy"}}], "start_time"=>1666346618, "end_time"=>1666346618}]
 [0] trace: [1666346618.204198654, {"type"=>3, "trace_id"=>"trace.1", "plugin_instance"=>"dummy.0", "plugin_alias"=>"input_dummy", "records"=>[{"timestamp"=>1666346618, "record"=>{"message"=>"dummy"}}], "start_time"=>1666346618, "end_time"=>1666346618}]
-
 ```
 
-All the records that now appear are those emitted by the activities of the dummy plugin.
+All the records that display are those emitted by the activities of the dummy plugin.
 
-### Complex example
+### Tap example (complex)
 
-This example takes the same steps but demonstrates the same mechanism works with more complicated configurations. 
-In this example we will follow a single input of many which passes through several filters.
+This example takes the same steps but demonstrates how the mechanism works with more complicated configurations.
 
-```
-$ docker run --rm -ti -p 2020:2020 \
-	fluent/fluent-bit:latest \
-	-Z -H \
-		-i dummy -p alias=dummy_0 -p \
-			dummy='{"dummy": "dummy_0", "key_name": "foo", "key_cnt": "1"}' \
-		-i dummy -p alias=dummy_1 -p dummy='{"dummy": "dummy_1"}' \
-		-i dummy -p alias=dummy_2 -p dummy='{"dummy": "dummy_2"}' \
-		-F record_modifier -m 'dummy.0' -p record="powered_by fluent" \
-		-F record_modifier -m 'dummy.1' -p record="powered_by fluent-bit" \
-		-F nest -m 'dummy.0' \
-			-p operation=nest -p wildcard='key_*' -p nest_under=data \
-		-o null -m '*' -f 1
+This example follows a single input, out of many, and which passes through several filters.
+
+```shell
+$ docker run --rm -ti -p 2020:2020 fluent/fluent-bit:latest \
+      -Z -H \
+      -i dummy -p alias=dummy_0 -p \
+         dummy='{"dummy": "dummy_0", "key_name": "foo", "key_cnt": "1"}' \
+      -i dummy -p alias=dummy_1 -p dummy='{"dummy": "dummy_1"}' \
+      -i dummy -p alias=dummy_2 -p dummy='{"dummy": "dummy_2"}' \
+      -F record_modifier -m 'dummy.0' -p record="powered_by fluent" \
+      -F record_modifier -m 'dummy.1' -p record="powered_by fluent-bit" \
+      -F nest -m 'dummy.0' \
+      -p operation=nest -p wildcard='key_*' -p nest_under=data \
+      -o null -m '*' -f 1
 ```
 
-To make sure the window is not cluttered by the actual records generated by the input plugins we send all of it to `null`.
+To ensure the window isn't cluttered by the records generated by the input plugins, send all of it to `null`.
 
-We activate with the following 'curl' command:
+Activate with the following `curl` command:
 
 ```shell
 $ curl 127.0.0.1:2020/api/v1/trace/dummy_0
+
 {"status":"ok"}
 ```
 
-Now we should start seeing output similar to the following:
+You should start seeing output similar to the following:
 
-```shell
+```text
+...
 [0] trace: [1666349359.325597543, {"type"=>1, "trace_id"=>"trace.0", "plugin_instance"=>"dummy.0", "plugin_alias"=>"dummy_0", "records"=>[{"timestamp"=>1666349359, "record"=>{"dummy"=>"dummy_0", "key_name"=>"foo", "key_cnt"=>"1"}}], "start_time"=>1666349359, "end_time"=>1666349359}]
 [0] trace: [1666349359.325723747, {"type"=>2, "start_time"=>1666349359, "end_time"=>1666349359, "trace_id"=>"trace.0", "plugin_instance"=>"record_modifier.0", "records"=>[{"timestamp"=>1666349359, "record"=>{"dummy"=>"dummy_0", "key_name"=>"foo", "key_cnt"=>"1", "powered_by"=>"fluent"}}]}]
 [0] trace: [1666349359.325783954, {"type"=>2, "start_time"=>1666349359, "end_time"=>1666349359, "trace_id"=>"trace.0", "plugin_instance"=>"nest.2", "records"=>[{"timestamp"=>1666349359, "record"=>{"dummy"=>"dummy_0", "powered_by"=>"fluent", "data"=>{"key_name"=>"foo", "key_cnt"=>"1"}}}]}]
@@ -249,136 +191,109 @@ Now we should start seeing output similar to the following:
 [2022/10/21 10:49:25] [ info] [output:null:null.0] thread worker #0 stopping...
 [2022/10/21 10:49:25] [ info] [output:null:null.0] thread worker #0 stopped
 ```
-### Parameters for the output in Tap 
-When activating Tap, any plugin parameter can be given. These can be used to modify, for example, the output format, the name of the time key, the format of the date, etc.
 
-In the next example we will use the parameter ```"format": "json"``` to demonstrate how in Tap, stdout can be shown in Json format.
+### Parameters for the output in Tap
+
+When activating Tap, any plugin parameter can be given. These parameters can be used to modify the output format, the name of the time key, the format of the date, and other details.
+
+The following example uses the parameter `"format": "json"` to demonstrate how to show `stdout` in JSON format.
 
 First, run Fluent Bit enabling Tap:
+
 ```shell
 $ docker run --rm -ti -p 2020:2020 fluent/fluent-bit:latest -Z -H -i dummy -p alias=input_dummy -o stdout -f 1
-Fluent Bit v2.0.8
-* Copyright (C) 2015-2022 The Fluent Bit Authors
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
-
-[2023/01/27 07:44:25] [ info] [fluent bit] version=2.0.8, commit=9444fdc5ee, pid=1
-[2023/01/27 07:44:25] [ info] [storage] ver=1.4.0, type=memory, sync=normal, checksum=off, max_chunks_up=128
-[2023/01/27 07:44:25] [ info] [cmetrics] version=0.5.8
-[2023/01/27 07:44:25] [ info] [ctraces ] version=0.2.7
-[2023/01/27 07:44:25] [ info] [input:dummy:input_dummy] initializing
-[2023/01/27 07:44:25] [ info] [input:dummy:input_dummy] storage_strategy='memory' (memory only)
-[2023/01/27 07:44:25] [ info] [output:stdout:stdout.0] worker #0 started
-[2023/01/27 07:44:25] [ info] [http_server] listen iface=0.0.0.0 tcp_port=2020
-[2023/01/27 07:44:25] [ info] [sp] stream processor started
+
+...
 [0] dummy.0: [1674805465.976012761, {"message"=>"dummy"}]
 [0] dummy.0: [1674805466.973669512, {"message"=>"dummy"}]
-...
 ```
-Next, in another terminal, we activate Tap including the output, in this case stdout, and the parameters wanted, in this case ```"format": "json"```:
+
+In another terminal, activate Tap including the output (`stdout`), and the parameters wanted (`"format": "json"`):
 
 ```shell
 $ curl 127.0.0.1:2020/api/v1/trace/input_dummy -d '{"output":"stdout", "params": {"format": "json"}}'
+
 {"status":"ok"}
 ```
-In the first terminal, we should be seeing the output similar to the following:
-```shell
+
+In the first terminal, you should see the output similar to the following:
+
+```text
+...
 [0] dummy.0: [1674805635.972373840, {"message"=>"dummy"}]
 [{"date":1674805634.974457,"type":1,"trace_id":"0","plugin_instance":"dummy.0","plugin_alias":"input_dummy","records":[{"timestamp":1674805634,"record":{"message":"dummy"}}],"start_time":1674805634,"end_time":1674805634},{"date":1674805634.974605,"type":3,"trace_id":"0","plugin_instance":"dummy.0","plugin_alias":"input_dummy","records":[{"timestamp":1674805634,"record":{"message":"dummy"}}],"start_time":1674805634,"end_time":1674805634},{"date":1674805635.972398,"type":1,"trace_id":"1","plugin_instance":"dummy.0","plugin_alias":"input_dummy","records":[{"timestamp":1674805635,"record":{"message":"dummy"}}],"start_time":1674805635,"end_time":1674805635},{"date":1674805635.972413,"type":3,"trace_id":"1","plugin_instance":"dummy.0","plugin_alias":"input_dummy","records":[{"timestamp":1674805635,"record":{"message":"dummy"}}],"start_time":1674805635,"end_time":1674805635}]
 [0] dummy.0: [1674805636.973970215, {"message"=>"dummy"}]
 [{"date":1674805636.974008,"type":1,"trace_id":"2","plugin_instance":"dummy.0","plugin_alias":"input_dummy","records":[{"timestamp":1674805636,"record":{"message":"dummy"}}],"start_time":1674805636,"end_time":1674805636},{"date":1674805636.974034,"type":3,"trace_id":"2","plugin_instance":"dummy.0","plugin_alias":"input_dummy","records":[{"timestamp":1674805636,"record":{"message":"dummy"}}],"start_time":1674805636,"end_time":1674805636}]
 ```
-This parameter shows stdout in Json format, however, as mentioned before, parameters can be passed to any plugin. 
 
-Please visit the following link for more information on other output plugins:
-https://docs.fluentbit.io/manual/pipeline/outputs
+This parameter shows stdout in JSON format.
 
-### Analysis of a single Tap record
+See [output plugins](https://docs.fluentbit.io/manual/pipeline/outputs) for additional information.
 
-Here we analyze a single record from a filter event to explain the meaning of each field in detail. 
-We chose a filter record since it includes the most details of all the record types.
+### Analyze a single Tap record
+
+This filter record is an example to explain the details of a Tap record:
 
 ```json
 {
-	"type": 2,
-	"start_time": 1666349231,
-	"end_time": 1666349231,
-	"trace_id": "trace.1",
-	"plugin_instance": "nest.2", 
-	"records": [{
-		"timestamp": 1666349231,
-		"record": {
-			"dummy": "dummy_0",
-			"powered_by": "fluent",
-			"data": {
-				"key_name": "foo", 
-				"key_cnt": "1"
-			}
-		}
-	}]
+  "type": 2,
+  "start_time": 1666349231,
+  "end_time": 1666349231,
+  "trace_id": "trace.1",
+  "plugin_instance": "nest.2",
+  "records": [{
+    "timestamp": 1666349231,
+    "record": {
+      "dummy": "dummy_0",
+      "powered_by": "fluent",
+      "data": {
+        "key_name": "foo",
+        "key_cnt": "1"
+      }
+    }
+  }]
 }
 ```
 
-### type
-
-The type defines at what stage the event is generated:
-
-- type=1: input record
-  - this is the unadulterated input record
-- type=2: filtered record
-  - this is a record once it has been filtered. One record is generated per filter.
-- type=3: pre-output record
-  - this is the record right before it is sent for output.
+- `type`: Defines the stage the event is generated:
+  - `1`: Input record. This is the unadulterated input record.
+  - `2`: Filtered record. This is a record after it was filtered. One record is generated per filter.
+  - `3`: Pre-output record. This is the record right before it's sent for output.
 
-Since this is a record generated by the manipulation of a record by a filter is has the type `2`.
+  This example is a record generated by the manipulation of a record by a filter so it has the type `2`.
+- `start_time` and `end_time`: Records the start and end of an event, and is different for each event type:
+  - type 1: When the input is received, both the start and end time.
+  - type 2: The time when filtering is matched until it has finished processing.
+  - type 3: The time when the input is received and when it's finally slated for output.
+- `trace_id`: A string composed of a prefix and a number which is incremented with each record received by the input during the Tap session.
+- `plugin_instance`: The plugin instance name as generated by Fluent Bit at runtime.
+- `plugin_alias`: If an alias is set this field will contain the alias set for a plugin.
+- `records`: An array of all the records being sent. Fluent Bit handles records in chunks of multiple records and chunks are indivisible, the same is done in the Tap output. Each record consists of its timestamp followed by the actual data which is a composite type of keys and values.
 
-### start_time and end_time
+## Dump Internals and signal
 
-This records the start and end of an event, it is a bit different for each event type:
+When the service is running, you can export [metrics](monitoring.md) to see the overall status of the data flow of the service. There are other use cases where you might need to know the current status of the service internals, like the current status of the internal buffers. Dump Internals can help provide this information.
 
-- type 1: when the input is received, both the start and end time.
-- type 2: the time when filtering is matched until it has finished processing.
-- type 3: the time when the input is received and when it is finally slated for output.
-
-### trace_id
-
-This is a string composed of a prefix and a number which is incremented with each record received by the input during the Tap session.
-
-### plugin_instance
-
-This is the plugin instance name as it is generated by Fluent Bit at runtime.
-
-### plugin_alias
-
-If an alias is set this field will contain the alias set for a plugin.
-
-### records
-
-This is an array of all the records being sent. Since Fluent Bit handles records in chunks of multiple records and chunks are indivisible the same is done in the Tap output. Each record consists of its timestamp followed by the actual data which is a composite type of keys and values.
-
-## Dump Internals / Signal
-
-When the service is running we can export [metrics](monitoring.md) to see the overall status of the data flow of the service. But there are other use cases where we would like to know the current status of the internals of the service, specifically to answer questions like _what's the current status of the internal buffers ?_ , the Dump Internals feature is the answer.
-
-Fluent Bit v1.4 introduces the Dump Internals feature that can be triggered easily from the command line triggering the `CONT` Unix signal.
+Fluent Bit v1.4 introduced the Dump Internals feature, which can be triggered from the command line triggering the `CONT` Unix signal.
 
 {% hint style="info" %}
-note: this feature is only available on Linux and BSD family operating systems
+This feature is only available on Linux and BSD operating systems.
 {% endhint %}
 
 ### Usage
 
 Run the following `kill` command to signal Fluent Bit:
 
-```text
+```shell
 kill -CONT `pidof fluent-bit`
 ```
 
-> The command `pidof` aims to lookup the Process ID of Fluent Bit. You can replace the
+The command `pidof` aims to identify the Process ID of Fluent Bit.
 
-Fluent Bit will dump the following information to the standard output interface \(stdout\):
+Fluent Bit will dump the following information to the standard output interface (`stdout`):
 
 ```text
+...
 [engine] caught signal (SIGCONT)
 [2020/03/23 17:39:02] Fluent Bit Dump
 
@@ -412,9 +327,9 @@ total chunks     : 92
    └─ down       : 57
 ```
 
-### Input Plugins Dump
+### Input plugins
 
-The dump provides insights for every input instance configured.
+The input plugins dump provides insights for every input instance configured.
 
 ### Status
 
@@ -422,46 +337,46 @@ Overall ingestion status of the plugin.
 
 | Entry | Sub-entry | Description |
 | :--- | :--- | :--- |
-| overlimit |  | If the plugin has been configured with [Mem\_Buf\_Limit](backpressure.md), this entry will report if the plugin is over the limit or not at the moment of the dump. If it is overlimit, it will print `yes`, otherwise `no`. |
-|  | mem\_size | Current memory size in use by the input plugin in-memory. |
-|  | mem\_limit | Limit set by Mem\_Buf\_Limit. |
+| `overlimit` |  | If the plugin has been configured with [`Mem_Buf_Limit`](backpressure.md), this entry will report if the plugin is over the limit or not at the moment of the dump. Over the limit prints `yes`, otherwise `no`. |
+|  | `mem_size` | Current memory size in use by the input plugin in-memory. |
+|  | `mem_limit` | Limit set by `Mem_Buf_Limit`. |
 
 ### Tasks
 
-When an input plugin ingest data into the engine, a Chunk is created. A Chunk can contains multiple records. Upon flush time, the engine creates a Task that contains the routes for the Chunk associated in question.
+When an input plugin ingests data into the engine, a Chunk is created. A Chunk can contain multiple records. At flush time, the engine creates a Task that contains the routes for the Chunk associated in question.
 
 The Task dump describes the tasks associated to the input plugin:
 
 | Entry | Description |
 | :--- | :--- |
-| total\_tasks | Total number of active tasks associated to data generated by the input plugin. |
-| new | Number of tasks not assigned yet to an output plugin. Tasks are in `new` status for a very short period of time \(most of the time this value is very low or zero\). |
-| running | Number of active tasks being processed by output plugins. |
-| size | Amount of memory used by the Chunks being processed \(Total chunks size\). |
+| `total_tasks` | Total number of active tasks associated to data generated by the input plugin. |
+| `new` | Number of tasks not yet assigned to an output plugin. Tasks are in `new` status for a very short period of time. This value is normally very low or zero. |
+| `running` | Number of active tasks being processed by output plugins. |
+| `size` | Amount of memory used by the Chunks being processed (total chunk size). |
 
 ### Chunks
 
 The Chunks dump tells more details about all the chunks that the input plugin has generated and are still being processed.
 
-Depending of the buffering strategy and limits imposed by configuration, some Chunks might be `up` \(in memory\) or `down` \(filesystem\).
+Depending on the buffering strategy and limits imposed by configuration, some Chunks might be `up` (in memory) or `down` (filesystem).
 
 | Entry | Sub-entry | Description |
 | :--- | :--- | :--- |
-| total\_chunks |  | Total number of Chunks generated by the input plugin that are still being processed by the engine. |
-| up\_chunks |  | Total number of Chunks that are loaded in memory. |
-| down\_chunks |  | Total number of Chunks that are stored in the filesystem but not loaded in memory yet. |
-| busy\_chunks |  | Chunks marked as busy \(being flushed\) or locked. Busy Chunks are immutable and likely are ready to \(or being\) processed. |
-|  | size | Amount of bytes used by the Chunk. |
-|  | size err | Number of Chunks in an error state where it size could not be retrieved. |
+| `total_chunks` |  | Total number of Chunks generated by the input plugin that are still being processed by the engine. |
+| `up_chunks` |  | Total number of Chunks loaded in memory. |
+| `down_chunks` |  | Total number of Chunks stored in the filesystem but not loaded in memory yet. |
+| `busy_chunks` |  | Chunks marked as busy (being flushed) or locked. Busy Chunks are immutable and likely are ready to be or are being processed. |
+|  | `size` | Amount of bytes used by the Chunk. |
+|  | `size err` | Number of Chunks in an error state where its size couldn't be retrieved. |
 
-### Storage Layer Dump
+### Storage layer
 
 Fluent Bit relies on a custom storage layer interface designed for hybrid buffering. The `Storage Layer` entry contains a total summary of Chunks registered by Fluent Bit:
 
 | Entry | Sub-Entry | Description |
 | :--- | :--- | :--- |
-| total chunks |  | Total number of Chunks |
-| mem chunks |  | Total number of Chunks memory-based |
-| fs chunks |  | Total number of Chunks filesystem based |
-|  | up | Total number of filesystem chunks up in memory |
-|  | down | Total number of filesystem chunks down \(not loaded in memory\) |
+| `total chunks` |  | Total number of Chunks. |
+| `mem chunks` |  | Total number of Chunks memory-based. |
+| `fs chunks` |  | Total number of Chunks filesystem based. |
+|  | `up` | Total number of filesystem chunks up in memory. |
+|  | `down` | Total number of filesystem chunks down (not loaded in memory). |
diff --git a/concepts/buffering.md b/concepts/buffering.md
index b7f82affd..5b55c3008 100644
--- a/concepts/buffering.md
+++ b/concepts/buffering.md
@@ -1,22 +1,17 @@
 ---
-description: Performance and Data Safety
+description: Performance and data safety
 ---
 
 # Buffering
 
-When [Fluent Bit](https://fluentbit.io) processes data, it uses the system memory \(heap\) as a primary and temporary place to store the record logs before they get delivered, in this private memory area the records are processed.
+When [Fluent Bit](https://fluentbit.io) processes data, it uses the system memory (heap) as a primary and temporary place to store the record logs before they get delivered. The records are processed in this private memory area.
 
-Buffering refers to the ability to store the records somewhere, and while they are processed and delivered, still be able to store more. Buffering in memory is the fastest mechanism, but there are certain scenarios where it requires special strategies to deal with [backpressure](../administration/backpressure.md), data safety or reduce memory consumption by the service in constrained environments.
+Buffering is the ability to store the records, and continue storing incoming data while previous data is processed and delivered. Buffering in memory is the fastest mechanism, but there are scenarios requiring special strategies to deal with [backpressure](../administration/backpressure.md), data safety, or to reduce memory consumption by the service in constrained environments.
 
-{% hint style="info" %}
-Network failures or latency on third party service is pretty common, and on scenarios where we cannot deliver data fast enough as we receive new data to process, we likely will face backpressure.
+Network failures or latency in third party service is common. When data can't be delivered fast enough and new data to process arrives, the system can face backpressure.
 
-Our buffering strategies are designed to solve problems associated with backpressure and general delivery failures.
-{% endhint %}
+Fluent Bit buffering strategies are designed to solve problems associated with backpressure and general delivery failures. Fluent Bit offers a primary buffering mechanism in memory and an optional secondary one using the file system. With this hybrid solution you can accommodate any use case safely and keep a high performance while processing your data.
 
-Fluent Bit as buffering strategies go, offers a primary buffering mechanism in **memory** and an optional secondary one using the **file system**. With this hybrid solution you can accommodate any use case safely and keep a high performance while processing your data.
-
-Both mechanisms are not mutually exclusive and when the data is ready to be processed or delivered it will always be **in memory**, while other data in the queue might be in the file system until is ready to be processed and moved up to memory.
-
-To learn more about the buffering configuration in Fluent Bit, please jump to the [Buffering & Storage](../administration/buffering-and-storage.md) section.
+These mechanisms aren't mutually exclusive. When data is ready to be processed or delivered it's always be in memory. Other data in the queue might be in the file system until is ready to be processed and moved up to memory.
 
+To learn more about the buffering configuration in Fluent Bit, see [Buffering and Storage](../administration/buffering-and-storage.md).
diff --git a/concepts/data-pipeline/README.md b/concepts/data-pipeline/README.md
index 7ae9cdc9a..7ea3ea315 100644
--- a/concepts/data-pipeline/README.md
+++ b/concepts/data-pipeline/README.md
@@ -1,2 +1 @@
-# Data Pipeline
-
+# Data pipeline
diff --git a/concepts/data-pipeline/buffer.md b/concepts/data-pipeline/buffer.md
index 98dd0daf9..e347985b6 100644
--- a/concepts/data-pipeline/buffer.md
+++ b/concepts/data-pipeline/buffer.md
@@ -4,14 +4,14 @@ description: Data processing with reliability
 
 # Buffer
 
-Previously defined in the [Buffering](../buffering.md) concept section, the `buffer` phase in the pipeline aims to provide a unified and persistent mechanism to store your data, either using the primary in-memory model or using the filesystem based mode.
+The [`buffer`](../buffering.md) phase in the pipeline aims to provide a unified and persistent mechanism to store your data, using the primary in-memory model or the file system-based mode.
 
-The `buffer` phase already contains the data in an immutable state, meaning, no other filter can be applied.
+The `buffer` phase contains the data in an immutable state, meaning that no other filter can be applied.
 
 ```mermaid
 graph LR
     accTitle: Fluent Bit data pipeline
-    accDescr: The Fluent Bit data pipeline includes input, a parser, a filter, a buffer, routing, and various outputs.
+    accDescr: A diagram of the Fluent Bit data pipeline, which includes input, a parser, a filter, a buffer, routing, and various outputs.
     A[Input] --> B[Parser]
     B --> C[Filter]
     C --> D[Buffer]
@@ -22,8 +22,6 @@ graph LR
     style D stroke:darkred,stroke-width:2px;
 ```
 
-{% hint style="info" %}
-Note that buffered data is not raw text, it's in Fluent Bit's internal binary representation.
-{% endhint %}
+Buffered data uses the Fluent Bit internal binary representation, which isn't raw text.
 
-Fluent Bit offers a buffering mechanism in the file system that acts as a _backup system_ to avoid data loss in case of system failures.
+Fluent Bit offers a buffering mechanism in the file system that acts as a backup system to avoid data loss in case of system failures.
diff --git a/concepts/data-pipeline/filter.md b/concepts/data-pipeline/filter.md
index 07400bfb3..b31d8e2a5 100644
--- a/concepts/data-pipeline/filter.md
+++ b/concepts/data-pipeline/filter.md
@@ -1,15 +1,15 @@
 ---
-description: Modify, Enrich or Drop your records
+description: Modify, enrich or drop your records
 ---
 
 # Filter
 
-In production environments we want to have full control of the data we are collecting, filtering is an important feature that allows us to **alter** the data before delivering it to some destination.
+In production environments you need full control of the data you're collecting. Filtering lets you alter the collected data before delivering it to a destination.
 
 ```mermaid
 graph LR
     accTitle: Fluent Bit data pipeline
-    accDescr: The Fluent Bit data pipeline includes input, a parser, a filter, a buffer, routing, and various outputs.
+    accDescr: A diagram of the Fluent Bit data pipeline, which includes input, a parser, a filter, a buffer, routing, and various outputs.
     A[Input] --> B[Parser]
     B --> C[Filter]
     C --> D[Buffer]
@@ -20,10 +20,10 @@ graph LR
     style C stroke:darkred,stroke-width:2px;
 ```
 
-Filtering is implemented through plugins, so each filter available could be used to match, exclude or enrich your logs with some specific metadata.
+Filtering is implemented through plugins. Each available filter can be used to match, exclude, or enrich your logs with specific metadata.
 
-We support many filters, A common use case for filtering is Kubernetes deployments. Every Pod log needs to get the proper metadata associated
+Fluent Bit support many filters. A common use case for filtering is Kubernetes deployments. Every pod log needs the proper metadata associated with it.
 
-Very similar to the input plugins, Filters run in an instance context, which has its own independent configuration. Configuration keys are often called **properties**.
+Like input plugins, filters run in an instance context, which has its own independent configuration. Configuration keys are often called _properties_.
 
-For more details about the Filters available and their usage, please refer to the [Filters](https://docs.fluentbit.io/manual/pipeline/filters) section.
+For more details about the Filters available and their usage, see [Filters](https://docs.fluentbit.io/manual/pipeline/filters).
diff --git a/concepts/data-pipeline/input.md b/concepts/data-pipeline/input.md
index efde04cda..86edfaaad 100644
--- a/concepts/data-pipeline/input.md
+++ b/concepts/data-pipeline/input.md
@@ -4,12 +4,12 @@ description: The way to gather data from your sources
 
 # Input
 
-[Fluent Bit](http://fluentbit.io) provides different _Input Plugins_ to gather information from different sources, some of them just collect data from log files while others can gather metrics information from the operating system. There are many plugins for different needs.
+[Fluent Bit](http://fluentbit.io) provides input plugins to gather information from different sources. Some plugins collect data from log files, while others can gather metrics information from the operating system. There are many plugins to suit different needs.
 
 ```mermaid
 graph LR
     accTitle: Fluent Bit data pipeline
-    accDescr: The Fluent Bit data pipeline includes input, a parser, a filter, a buffer, routing, and various outputs.
+    accDescr: A diagram of the Fluent Bit data pipeline, which includes input, a parser, a filter, a buffer, routing, and various outputs.
     A[Input] --> B[Parser]
     B --> C[Filter]
     C --> D[Buffer]
@@ -20,8 +20,8 @@ graph LR
     style A stroke:darkred,stroke-width:2px;
 ```
 
-When an input plugin is loaded, an internal _instance_ is created. Every instance has its own and independent configuration. Configuration keys are often called **properties**.
+When an input plugin loads, an internal _instance_ is created. Each instance has its own independent configuration. Configuration keys are often called _properties_.
 
-Every input plugin has its own documentation section where it's specified how it can be used and what properties are available.
+Every input plugin has its own documentation section that specifies how to use it and what properties are available.
 
-For more details, please refer to the [Input Plugins](https://docs.fluentbit.io/manual/pipeline/inputs) section.
+For more details, see [Input Plugins](https://docs.fluentbit.io/manual/pipeline/inputs).
diff --git a/concepts/data-pipeline/output.md b/concepts/data-pipeline/output.md
index ac064f2c5..68a8092ba 100644
--- a/concepts/data-pipeline/output.md
+++ b/concepts/data-pipeline/output.md
@@ -1,15 +1,15 @@
 ---
-description: 'Destinations for your data: databases, cloud services and more!'
+description: Learn about destinations for your data, such as databases and cloud services.
 ---
 
 # Output
 
-The output interface allows us to define destinations for the data. Common destinations are remote services, local file system or standard interface with others. Outputs are implemented as plugins and there are many available.
+The output interface lets you define destinations for your data. Common destinations are remote services, local file systems, or other standard interfaces. Outputs are implemented as plugins.
 
 ```mermaid
 graph LR
     accTitle: Fluent Bit data pipeline
-    accDescr: The Fluent Bit data pipeline includes input, a parser, a filter, a buffer, routing, and various outputs.
+    accDescr: A diagram of the Fluent Bit data pipeline, which includes input, a parser, a filter, a buffer, routing, and various outputs.
     A[Input] --> B[Parser]
     B --> C[Filter]
     C --> D[Buffer]
@@ -22,8 +22,8 @@ graph LR
     style H stroke:darkred,stroke-width:2px;
 ```
 
-When an output plugin is loaded, an internal _instance_ is created. Every instance has its own independent configuration. Configuration keys are often called **properties**.
+When an output plugin is loaded, an internal _instance_ is created. Every instance has its own independent configuration. Configuration keys are often called _properties_.
 
 Every output plugin has its own documentation section specifying how it can be used and what properties are available.
 
-For more details, please refer to the [Output Plugins](https://docs.fluentbit.io/manual/pipeline/outputs) section.
+For more details, see [Output Plugins](https://docs.fluentbit.io/manual/pipeline/outputs).
diff --git a/concepts/data-pipeline/parser.md b/concepts/data-pipeline/parser.md
index 930b2dd41..5792b6e9b 100644
--- a/concepts/data-pipeline/parser.md
+++ b/concepts/data-pipeline/parser.md
@@ -1,15 +1,15 @@
 ---
-description: Convert Unstructured to Structured messages
+description: Convert unstructured messages to structured messages
 ---
 
 # Parser
 
-Dealing with raw strings or unstructured messages is a constant pain; having a structure is highly desired. Ideally we want to set a structure to the incoming data by the Input Plugins as soon as they are collected:
+Dealing with raw strings or unstructured messages is difficult. Having a structure makes data more usable. Set a structure to the incoming data by using input plugins as data is collected:
 
 ```mermaid
 graph LR
     accTitle: Fluent Bit data pipeline
-    accDescr: The Fluent Bit data pipeline includes input, a parser, a filter, a buffer, routing, and various outputs.
+    accDescr: A diagram of the Fluent Bit data pipeline, which includes input, a parser, a filter, a buffer, routing, and various outputs.
     A[Input] --> B[Parser]
     B --> C[Filter]
     C --> D[Buffer]
@@ -19,13 +19,14 @@ graph LR
     E --> H[Output 3]
     style B stroke:darkred,stroke-width:2px;
 ```
-The Parser allows you to convert from unstructured to structured data. As a demonstrative example consider the following Apache (HTTP Server) log entry:
 
-```
+The parser converts unstructured data to structured data. As an example, consider the following Apache (HTTP Server) log entry:
+
+```text
 192.168.2.20 - - [28/Jul/2006:10:27:10 -0300] "GET /cgi-bin/try/ HTTP/1.0" 200 3395
 ```
 
-The above log line is a raw string without format, ideally we would like to give it a structure that can be processed later easily. If the proper configuration is used, the log entry could be converted to:
+This log line is a raw string without format. Structuring the log makes it easier to process the data later. If the [regular expression parser](../../pipeline/parsers/regular-expression.md) is used, the log entry could be converted to:
 
 ```javascript
 {
@@ -40,4 +41,4 @@ The above log line is a raw string without format, ideally we would like to give
  }
 ```
 
-Parsers are fully configurable and are independently and optionally handled by each input plugin, for more details please refer to the [Parsers](https://docs.fluentbit.io/manual/pipeline/parsers) section.
+Parsers are fully configurable and are independently and optionally handled by each input plugin. For more details, see [Parsers](https://docs.fluentbit.io/manual/pipeline/parsers).
diff --git a/concepts/data-pipeline/router.md b/concepts/data-pipeline/router.md
index 442b9b844..e4e2a1fe5 100644
--- a/concepts/data-pipeline/router.md
+++ b/concepts/data-pipeline/router.md
@@ -4,12 +4,12 @@ description: Create flexible routing rules
 
 # Router
 
-Routing is a core feature that allows to **route** your data through Filters and finally to one or multiple destinations. The router relies on the concept of [Tags](../key-concepts.md) and [Matching](../key-concepts.md) rules
+Routing is a core feature that lets you route your data through filters and then to one or multiple destinations. The router relies on the concept of [Tags](../key-concepts.md) and [Matching](../key-concepts.md) rules.
 
 ```mermaid
 graph LR
     accTitle: Fluent Bit data pipeline
-    accDescr: The Fluent Bit data pipeline includes input, a parser, a filter, a buffer, routing, and various outputs.
+    accDescr: A diagram of the Fluent Bit data pipeline, which includes input, a parser, a filter, a buffer, routing, and various outputs.
     A[Input] --> B[Parser]
     B --> C[Filter]
     C --> D[Buffer]
@@ -22,75 +22,143 @@ graph LR
 
 There are two important concepts in Routing:
 
-* Tag
-* Match
+- Tag
+- Match
 
-When the data is generated by the input plugins, it comes with a **Tag** (most of the time the Tag is configured manually), the Tag is a human-readable indicator that helps to identify the data source.
+When data is generated by an input plugin, it comes with a `Tag`. A Tag is a human-readable indicator that helps to identify the data source. Tags are usually configured manually.
 
-In order to define **where** the data should be routed, a **Match** rule must be specified in the output configuration.
+To define where to route data, specify a `Match` rule in the output configuration.
 
-Consider the following configuration example that aims to deliver CPU metrics to an Elasticsearch database and Memory metrics to the standard output interface:
+Consider the following configuration example that delivers `CPU` metrics to an Elasticsearch database and Memory (`mem`) metrics to the standard output interface:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: my_cpu
+
+    - name: mem
+      tag: my_mem
+
+  outputs:
+    - name: es
+      match: my_cpu
+
+    - name: stdout
+      match: my_mem
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name cpu
-    Tag  my_cpu
+  Name cpu
+  Tag  my_cpu
 
 [INPUT]
-    Name mem
-    Tag  my_mem
+  Name mem
+  Tag  my_mem
 
 [OUTPUT]
-    Name   es
-    Match  my_cpu
+  Name   es
+  Match  my_cpu
 
 [OUTPUT]
-    Name   stdout
-    Match  my_mem
+  Name   stdout
+  Match  my_mem
 ```
 
-> Note: the above is a simple example demonstrating how Routing is configured.
+{% endtab %}
+{% endtabs %}
+
+Routing reads the `Input` `Tag` and the `Output` `Match` rules. If data has a `Tag` that doesn't match at routing time, the data is deleted.
+
+## Routing with wildcards
+
+Routing is flexible enough to support wildcards in the `Match` pattern. The following example defines a common destination for both sources of data:
 
-Routing works automatically reading the Input Tags and the Output Match rules. If some data has a Tag that doesn't match upon routing time, the data is deleted.
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-## Routing with Wildcard
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: my_cpu
 
-Routing is flexible enough to support _wildcard_ in the **Match** pattern. The below example defines a common destination for both sources of data:
+    - name: mem
+      tag: my_mem
 
+  outputs:
+    - name: stdout
+      match: 'my_*'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name cpu
-    Tag  my_cpu
+  Name cpu
+  Tag  my_cpu
 
 [INPUT]
-    Name mem
-    Tag  my_mem
+  Name mem
+  Tag  my_mem
 
 [OUTPUT]
-    Name   stdout
-    Match  my_*
+  Name   stdout
+  Match  my_*
 ```
 
-The match rule is set to **my\_\*** which means it will match any Tag that starts with **my\_**.
+{% endtab %}
+{% endtabs %}
+
+The match rule is set to `my_*`, which matches any Tag starting with `my_`.
+
+## Routing with regular expressions
+
+Routing also provides support for regular expressions with the `Match_Regex` pattern, allowing for more complex and precise matching criteria. The following example demonstrates how to route data from sources based on a regular expression:
 
-## Routing with Regex
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-Routing also provides support for _regex_ with the **Match_Regex** pattern, allowing for more complex and precise matching criteria.
-The following example demonstrates how to route data from sources based on a regular expression:
+```yaml
+pipeline:
+  inputs:
+    - name: temperature_sensor
+      tag: temp_sensor_A
 
+    - name: humidity_sensor
+      tag: humid_sensor_B
+
+  outputs:
+    - name: stdout
+      match: '.*_sensor_[AB]'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name temperature_sensor
-    Tag  temp_sensor_A
+  Name temperature_sensor
+  Tag  temp_sensor_A
 
 [INPUT]
-    Name humidity_sensor
-    Tag  humid_sensor_B
+  Name humidity_sensor
+  Tag  humid_sensor_B
 
 [OUTPUT]
-    Name         stdout
-    Match_regex  .*_sensor_[AB]
+  Name         stdout
+  Match_regex  .*_sensor_[AB]
 ```
 
-In this configuration, the **Match_regex** rule is set to `.*_sensor_[AB]`. This regular expression will match any Tag that ends with "_sensor_A" or "_sensor_B", regardless of what precedes it.
-This approach provides a more flexible and powerful way to handle different source tags with a single routing rule.
+{% endtab %}
+{% endtabs %}
+
+In this configuration, the `Match_regex` rule is set to `.*_sensor_[AB]`. This regular expression matches any `Tag` that ends with `_sensor_A` or `_sensor_B`, regardless of what precedes it. This approach provides a more flexible and powerful way to handle different source tags with a single routing rule.
\ No newline at end of file
diff --git a/concepts/key-concepts.md b/concepts/key-concepts.md
index c3b70801a..a99c973c5 100644
--- a/concepts/key-concepts.md
+++ b/concepts/key-concepts.md
@@ -1,25 +1,23 @@
 ---
-description: >-
-  There are a few key concepts that are really important to understand how
-  Fluent Bit operates.
+description: Learn these key concepts to understand how Fluent Bit operates.
 ---
 
-# Key Concepts
+# Key concepts
 
-Before diving into [Fluent Bit](https://fluentbit.io) it’s good to get acquainted with some of the key concepts of the service. This document provides a gentle introduction to those concepts and common [Fluent Bit](https://fluentbit.io) terminology. We’ve provided a list below of all the terms we’ll cover, but we recommend reading this document from start to finish to gain a more general understanding of our log and stream processor.
+Before diving into [Fluent Bit](https://fluentbit.io) you might want to get acquainted with some of the key concepts of the service. This document provides an introduction to those concepts and common [Fluent Bit](https://fluentbit.io) terminology. Reading this document will help you gain a more general understanding of the following topics:
 
-* Event or Record
-* Filtering
-* Tag
-* Timestamp
-* Match
-* Structured Message
+- Event or Record
+- Filtering
+- Tag
+- Timestamp
+- Match
+- Structured Message
 
-## Event or Record
+## Events or records
 
-Every incoming piece of data that belongs to a log or a metric that is retrieved by Fluent Bit is considered an Event or a Record.
+Every incoming piece of data that belongs to a log or a metric that's retrieved by Fluent Bit is considered an _Event_ or a _Record_.
 
-As an example consider the following content of a Syslog file:
+As an example, consider the following content of a Syslog file:
 
 ```text
 Jan 18 12:52:16 flb systemd[2222]: Starting GNOME Terminal Server
@@ -28,108 +26,95 @@ Jan 18 12:52:16 flb systemd[2222]: Started GNOME Terminal Server.
 Jan 18 12:52:16 flb gsd-media-keys[2640]: # watch_fast: "/org/gnome/terminal/legacy/" (establishing: 0, active: 0)
 ```
 
-It contains four lines and all of them represents **four** independent Events.
+It contains four lines that represent four independent Events.
 
-Internally an Event is comprised of:
+An Event is comprised of:
 
-* timestamp
-* key/value metadata (since v2.1.0)
-* payload
+- timestamp
+- key/value metadata (v2.1.0 and greater)
+- payload
 
 ### Event format
 
-The Fluent Bit wire protocol represents an Event as a 2-element array
-with a nested array as the first element:
+The Fluent Bit wire protocol represents an Event as a two-element array with a nested array as the first element:
 
-```javascript
+```javascript copy
 [[TIMESTAMP, METADATA], MESSAGE]
 ```
 
 where
 
-* TIMESTAMP is a timestamp in seconds as an integer or floating point value (not a string);
-* METADATA is a possibly-empty object containing event metadata; and
-* MESSAGE is an object containing the event body.
+- _`TIMESTAMP`_ is a timestamp in seconds as an integer or floating point value (not a string).
+- _`METADATA`_ is an object containing event metadata, and might be empty.
+- _`MESSAGE`_ is an object containing the event body.
 
-Fluent Bit versions prior to v2.1.0 instead used:
+Fluent Bit versions prior to v2.1.0 used:
 
 ```javascript
 [TIMESTAMP, MESSAGE]
 ```
 
-to represent events. This format is still supported for reading input event
-streams.
+to represent events. This format is still supported for reading input event streams.
 
 ## Filtering
 
-In some cases it is required to perform modifications on the Events content, the process to alter, enrich or drop Events is called Filtering.
+You might need to perform modifications on an Event's content. The process to alter, append to, or drop Events is called [_filtering_](data-pipeline/filter.md).
 
-There are many use cases when Filtering is required like:
+Use filtering to:
 
-* Append specific information to the Event like an IP address or metadata.
-* Select a specific piece of the Event content.
-* Drop Events that matches certain pattern.
+- Append specific information to the Event like an IP address or metadata.
+- Select a specific piece of the Event content.
+- Drop Events that match a certain pattern.
 
 ## Tag
 
-Every Event that gets into Fluent Bit gets assigned a Tag. This tag is an internal string that is used in a later stage by the Router to decide which Filter or Output phase it must go through.
+Every Event ingested by Fluent Bit is assigned a Tag. This tag is an internal string used in a later stage by the Router to decide which Filter or [Output](data-pipeline/output.md) phase it must go through.
 
-Most of the tags are assigned manually in the configuration. If a tag is not specified, Fluent Bit will assign the name of the Input plugin instance from where that Event was generated from.
+Most tags are assigned manually in the configuration. If a tag isn't specified, Fluent Bit assigns the name of the [Input](data-pipeline/input.md) plugin instance where that Event was generated from.
 
 {% hint style="info" %}
-The only input plugin that **does NOT** assign tags is [Forward](../pipeline/inputs/forward.md) input. This plugin speaks the Fluentd wire protocol called Forward where every Event already comes with a Tag associated. Fluent Bit will always use the incoming Tag set by the client.
+The [Forward](../pipeline/inputs/forward.md) input plugin doesn't assign tags. This plugin speaks the Fluentd wire protocol called Forward where every Event already comes with a Tag associated. Fluent Bit will always use the incoming Tag set by the client.
 {% endhint %}
 
-A Tagged record must always have a Matching rule. To learn more about Tags and Matches check the [Routing](data-pipeline/router.md) section.
+A tagged record must always have a Matching rule. To learn more about Tags and Matches, see [Routing](data-pipeline/router.md).
 
 ## Timestamp
 
-The Timestamp represents the _time_ when an Event was created. Every Event contains a Timestamp associated. The Timestamp is a numeric fractional integer in the format:
+The timestamp represents the time an Event was created. Every Event contains an associated timestamps. All events have timestamps, and they're set by the input plugin or discovered through a data parsing process.
+
+The timestamp is a numeric fractional integer in the format:
 
 ```javascript
 SECONDS.NANOSECONDS
 ```
 
-### Seconds
-
-It is the number of seconds that have elapsed since the _Unix epoch._
-
-### Nanoseconds
+where:
 
-Fractional second or one thousand-millionth of a second.
-
-{% hint style="info" %}
-A timestamp always exists, either set by the Input plugin or discovered through a data parsing process.
-{% endhint %}
+- `_SECONDS_` is the number of seconds that have elapsed since the Unix epoch.
+- `_NANOSECONDS_` is a fractional second or one thousand-millionth of a second.
 
 ## Match
 
-Fluent Bit allows to deliver your collected and processed Events to one or multiple destinations, this is done through a routing phase. A Match represent a simple rule to select Events where it Tags matches a defined rule.
+Fluent Bit lets you route your collected and processed Events to one or multiple destinations. A _Match_ represents a rule to select Events where a Tag matches a defined rule.
 
-To learn more about Tags and Matches check the [Routing](data-pipeline/router.md) section.
+To learn more about Tags and Matches, see [Routing](data-pipeline/router.md).
 
-## Structured Messages
+## Structured messages
 
-Source events can have or not have a structure. A structure defines a set of _keys_ and _values_ inside the Event message. As an example consider the following two messages:
+Source events can have a structure. A structure defines a set of `keys` and `values` inside the Event message to implement faster operations on data modifications. Fluent Bit treats every Event message as a structured message.
 
-### No structured message
+Consider the following two messages:
 
-```javascript
-"Project Fluent Bit created on 1398289291"
-```
-
-### Structured Message
+- No structured message
 
-```javascript
-{"project": "Fluent Bit", "created": 1398289291}
-```
+  ```javascript
+  "Project Fluent Bit created on 1398289291"
+  ```
 
-At a low level both are just an array of bytes, but the Structured message defines _keys_ and _values_, having a structure helps to implement faster operations on data modifications.
+- With a structured message
 
-{% hint style="info" %}
-Fluent Bit **always** handles every Event message as a structured message.
-For performance reasons, we use a binary serialization data format called [MessagePack](https://msgpack.org/).
-
-Consider [MessagePack](https://msgpack.org/) as a binary version of JSON on steroids.
-{% endhint %}
+  ```javascript
+  {"project": "Fluent Bit", "created": 1398289291}
+  ```
 
+For performance reasons, Fluent Bit uses a binary serialization data format called [MessagePack](https://msgpack.org/).
diff --git a/development/developer-guide.md b/development/developer-guide.md
index cf001047f..d8151d370 100644
--- a/development/developer-guide.md
+++ b/development/developer-guide.md
@@ -1,42 +1,43 @@
-# Developer guide for beginners on contributing to Fluent Bit
+# Contribution guide for beginners
 
-Assuming you have some basic knowledge of C, this guide should help you understand how to make code changes to Fluent Bit.
+If you have some knowledge of C, this guide should help you understand how to make code changes to Fluent Bit.
 
 ## Libraries
 
-Most external libraries are embedded in the project in the [/lib](https://github.com/fluent/fluent-bit/tree/master/lib) folder. To keep its footprint low and make cross-platform builds simple, Fluent Bit attempts keep its dependency graph small.
+Most external libraries are embedded in the project in the [/lib](https://github.com/fluent/fluent-bit/tree/master/lib) folder. To keep its footprint low and maximize compatibility in cross-platform builds, Fluent Bit attempts to keep its dependency graph small.
 
-The external library you are mostly likely to interact with is [msgpack](https://github.com/msgpack/msgpack-c).
+The external library that you're mostly likely to interact with is [MessagePack](https://github.com/msgpack/msgpack-c).
 
-For cryptographic support, Fluent Bit uses the system installed version of OpenSSL. 
-Please make sure to install openssl libraries and headers before building Fluent Bit.
+For cryptographic support, Fluent Bit uses the system installed version of OpenSSL. You must install OpenSSL libraries and headers before Building Fluent Bit.
 
-### Memory Management
+### Memory management
 
-When you write Fluent Bit code, you will use Fluent Bit's versions of the standard C functions for working with memory:
+When you write Fluent Bit code, you'll use the Fluent Bit versions of the standard C functions for working with memory:
 
-* [`flb_malloc()`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_mem.h) - equivalent to `malloc`, allocates memory.
-* [`flb_calloc()`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_mem.h)  - equivalent to `calloc`, allocates memory and initializes it to zero.
-* [`flb_realloc()`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_mem.h) - equivalent to `realloc`.
-* [`flb_free()`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_mem.h) - equivalent to `free`, releases allocated memory.
+- [`flb_malloc()`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_mem.h): Equivalent to `malloc`, allocates memory.
+- [`flb_calloc()`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_mem.h): Equivalent to `calloc`, allocates memory and initializes it to zero.
+- [`flb_realloc()`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_mem.h): Equivalent to `realloc`.
+- [`flb_free()`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_mem.h): Equivalent to `free`, releases allocated memory.
 
-Note that many types have a specialized create and destroy function. For example, [`flb_sds_create()` and `flb_sds_destroy()`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_sds.h) \(more about this in the next section\).
+{% hint style="info" %}
+Many types have specialized create and destroy functions, like [`flb_sds_create()` and `flb_sds_destroy()`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_sds.h).
+{% endhint %}
 
 ### Strings
 
-Fluent Bit has a stripped down version of the popular [SDS](https://github.com/antirez/sds) string library. See [flb\_sds.h](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_sds.h) for the API.
+Fluent Bit has a stripped down version of the popular [SDS](https://github.com/antirez/sds) string library. See [`flb_sds.h`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_sds.h) for the API.
 
-In general, you should use SDS strings in any string processing code. SDS strings are fully compatible with any C function that accepts a null-terminated sequence of characters; to understand how they work, see the [explanation on Github](https://github.com/antirez/sds#how-sds-strings-work).
+In general, you should use SDS strings in any string processing code. SDS strings are fully compatible with any C function that accepts a null-terminated sequence of characters. To understand how they work, see the [explanation on Github](https://github.com/antirez/sds#how-sds-strings-work).
 
-### HTTP Client
+### HTTP client
 
 Fluent Bit has its own network connection library. The key types and functions are defined in the following header files:
 
-* [flb\_upstream.h](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_upstream.h)
-* [flb\_http\_client.h](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_http_client.h)
-* [flb\_io.h](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_io.h)
+- [`flb_upstream.h`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_upstream.h)
+- [`flb_http_client.h`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_http_client.h)
+- [`flb_io.h`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_io.h)
 
-The following code demonstrates making an HTTP request in Fluent Bit:
+The following code demonstrates an HTTP request in Fluent Bit:
 
 ```c
 #include <fluent-bit/flb_upstream.h>
@@ -113,13 +114,13 @@ static flb_sds_t make_request(struct flb_config *config)
 }
 ```
 
-An `flb_upstream` structure represents a host/endpoint that you want to call. Normally, you'd store this structure somewhere so that it can be re-used. An `flb_upstream_conn` represents a connection to that host for a single HTTP request. The connection structure should not be used for more than one request.
+The `flb_upstream` structure represents the host/endpoint that you want to call. Normally, you'd store this structure somewhere so that it can be reused. An `flb_upstream_conn` represents a connection to that host for a single HTTP request. This connection structure shouldn't be used for more than one request.
 
-### Linked Lists
+### Linked lists
 
-Fluent Bit contains a library for constructing linked lists- [cfl\_list](https://github.com/fluent/fluent-bit/blob/master/lib/cfl/include/cfl/cfl_list.h). The type stores data as a circular linked list.
+Fluent Bit contains a library for constructing linked lists: [`cfl_list`](https://github.com/fluent/fluent-bit/blob/master/lib/cfl/include/cfl/cfl_list.h). The type stores data as a circular linked list.
 
-The [`cfl_list.h`](https://github.com/fluent/fluent-bit/blob/master/lib/cfl/include/cfl/cfl_list.h) header file contains several macros and functions for use with the lists. The example below shows how to create a list, iterate through it, and delete an element.
+The [`cfl_list.h`](https://github.com/fluent/fluent-bit/blob/master/lib/cfl/include/cfl/cfl_list.h) header file contains several macros and functions for use with the lists. The following example shows how to create a list, iterate through it, and delete an element.
 
 ```c
 #include <cfl/cfl.h>
@@ -174,11 +175,11 @@ static int example()
 }
 ```
 
-### Message Pack
+### MessagePack
 
-Fluent Bit uses [msgpack](https://msgpack.org/index.html) to internally store data. If you write code for Fluent Bit, it is almost certain that you will interact with msgpack.
+Fluent Bit uses [MessagePack](https://msgpack.org/index.html) to internally store data. If you write code for Fluent Bit, it's almost certain that you will interact with MessagePack.
 
-Fluent Bit embeds the [msgpack-c](https://github.com/msgpack/msgpack-c) library. The example below shows manipulating message pack to add a new key-value pair to a record. In Fluent Bit, the [filter\_record\_modifier](https://github.com/fluent/fluent-bit/tree/master/plugins/filter_record_modifier) plugin adds or deletes keys from records. See its code for more.
+Fluent Bit embeds the [`msgpack-c`](https://github.com/msgpack/msgpack-c) library. The following example shows how to manipulate message pack to add a new key/value pair to a record. In Fluent Bit, the [`filter_record_modifier`](https://github.com/fluent/fluent-bit/tree/master/plugins/filter_record_modifier) plugin adds or deletes keys from records. See its code for more.
 
 ```c
 #define A_NEW_KEY        "key"
@@ -262,19 +263,19 @@ static int cb_filter(const void *data, size_t bytes,
     return FLB_FILTER_MODIFIED;
 ```
 
-Please also check out the message pack examples on the [msgpack-c GitHub repo](https://github.com/msgpack/msgpack-c).
+For more info, see the MessagePack examples in the [msgpack-c GitHub repository](https://github.com/msgpack/msgpack-c).
 
 ## Plugin API
 
-Each plugin is a shared object which is [loaded into Fluent Bit](https://github.com/fluent/fluent-bit/blob/1.3/src/flb_plugin.c#L70) using dlopen and dlsym.
+Each plugin is a shared object which is [loaded into Fluent Bit](https://github.com/fluent/fluent-bit/blob/1.3/src/flb_plugin.c#L70) using `dlopen`and `dlsym`.
 
 ### Input
 
-The input plugin structure is defined in [flb\_input.h](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_input.h#L62). There are a number of functions which a plugin can implement, most only implement `cb_init`, `cb_collect`, and `cb_exit`.
+The input plugin structure is defined in [`flb_input.h`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_input.h#L62). There are a number of functions which a plugin can implement, but most only implement `cb_init`, `cb_collect`, and `cb_exit`.
 
-The [`"dummy"` input plugin](https://github.com/fluent/fluent-bit/tree/master/plugins/in_dummy) is very simple and is an excellent example to review to understand more.
+The [`"dummy"` input plugin](https://github.com/fluent/fluent-bit/tree/master/plugins/in_dummy) is very basic and is an excellent example to review to understand more.
 
-Note that input plugins can use threaded mode if the flag `FLB_INPUT_THREADED` is provided.
+Input plugins can use threaded mode if the flag `FLB_INPUT_THREADED` is provided.
 To enable threading in your plugin, add the `FLB_INPUT_THREADED` to the set of `flags` when registering:
 
 ```c
@@ -295,11 +296,11 @@ struct flb_input_plugin in_your_example_plugin = {
 
 ### Filter
 
-The structure for filter plugins is defined in [flb\_filter.h](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_filter.h#L44). Each plugin must implement `cb_init`, `cb_filter`, and `cb_exit`.
+The structure for filter plugins is defined in [`flb_filter.h`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_filter.h#L44). Each plugin must implement `cb_init`, `cb_filter`, and `cb_exit`.
 
-The [filter\_record\_modifier](https://github.com/fluent/fluent-bit/tree/master/plugins/filter_record_modifier) is a good example of a filter plugin.
+The [`filter_record_modifier`](https://github.com/fluent/fluent-bit/tree/master/plugins/filter_record_modifier) is a good example of a filter plugin.
 
-Note that filter plugins can not asynchronously make HTTP requests. If your plugin needs to make a request, add the following code when you initialize your `flb_upstream`:
+Filter plugins can not asynchronously make HTTP requests. If your plugin needs to make a request, add the following code when you initialize your `flb_upstream`:
 
 ```c
 /* Remove async flag from upstream */
@@ -308,18 +309,17 @@ upstream->flags &= ~(FLB_IO_ASYNC);
 
 ### Output
 
-Output plugins are defined in [flb\_output.h](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_output.h#L57). Each plugin must implement `cb_init`, `cb_flush`, and `cb_exit`.
+Output plugins are defined in [`flb_output.h`](https://github.com/fluent/fluent-bit/blob/master/include/fluent-bit/flb_output.h#L57). Each plugin must implement `cb_init`, `cb_flush`, and `cb_exit`.
 
-The [stdout plugin](https://github.com/fluent/fluent-bit/tree/master/plugins/out_stdout) is very simple; review its code to understand how output plugins work.
+The [stdout plugin](https://github.com/fluent/fluent-bit/tree/master/plugins/out_stdout) is very basic; review its code to understand how output plugins work.
 
-## Development Environment
+## Development environment
 
-Fluent Bit provides a standalone environment for development. 
-Developers who use different OS or distributions can develop on a simple, common stack. 
-The development environment provides the required libraries and tools for you.
+Fluent Bit provides a standalone environment for development. Developers who use different operating systems or distributions can develop on a basic, common stack. The development environment provides the required libraries and tools for you.
 
-Development environments provided for
-- [Devcontainer](https://github.com/fluent/fluent-bit/blob/master/DEVELOPER_GUIDE.md#devcontainer)
+Development environments are provided for:
+
+- [Development container](https://github.com/fluent/fluent-bit/blob/master/DEVELOPER_GUIDE.md#devcontainer)
 - [Vagrant](https://github.com/fluent/fluent-bit/blob/master/DEVELOPER_GUIDE.md#vagrant).
 
 ## Testing
@@ -332,9 +332,11 @@ cmake -DFLB_DEV=On ../
 make
 ```
 
-Note that Fluent Bit uses Cmake 3 and on some systems you may need to invoke it as `cmake3`.
+{% hint style="info" %}
+Fluent Bit uses CMake 3. On some systems you might need to invoke it as `cmake3`.
+{% endhint %}
 
-To enable the unit tests run:
+To enable the unit tests, run the following command:
 
 ```text
 cmake -DFLB_DEV=On -DFLB_TESTS_RUNTIME=On -DFLB_TESTS_INTERNAL=On ../
@@ -343,7 +345,7 @@ make
 
 Internal tests are for the internal libraries of Fluent Bit. Runtime tests are for the plugins.
 
-You can run the unit tests with `make test`, however, this is inconvenient in practice. Each test file will create an executable in the `build/bin` directory which you can run directly. For example, if you want to run the SDS tests, you can invoke them as follows:
+You can run the unit tests with `make test`. However, this is inconvenient in practice. Each test file will create an executable in the `build/bin` directory, which you can run directly. For example, if you want to run the SDS tests, you can invoke them as follows:
 
 ```text
 $ ./bin/flb-it-sds
@@ -351,8 +353,3 @@ Test sds_usage...                               [   OK   ]
 Test sds_printf...                              [   OK   ]
 SUCCESS: All unit tests have passed.
 ```
-
-## Need more help?
-
-The best way to learn how Fluent Bit code works is to read it. If you need help understanding the code, reach out to the community, or open a PR with changes that are a work in progress.
-
diff --git a/development/golang-output-plugins.md b/development/golang-output-plugins.md
index 3113532aa..979203afb 100644
--- a/development/golang-output-plugins.md
+++ b/development/golang-output-plugins.md
@@ -1,18 +1,20 @@
-# Golang Output Plugins
+# Golang output plugins
 
-Fluent Bit currently supports integration of Golang plugins built as shared objects for output plugins only. The interface for the Golang plugins is currently under development but is functional.
+Fluent Bit supports integration of Golang plugins built as shared objects for output plugins only. The interface for the Golang plugins is currently under development but is functional.
 
-## Getting Started
+## Get started
 
-Compile Fluent Bit with Golang support, e.g:
+Compile Fluent Bit with Golang support:
 
-```text
+```shell
 $ cd build/
+
 $ cmake -DFLB_DEBUG=On -DFLB_PROXY_GO=On ../
+
 $ make
 ```
 
-Once compiled, we can see a new option in the binary `-e` which stands for _external plugin_, e.g:
+Once compiled, you can see the new `-e` option in the binary which stands for _external plugin_.
 
 ```text
 $ bin/fluent-bit -h
@@ -30,13 +32,13 @@ Available Options
   ...
 ```
 
-## Build a Go Plugin
+## Build a Go plugin
 
-The _fluent-bit-go_ package is available to assist developers in creating Go plugins.
+The `fluent-bit-go` package is available to assist developers in creating Go plugins.
 
 [https://github.com/fluent/fluent-bit-go](https://github.com/fluent/fluent-bit-go)
 
-At a minimum, a Go plugin looks like this:
+A minimum Go plugin looks like the following:
 
 ```go
 package main
@@ -70,82 +72,143 @@ func main() {
 }
 ```
 
-the code above is a template to write an output plugin, it's really important to keep the package name as `main` and add an explicit `main()` function. This is a requirement as the code will be build as a shared library.
+The previous code is a template to write an output plugin. It's important to keep the package name as `main` and add an explicit `main()` function. This is a requirement as the code will be build as a shared library.
 
-To build the code above, use the following line:
+To build the code, use the following line:
 
-```bash
-$ go build -buildmode=c-shared -o out_gstdout.so out_gstdout.go
+```shell
+go build -buildmode=c-shared -o out_gstdout.so out_gstdout.go
 ```
 
-Once built, a shared library called `out\_gstdout.so` will be available. It's really important to double check the final .so file is what we expect. Doing a `ldd` over the library we should see something similar to this:
+Once built, a shared library called `out_gstdout.so` will be available. Confirm the final `.so` file is as expected. When you use the `ldd` over the library should see something similar to this:
 
-```text
+```shell
 $ ldd out_gstdout.so
-    linux-vdso.so.1 =>  (0x00007fff561dd000)
-    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc4aeef0000)
-    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc4aeb27000)
-    /lib64/ld-linux-x86-64.so.2 (0x000055751a4fd000)
+  
+  linux-vdso.so.1 =>  (0x00007fff561dd000)
+  libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc4aeef0000)
+  libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc4aeb27000)
+  /lib64/ld-linux-x86-64.so.2 (0x000055751a4fd000)
 ```
 
 ## Run Fluent Bit with the new plugin
 
-```bash
-$ bin/fluent-bit -e /path/to/out_gstdout.so -i cpu -o gstdout
+```shell
+fluent-bit -e /path/to/out_gstdout.so -i cpu -o gstdout
 ```
 
 ## Configuration file
 
-Fluent Bit can load / run Golang plugin using two configuration file.
+Fluent Bit can load and run Golang plugins using two configuration files.
 
 - Plugins configuration file
 - [Main configuration file](../administration/configuring-fluent-bit/classic-mode/configuration-file.md)
 
 ### Plugins configuration file
 
-| Key  | Description | Default Value|
-| ---- | ----------- | ------------ |
-| Path | A path for a Golang plugin. | |
+| Key  | Description |
+| ---- | ----------- |
+| Path | A path for a Golang plugin. |
 
-#### Example
+#### Plugin file example
 
-```python
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+plugins:
+  - /path/to/out_gstdout.so
+```
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [PLUGINS]
-    Path /path/to/out_gstdout.so
+  Path /path/to/out_gstdout.so
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ### Main configuration file
 
 The keys for Golang plugin available as of this version are described in the following table:
 
-| Key  | Description | Default Value|
-| ---- | ----------- | ------------ |
-| Plugins_file    | Path for a plugins configuration file. A _plugins_ configuration file allows to define paths for external plugins, for an example [see here](https://github.com/fluent/fluent-bit/blob/master/conf/plugins.conf).                                                                                     |               |
+| Key  | Description |
+| ---- | ----------- |
+| `Plugins_file`    | Path for a plugins configuration file. A plugins configuration file let you define paths for external plugins. For example, [see here](https://github.com/fluent/fluent-bit/blob/master/conf/plugins.conf). |
 
-#### Example
+#### Main configuration file example
 
 The following is an example of a main configuration file.
 
-```python
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  - /path/to/plugins.yaml
+  
+pipeline:
+  inputs:
+    - name dummy
+
+  outputs:
+    - name: gstdout
+```
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [SERVICE]
-    plugins_file /path/to/plugins.conf
+  plugins_file /path/to/plugins.conf
 
 [INPUT]
-    Name dummy
+  Name dummy
 
 [OUTPUT]
-    Name gstdout
+  Name gstdout
 ```
 
+{% endtab %}
+{% endtabs %}
+
 #### Config key constraint
 
-Some config keys are reserved by Fluent Bit and must not be used by a custom plugin, they are: `alias`,`host`,`ipv6`,`listen`,`log_level`,`log_suppress_interval`,`match`,`match_regex`,`mem_buf_limit`,`port`,`retry_limit`,`routable`,`storage.pause_on_chunks_overlimit`, `storage.total_limit_size`, `storage.type`, `tag`,`threaded`,`tls`,`tls.ca_file`, `tls.ca_path`, `tls.crt_file`, `tls.debug`, `tls.key_file`, `tls.key_passwd`, `tls.verify`, `tls.vhost`, `workers`
+The following configuration keys are reserved by Fluent Bit and must not be used by a custom plugin:
+
+- `alias`
+- `host`
+- `ipv6`
+- `listen`
+- `log_level`
+- `log_suppress_interval`
+- `match`
+- `match_regex`
+- `mem_buf_limit`
+- `port`
+- `retry_limit`
+- `routable`
+- `storage.pause_on_chunks_overlimit`
+- `storage.total_limit_size`
+- `storage.type`
+- `tag`
+- `threaded`
+- `tls`
+- `tls.ca_file`
+- `tls.ca_path`
+- `tls.crt_file`
+- `tls.debug`
+- `tls.key_file`
+- `tls.key_passwd`
+- `tls.verify`
+- `tls.vhost`
+- `workers`
 
 ### Run using a configuration file
 
-We can load a main configuration file using `-c` option.
-Note: No need to specify a plugins configuration file from command line.
+You can load a main configuration file using `-c` option. You don't need to specify a plugins configuration file from command line.
 
-```text
+```shell
 fluent-bit -c fluent-bit.conf
 ```
\ No newline at end of file
diff --git a/development/ingest-records-manually.md b/development/ingest-records-manually.md
index 3fd9f39d2..4a4db29d7 100644
--- a/development/ingest-records-manually.md
+++ b/development/ingest-records-manually.md
@@ -1,18 +1,18 @@
-# Ingest Records Manually
+# Ingest records manually
 
-There are some cases where Fluent Bit library is used to send records from the caller application to some destination, this process is called _manual data ingestion_.
+There are some cases where Fluent Bit library is used to send records from the caller application to some destination. This process is called _manual data ingestion_.
 
-For this purpose a specific input plugin called **lib** exists and can be using in conjunction with the **flb\_lib\_push\(\)** API function.
+For this purpose, a specific input plugin called **lib** exists and can be used in conjunction with the `flb_lib`_push()` API function.
 
-## Data Format
+## Data format
 
-The **lib** input plugin expect the data comes in a fixed JSON format as follows:
+The `lib` input plugin expects the data in the following fixed JSON format:
 
-```text
+```json
 [UNIX_TIMESTAMP, MAP]
 ```
 
-Every record must be a JSON array that contains at least two entries. The first one is the _UNIX\_TIMESTAMP_ which is a number representing time associated to the event generation \(Epoch time\) and the second entry is a JSON map with a list of key/values. A valid entry can be the following:
+Every record must be in a JSON array that contains at least two entries. The first one is the `UNIX_TIMESTAMP` which is a number representing time associated to the event generation (Epoch time). the second entry is a JSON map with a list of keys and values. A valid entry can be the following:
 
 ```javascript
 [1449505010, {"key1": "some value", "key2": false}]
@@ -75,4 +75,3 @@ int main()
     return 0;
 }
 ```
-
diff --git a/development/library_api.md b/development/library_api.md
index e8f5db0ab..f5a8f16d1 100644
--- a/development/library_api.md
+++ b/development/library_api.md
@@ -1,44 +1,44 @@
-# C Library API
+# C library API
 
-[Fluent Bit](http://fluentbit.io) library is written in C language and can be used from any C or C++ application. Before digging into the specification it is recommended to understand the workflow involved in the runtime.
+Fluent Bit is written in C and can be used from any C or C++ application.
 
 ## Workflow
 
-[Fluent Bit](http://fluentbit.io) runs as a service, meaning that the API exposed for developers provide interfaces to create and manage a context, specify inputs/outputs, set configuration parameters and set routing paths for the event/records. A typical usage of the library involves:
+Fluent Bit runs as a service, which means that the exposed API provides interfaces to create and manage contexts, specify inputs and outputs, set configuration parameters, and set routing paths for events or records. A typical usage of this library involves:
 
-* Create library instance/context and set properties.
-* Enable _input_ plugin\(s\) and set properties.
-* Enable _output_ plugin\(s\) and set properties.
-* Start the library runtime.
-* Optionally ingest records manually.
-* Stop the library runtime.
-* Destroy library instance/context.
+- Creating library instance and contexts and setting their properties.
+- Enabling input plugins and setting their properties.
+- Enabling output plugins and setting their properties.
+- Starting the library runtime.
+- Optionally ingesting records manually.
+- Stopping the library runtime.
+- Destroying library instances and contexts.
 
-## Data Types
+## Data types
 
-Starting from Fluent Bit v0.9, there is only one data type exposed by the library, by convention prefixed with **flb\_**.
+There is only one data type exposed by the library. By convention, this data type is prefixed with `flb_`.
 
 | Type | Description |
 | :--- | :--- |
-| flb\_ctx\_t | Main library context. It aims to reference the context returned by _flb\_create\(\);_ |
+| `flb_ctx_t` | Main library context. This references the context returned by `flb_create();`. |
 
-## API Reference
+## API reference
 
-### Library Context Creation
+### Library context creation
 
-As described earlier, the first step to use the library is to create a context of it, for the purpose the function **flb\_create\(\)** is used.
+Use the `flb_create()` function to create library context.
 
-**Prototype**
+#### Prototype
 
 ```c
 flb_ctx_t *flb_create();
 ```
 
-**Return Value**
+#### Return value
 
-On success, **flb\_create\(\)** returns the library context; on error, it returns NULL.
+On success, this function returns the library context. On error, it returns `NULL`.
 
-**Usage**
+#### Usage
 
 ```c
 flb_ctx_t *ctx;
@@ -49,23 +49,23 @@ if (!ctx) {
 }
 ```
 
-### Set Service Properties
+### Set service properties
 
-Using the **flb\_service\_set\(\)** function is possible to set context properties.
+Use the `flb_service_set()` function to set context properties.
 
-**Prototype**
+#### Prototype
 
 ```c
 int flb_service_set(flb_ctx_t *ctx, ...);
 ```
 
-**Return Value**
+#### Return value
 
-On success it returns 0; on error it returns a negative number.
+On success, this function returns `0`. On error, it returns a negative number.
 
-**Usage**
+#### Usage
 
-The **flb\_service\_set\(\)** allows to set one or more properties in a key/value string mode, e.g:
+This function sets one or more properties as a key/value string. For example:
 
 ```c
 int ret;
@@ -73,29 +73,31 @@ int ret;
 ret = flb_service_set(ctx, "Flush", "1", NULL);
 ```
 
-The above example specified the values for the properties **Flush** , note that the value is always a string \(char \*\) and once there is no more parameters a NULL argument must be added at the end of the list.
+This example specified the values for the property `Flush`. Its value is always a string (`char *`), and after all parameters are listed, you must add a `NULL` argument at the end of the list.
 
-### Enable Input Plugin Instance
+### Enable input plugin instance
 
-When built, [Fluent Bit](http://fluentbit.io) library contains a certain number of built-in _input_ plugins. In order to enable an _input_ plugin, the function **flb\_input**\(\) is used to create an instance of it.
+The Fluent Bit library contains several input plugins. To enable an input plugin, use the `flb_input()` function to create an instance of it.
 
-> For plugins, an _instance_ means a context of the plugin enabled. You can create multiples instances of the same plugin.
+{% hint style="info" %}
+For plugins, an _instance_ means a context of the plugin enabled. You can create multiple instances of the same plugin.
+{% endhint %}
 
-**Prototype**
+#### Prototype
 
 ```c
 int flb_input(flb_ctx_t *ctx, char *name, void *data);
 ```
 
-The argument **ctx** represents the library context created by **flb\_create\(\)**, then **name** is the name of the input plugin that is required to enable.
+The argument `ctx` represents the library context created by `flb_create()`, and `name` is the name of the input plugin to enable.
 
-The third argument **data** can be used to pass a custom reference to the plugin instance, this is mostly used by custom or third party plugins, for generic plugins passing _NULL_ is OK.
+The argument `data` can be used to pass a custom reference to the plugin instance. This is mostly used by custom or third-party plugins. For generic plugins, it's okay to pass `NULL`.
 
-**Return Value**
+#### Return value
 
-On success, **flb\_input\(\)** returns an integer value &gt;= zero \(similar to a file descriptor\); on error, it returns a negative number.
+On success, this function returns an integer value greater than or equal to zero, similar to a file descriptor. On error, it returns a negative number.
 
-**Usage**
+#### Usage
 
 ```c
 int in_ffd;
@@ -103,23 +105,23 @@ int in_ffd;
 in_ffd = flb_input(ctx, "cpu", NULL);
 ```
 
-### Set Input Plugin Properties
+### Set input plugin properties
 
-A plugin instance created through **flb\_input\(\)**, may provide some configuration properties. Using the **flb\_input\_set\(\)** function is possible to set these properties.
+A plugin instance created through `flb_input()` can include configuration properties. Use the `flb_input_set()` function to set these properties.
 
-**Prototype**
+#### Prototype
 
 ```c
 int flb_input_set(flb_ctx_t *ctx, int in_ffd, ...);
 ```
 
-**Return Value**
+#### Return value
 
-On success it returns 0; on error it returns a negative number.
+On success, this function returns `0`. On error, it returns a negative number.
 
-**Usage**
+#### Usage
 
-The **flb\_input\_set\(\)** allows to set one or more properties in a key/value string mode, e.g:
+This function sets one or more properties as a key/value string. For example:
 
 ```c
 int ret;
@@ -130,31 +132,33 @@ ret = flb_input_set(ctx, in_ffd,
                     NULL);
 ```
 
-The argument **ctx** represents the library context created by **flb\_create\(\)**. The above example specified the values for the properties **tag** and **ssl**, note that the value is always a string \(char \*\) and once there is no more parameters a NULL argument must be added at the end of the list.
+The argument `ctx` represents the library context created by `flb_create()`. The previous example specified the values for the properties `tag` and `ssl`. Its value is always a string (`char *`), and after all parameters are listed, you must add a `NULL` argument at the end of the list.
 
-The properties allowed per input plugin are specified on each specific plugin documentation.
+The properties allowed per input plugin are specified in the documentation for each plugin.
 
-### Enable Output Plugin Instance
+### Enable output plugin instance
 
-When built, [Fluent Bit](http://fluentbit.io) library contains a certain number of built-in _output_ plugins. In order to enable an _output_ plugin, the function **flb\_output**\(\) is used to create an instance of it.
+The Fluent Bit library contains several output plugins. To enable an output plugin, use the `flb_output()` function to create an instance of it.
 
-> For plugins, an _instance_ means a context of the plugin enabled. You can create multiples instances of the same plugin.
+{% hint style="info" %}
+For plugins, an _instance_ means a context of the plugin enabled. You can create multiple instances of the same plugin.
+{% endhint %}
 
-**Prototype**
+#### Prototype
 
 ```c
 int flb_output(flb_ctx_t *ctx, char *name, void *data);
 ```
 
-The argument **ctx** represents the library context created by **flb\_create\(\)**, then **name** is the name of the output plugin that is required to enable.
+The argument `ctx` represents the library context created by `flb_create()`, and `name` is the name of the output plugin to enable.
 
-The third argument **data** can be used to pass a custom reference to the plugin instance, this is mostly used by custom or third party plugins, for generic plugins passing _NULL_ is OK.
+The argument `data` can be used to pass a custom reference to the plugin instance. This is mostly used by custom or third-party plugins. For generic plugins, it's okay to pass `NULL`.
 
-**Return Value**
+#### Return value
 
-On success, **flb\_output\(\)** returns the output plugin instance; on error, it returns a negative number.
+On success, this function returns the output plugin instance. On error, it returns a negative number.
 
-**Usage**
+#### Usage
 
 ```c
 int out_ffd;
@@ -162,23 +166,23 @@ int out_ffd;
 out_ffd = flb_output(ctx, "stdout", NULL);
 ```
 
-### Set Output Plugin Properties
+### Set output plugin properties
 
-A plugin instance created through **flb\_output\(\)**, may provide some configuration properties. Using the **flb\_output\_set\(\)** function is possible to set these properties.
+A plugin instance created through `flb_output()` can include configuration properties. Use the `flb_output_set()` function to set these properties.
 
-**Prototype**
+#### Prototype
 
 ```c
 int flb_output_set(flb_ctx_t *ctx, int out_ffd, ...);
 ```
 
-**Return Value**
+#### Return value
 
-On success it returns an integer value &gt;= zero \(similar to a file descriptor\); on error it returns a negative number.
+On success, this function returns and integer value greater than or equal to zero, similar to a file descriptor. On error, it returns a negative number.
 
-**Usage**
+#### Usage
 
-The **flb\_output\_set\(\)** allows to set one or more properties in a key/value string mode, e.g:
+This function sets one or more properties as a key/value string. For example:
 
 ```c
 int ret;
@@ -189,27 +193,27 @@ ret = flb_output_set(ctx, out_ffd,
                      NULL);
 ```
 
-The argument **ctx** represents the library context created by **flb\_create\(\)**. The above example specified the values for the properties **tag** and **ssl**, note that the value is always a string \(char \*\) and once there is no more parameters a NULL argument must be added at the end of the list.
+The argument `ctx` represents the library context created by `flb_create()`. The previous example specified the values for the properties `tag` and `ssl`. Its value is always a string (`char *`), and after all parameters are listed, you must add a `NULL` argument at the end of the list.
 
-The properties allowed per output plugin are specified on each specific plugin documentation.
+The properties allowed per output plugin are specified in the documentation for each plugin.
 
-## Start Fluent Bit Engine
+## Start Fluent Bit engine
 
-Once the library context has been created and the input/output plugin instances are set, the next step is to start the engine. When started, the engine runs inside a new thread \(POSIX thread\) without blocking the caller application. To start the engine the function **flb\_start\(\)** is used.
+After you create the library context and set input and output plugin instances, use the `flb_start()` function to start the engine. After the engine has started, it runs inside a new thread (POSIX thread) without blocking the caller application.
 
-**Prototype**
+### Prototype
 
 ```c
 int flb_start(flb_ctx_t *ctx);
 ```
 
-**Return Value**
+### Return value
 
-On success it returns 0; on error it returns a negative number.
+On success, this function returns `0`. On error, it returns a negative number.
 
-**Usage**
+### Usage
 
-This simple call only needs as argument **ctx** which is the reference to the context created at the beginning with **flb\_create\(\)**:
+This function uses the `ctx` argument, which is a reference to the context created by `flb_create()`.
 
 ```c
 int ret;
@@ -217,25 +221,25 @@ int ret;
 ret = flb_start(ctx);
 ```
 
-## Stop Fluent Bit Engine
+## Stop Fluent Bit engine
 
-To stop a running Fluent Bit engine, we provide the call **flb\_stop\(\)** for that purpose.
+To stop a running Fluent Bit engine, use `flb_stop()`.
 
-**Prototype**
+### Prototype
 
 ```c
 int flb_stop(flb_ctx_t *ctx);
 ```
 
-The argument **ctx** is a reference to the context created at the beginning with **flb\_create\(\)** and previously started with **flb\_start\(\)**.
+The argument `ctx` is a reference to the context created by `flb_create()` and started by `flb_start()`.
 
-When the call is invoked, the engine will wait a maximum of five seconds to flush buffers and release the resources in use. A stopped context can be re-started any time but without any data on it.
+When the call is invoked, the engine waits a maximum of five seconds to flush buffers and release any resources in use. A stopped context can be restarted at any time, but without any data on it.
 
-**Return Value**
+### Return value
 
-On success it returns 0; on error it returns a negative number.
+On success, this function returns `0`. On error, it returns a negative number.
 
-**Usage**
+### Usage
 
 ```c
 int ret;
@@ -243,45 +247,44 @@ int ret;
 ret = flb_stop(ctx);
 ```
 
-## Destroy Library Context
+## Destroy library context
 
-A library context must be destroyed after is not longer necessary, note that a previous **flb\_stop\(\)** call is mandatory. When destroyed all resources associated are released.
+You can destroy a library context after it's no longer necessary. A previous `flb_stop()` call is mandatory. After a library context is destroyed, all associated resources are released.
 
-**Prototype**
+### Prototype
 
 ```c
 void flb_destroy(flb_ctx_t *ctx);
 ```
 
-The argument **ctx** is a reference to the context created at the beginning with **flb\_create\(\)**.
+The argument `ctx` is a reference to the context created by `flb_create()`.
 
-**Return Value**
+### Return value
 
-No return value.
+This function doesn't return a value.
 
-**Usage**
+### Usage
 
 ```c
 flb_destroy(ctx);
 ```
 
-## Ingest Data Manually
+## Ingest data manually
 
-There are some cases where the caller application may want to ingest data into Fluent Bit, for this purpose exists the function **flb\_lib\_push\(\)**.
+In some cases, the caller application might want to ingest data into Fluent Bit. You can use the `flb_lib_push()` function to do so.
 
-**Prototype**
+### Prototype
 
 ```c
 int flb_lib_push(flb_ctx_t *ctx, int in_ffd, void *data, size_t len);
 ```
 
-The first argument is the context created previously through **flb\_create\(\)**. **in\_ffd** is the numeric reference of the input plugin \(for this case it should be an input of plugin **lib** type\), **data** is a reference to the message to be ingested and **len** the number of bytes to take from it.
+The first argument is the context created through `flb_create()`. The `in_ffd` argument is the numeric reference of the input plugin, which in this case is a `lib` input plugin. The `data` argument is a reference to the message to be ingested, and the `len` argument is the number of bytes to take from it.
 
-**Return Value**
+### Return value
 
-On success, it returns the number of bytes written; on error it returns -1.
+On success, this function returns the number of bytes written. On error, it returns `-1`.
 
-**Usage**
-
-For more details and an example about how to use this function properly please refer to the next section [Ingest Records Manually](ingest-records-manually.md).
+### Usage
 
+For more information about how to use this function, including examples, see [Ingest Records Manually](ingest-records-manually.md).
diff --git a/development/msgpack-format.md b/development/msgpack-format.md
index bb377c9b2..4c4d4794f 100644
--- a/development/msgpack-format.md
+++ b/development/msgpack-format.md
@@ -1,27 +1,26 @@
-# Msgpack format
+# MessagePack format
 
-Fluent Bit **always** handles every Event message as a structured message using a binary serialization data format called [MessagePack](https://msgpack.org/).
+Fluent Bit always handles every Event message as a structured message using a binary serialization data format called [MessagePack](https://msgpack.org/).
 
 ## Fluent Bit usage
 
 MessagePack is a standard and well-defined format, refer to the official documentation for full details.
 This section provides an overview of the specific types used by Fluent Bit within the format to help anyone consuming it.
 
-* The data structure used by Fluent Bit is a 2-length [`fixarray`](https://github.com/msgpack/msgpack/blob/master/spec.md#array-format-family) of the timestamp and the data.
-* The timestamp comes from [`flb_time_append_to_msgpack`])(https://github.com/fluent/fluent-bit/blob/2138cee8f4878733956d42d82f6dcf95f0aa9339/src/flb_time.c#L197), so it’s either a `uint64`, a `float64`, or a [`fixext`](https://github.com/msgpack/msgpack/blob/master/spec.md#ext-format-family) where the 4 MSBs are the seconds (big-endian `uint32`) and 4 LSBs are nanoseconds.
-* The data itself is just a [`msgpack` map](https://github.com/msgpack/msgpack/blob/master/spec.md#map-format-family) with the keys as strings.
+- The data structure used by Fluent Bit is a 2-length [`fixarray`](https://github.com/msgpack/msgpack/blob/master/spec.md#array-format-family) of the timestamp and the data.
+- The timestamp comes from [`flb_time_append_to_msgpack`](https://github.com/fluent/fluent-bit/blob/2138cee8f4878733956d42d82f6dcf95f0aa9339/src/flb_time.c#L197), so it's either a `uint64`, a `float64`, or a [`fixext`](https://github.com/msgpack/msgpack/blob/master/spec.md#ext-format-family) where the 4 MSBs are the seconds (big-endian `uint32`) and 4 LSBs are nanoseconds.
+- The data itself is a [`msgpack` map](https://github.com/msgpack/msgpack/blob/master/spec.md#map-format-family) with the keys as strings.
 
 ## Example
 
 Set up Fluent Bit to send in `msgpack` format to a specific port.
 
-```bash
-$ docker run --rm -it --network=host fluent/fluent-bit /fluent-bit/bin/fluent-bit -i cpu -o tcp://127.0.0.1:5170 -p format=msgpack -v
-
+```shell
+docker run --rm -it --network=host fluent/fluent-bit /fluent-bit/bin/fluent-bit -i cpu -o tcp://127.0.0.1:5170 -p format=msgpack -v
 ```
 
-We could send this to stdout but as it is a serialized format you would end up with strange output.
-As an example we use the [Python msgpack library](https://msgpack.org/#languages) to deal with it:
+You could send this to stdout but as it's a serialized format you would end up with strange output.
+As an example, use the [Python `msgpack` library](https://msgpack.org/#languages) to handle it:
 
 ```python
 #Python3
@@ -46,9 +45,10 @@ while True:
 
 Now make sure to install `msgpack` for Python (3) and then run up your test code:
 
-```bash
+```shell
 $ pip install msgpack
+
 $ python3 test.py
-(ExtType(code=0, data=b'b\n5\xc65\x05\x14\xac'), {'cpu_p': 0.1875, 'user_p': 0.125, 'system_p': 0.0625, 'cpu0.p_cpu': 0.0, 'cpu0.p_user': 0.0, 'cpu0.p_system': 0.0, 'cpu1.p_cpu': 0.0, 'cpu1.p_user': 0.0, 'cpu1.p_system': 0.0, 'cpu2.p_cpu': 1.0, 'cpu2.p_user': 0.0, 'cpu2.p_system': 1.0, 'cpu3.p_cpu': 0.0, 'cpu3.p_user': 0.0, 'cpu3.p_system': 0.0, 'cpu4.p_cpu': 0.0, 'cpu4.p_user': 0.0, 'cpu4.p_system': 0.0, 'cpu5.p_cpu': 0.0, 'cpu5.p_user': 0.0, 'cpu5.p_system': 0.0, 'cpu6.p_cpu': 0.0, 'cpu6.p_user': 0.0, 'cpu6.p_system': 0.0, 'cpu7.p_cpu': 0.0, 'cpu7.p_user': 0.0, 'cpu7.p_system': 0.0, 'cpu8.p_cpu': 0.0, 'cpu8.p_user': 0.0, 'cpu8.p_system': 0.0, 'cpu9.p_cpu': 1.0, 'cpu9.p_user': 1.0, 'cpu9.p_system': 0.0, 'cpu10.p_cpu': 0.0, 'cpu10.p_user': 0.0, 'cpu10.p_system': 0.0, 'cpu11.p_cpu': 0.0, 'cpu11.p_user': 0.0, 'cpu11.p_system': 0.0, 'cpu12.p_cpu': 0.0, 'cpu12.p_user': 0.0, 'cpu12.p_system': 0.0, 'cpu13.p_cpu': 0.0, 'cpu13.p_user': 0.0, 'cpu13.p_system': 0.0, 'cpu14.p_cpu': 0.0, 'cpu14.p_user': 0.0, 'cpu14.p_system': 0.0, 'cpu15.p_cpu': 0.0, 'cpu15.p_user': 0.0, 'cpu15.p_system': 0.0})
 
-```
+(ExtType(code=0, data=b'b\n5\xc65\x05\x14\xac'), {'cpu_p': 0.1875, 'user_p': 0.125, 'system_p': 0.0625, 'cpu0.p_cpu': 0.0, 'cpu0.p_user': 0.0, 'cpu0.p_system': 0.0, 'cpu1.p_cpu': 0.0, 'cpu1.p_user': 0.0, 'cpu1.p_system': 0.0, 'cpu2.p_cpu': 1.0, 'cpu2.p_user': 0.0, 'cpu2.p_system': 1.0, 'cpu3.p_cpu': 0.0, 'cpu3.p_user': 0.0, 'cpu3.p_system': 0.0, 'cpu4.p_cpu': 0.0, 'cpu4.p_user': 0.0, 'cpu4.p_system': 0.0, 'cpu5.p_cpu': 0.0, 'cpu5.p_user': 0.0, 'cpu5.p_system': 0.0, 'cpu6.p_cpu': 0.0, 'cpu6.p_user': 0.0, 'cpu6.p_system': 0.0, 'cpu7.p_cpu': 0.0, 'cpu7.p_user': 0.0, 'cpu7.p_system': 0.0, 'cpu8.p_cpu': 0.0, 'cpu8.p_user': 0.0, 'cpu8.p_system': 0.0, 'cpu9.p_cpu': 1.0, 'cpu9.p_user': 1.0, 'cpu9.p_system': 0.0, 'cpu10.p_cpu': 0.0, 'cpu10.p_user': 0.0, 'cpu10.p_system': 0.0, 'cpu11.p_cpu': 0.0, 'cpu11.p_user': 0.0, 'cpu11.p_system': 0.0, 'cpu12.p_cpu': 0.0, 'cpu12.p_user': 0.0, 'cpu12.p_system': 0.0, 'cpu13.p_cpu': 0.0, 'cpu13.p_user': 0.0, 'cpu13.p_system': 0.0, 'cpu14.p_cpu': 0.0, 'cpu14.p_user': 0.0, 'cpu14.p_system': 0.0, 'cpu15.p_cpu': 0.0, 'cpu15.p_user': 0.0, 'cpu15.p_system': 0.0})
+```
\ No newline at end of file
diff --git a/development/wasm-filter-plugins.md b/development/wasm-filter-plugins.md
index e8cfb376e..84e474068 100644
--- a/development/wasm-filter-plugins.md
+++ b/development/wasm-filter-plugins.md
@@ -1,54 +1,56 @@
-# WASM Filter Plugins
+# Wasm filter plugins
 
-[WebAssembly](https://webassembly.org/) is binary instruction format for stack based virtual machine.
+[WebAssembly](https://webassembly.org/) (Wasm) is a binary instruction format for stack-based virtual machines.
 
-Fluent Bit currently supports integration of wasm plugins built as wasm/wasi objects for input and filter plugins only.
-The interface for the WASM filter plugins is currently under development but is functional.
+Fluent Bit supports integration of Wasm plugins built as Wasm/WASI objects for input and filter plugins only. The interface for Wasm filter plugins is currently under development but is functional.
 
 ## Prerequisites
 
-### Building Fluent Bit
+### Build Fluent Bit
 
-There are no additional requirements to execute WASM plugins.
+There are no additional requirements to execute Wasm plugins.
 
-#### Building flb-wamrc (optional)
+#### Build `flb-wamrc` (optional)
 
-`flb-wamrc` is just `flb-` prefixed AOT (Ahead Of Time) compiler that is provided from [wasm-micro-runtime](https://github.com/bytecodealliance/wasm-micro-runtime).
+`flb-wamrc` is a `flb`-prefixed Ahead of Time (AOT) compiler that's provided from [`wasm-micro-runtime`](https://github.com/bytecodealliance/wasm-micro-runtime).
 
-For `flb-wamrc` support, users have to install llvm infrastructure and some additional libraries (`libmlir`, `libPolly`, `libedit`, and `libpfm`), e.g:
+For `flb-wamrc` support, you must install the LLVM infrastructure and some additional libraries (`libmlir`, `libPolly`, `libedit`, and `libpfm`). For example:
 
 ```text
 # apt install -y llvm libmlir-14-dev libclang-common-14-dev libedit-dev libpfm4-dev
 ```
 
-### For Build WASM programs
+### For Wasm programs
 
-Currently, Fluent Bit supports the following WASM toolchains:
+Fluent Bit supports the following Wasm tool chains:
 
-* Rust on `wasm32-unknown-unknown`.
-  * rustc 1.62.1 (e092d0b6b 2022-07-16) or later
-* [TinyGo](https://github.com/tinygo-org/tinygo) on wasm32-wasi
-  * v0.24.0 or later
-* [WASI SDK](https://github.com/WebAssembly/wasi-sdk) 13 or later.
+- Rust on `wasm32-unknown-unknown`
+  - rustc 1.62.1 (`e092d0b6b` 2022-07-16) or later
+- [TinyGo](https://github.com/tinygo-org/tinygo) on `wasm32-wasi`
+  - v0.24.0 or later
+- [WASI SDK](https://github.com/WebAssembly/wasi-sdk) 13 or later.
 
-## Getting Started
+## Get started
 
-As described in general options in [source installation](../installation/sources/build-and-install.md),
-WASM support is enabled by default.
-Compile Fluent Bit with WASM support, e.g:
+As described in the general options in the [source installation](../installation/sources/build-and-install.md) guide, Wasm support is enabled by default. Compile Fluent Bit with Wasm support, for example:
 
 ```text
-$ cd build/
-$ cmake .. [-DFLB_WAMRC=On]
-$ make
+cd build/
+cmake .. [-DFLB_WAMRC=On]
+make
 ```
 
-To support AOT compiled WASM execution as filter plugins, users have to built Fluent Bit with `-DFLB_WAMRC=On`.
+To support AOT-compiled Wasm execution as filter plugins, build Fluent Bit with `-DFLB_WAMRC=On`.
 
-Once compiled, we can see new plugins in which handles _wasm_, e.g:
+Once compiled, you can see new plugins that handle `wasm`, for example:
+
+```shell
+bin/fluent-bit -h
+```
+
+Which returns results similar to:
 
 ```text
-$ bin/fluent-bit -h
 Usage: fluent-bit [OPTION]
 Inputs
   # ... other input plugin stuffs
@@ -59,31 +61,30 @@ Filters
   wasm                    WASM program filter
 ```
 
-## Build a WASM Filter for Filter Plugin
+## Build a Wasm filter for filter plugin
 
-Currently, Fluent Bit's WASM filter assumes C ABI that is also known as `wasm32-unknown-unknown` on Rust target and `wasm32-wasi` on TinyGo target.
+The Fluent Bit Wasm filter assumes C ABI, also known as `wasm32-unknown-unknown` on Rust target and `wasm32-wasi` on TinyGo target.
 
-### To Install Additional Components
+### Install additional components
 
-TinyGo and WASI SDK support wasm target by default.
-When using Rust's `wasm32-unknown-unknown` target, users must install `wasm32-unknown-unknown` via [rustup](https://rustup.rs/). Then, installing that target components as:
+TinyGo and WASI SDK support Wasm target by default. When using Rust's `wasm32-unknown-unknown` target, you must install `wasm32-unknown-unknown` by using [`rustup`](https://rustup.rs/). Then, install the target components as follows:
 
 ```text
-$ rustup target add wasm32-unknown-unknown
+rustup target add wasm32-unknown-unknown
 ```
 
-### Requirements of WASM programs
+### Requirements of Wasm programs
 
-WASM filter plugins execute the function that has the following signagure.
+Wasm filter plugins execute the function that has the following signature.
 
 For C:
 
 ```text
-// We can use an arbitrary function name for filter operations w/ WASM.
+// We can use an arbitrary function name for filter operations w/ Wasm.
 char* c_filter(char*, int, uint32_t, uint32_t, char*, int);
 ```
 
-For Go(TinyGo):
+For Go (TinyGo):
 
 ```text
 //export go_filter
@@ -95,14 +96,39 @@ For Rust:
 
 ```text
 // #[no_mangle] attribute is needed for preventing mangles and align C ABI.
-// Also we can use an arbitrary function name for filter operations w/ WASM.
+// Also we can use an arbitrary function name for filter operations w/ Wasm.
 #[no_mangle]
-pub extern “C” fn rust_filter(tag: *const c_char, tag_len: u32, time_sec: u32, time_nsec: u32, record: *const c_char, record_len: u32)
+pub extern "C" fn rust_filter(tag: *const c_char, tag_len: u32, time_sec: u32, time_nsec: u32, record: *const c_char, record_len: u32)
 ```
 
-Note that `//export XXX` on TinyGo and `#[no_mangle]` attributes on Rust are required. This is because TinyGo and Rust will mangle their function names if they are not specified.
+The `//export XXX` attribute on TinyGo and `#[no_mangle]` attribute on Rust are required. This is because TinyGo and Rust will mangle their function names if they aren't specified.
+
+Once built, a Wasm program will be available. Then you can execute that built program with one of the following Fluent Bit configurations:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-Once built, a WASM program will be available. Then, that built program can be executed with the following Fluent Bit configuration:
+```yaml
+pipeline:
+    inputs:
+        - name: dummy
+          tag: dummy.local
+
+    filters:
+      - name: wasm
+        match: 'dummy.*'
+        wasm_path: /path/to/built_filter.wasm
+        function_name: super_awesome_filter
+        # Note: run Fluent Bit from the 'wasm_path' location.
+        accessible_paths: /path/to/fluent-bit
+
+    outputs:
+        - name: stdout
+          match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
@@ -114,23 +140,53 @@ Once built, a WASM program will be available. Then, that built program can be ex
     Match dummy.*
     WASM_Path /path/to/built_filter.wasm
     Function_Name super_awesome_filter
-    accessible_paths .,/path/to/fluent-bit
+    accessible_paths /path/to/fluent-bit
 
 [OUTPUT]
     Name  stdout
     Match *
 ```
 
-For example, one of the examples of [Rust WASM filter](https://github.com/fluent/fluent-bit/tree/master/examples/filter_rust) should generate its filtered logs as follows:
+{% endtab %}
+{% endtabs %}
+
+For example, one of the sample [Rust Wasm filters](https://github.com/fluent/fluent-bit/tree/master/examples/filter_rust) should generate its filtered logs as follows:
 
 ```text
 [0] dummy.local: [1666270588.271704000, {"lang"=>"Rust", "message"=>"dummy", "original"=>"{"message":"dummy"}", "tag"=>"dummy.local", "time"=>"2022-10-20T12:56:28.271704000 +0000"}]
 [0] dummy.local: [1666270589.270348000, {"lang"=>"Rust", "message"=>"dummy", "original"=>"{"message":"dummy"}", "tag"=>"dummy.local", "time"=>"2022-10-20T12:56:29.270348000 +0000"}]
 [0] dummy.local: [1666270590.271107000, {"lang"=>"Rust", "message"=>"dummy", "original"=>"{"message":"dummy"}", "tag"=>"dummy.local", "time"=>"2022-10-20T12:56:30.271107000 +0000"}]
 ```
-Another example of a Rust WASM filter is the [flb_filter_iis](https://github.com/kenriortega/flb_filter_iis) filter.
+
+Another example of a Rust Wasm filter is the [`flb_filter_iis`](https://github.com/kenriortega/flb_filter_iis) filter.
+
 This filter takes the [Internet Information Services (IIS)](https://learn.microsoft.com/en-us/iis/manage/provisioning-and-managing-iis/configure-logging-in-iis) [w3c logs](https://learn.microsoft.com/en-us/iis/manage/provisioning-and-managing-iis/configure-logging-in-iis#select-w3c-fields-to-log) (with some custom modifications) and transforms the raw string into a standard Fluent Bit JSON structured record.
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+    inputs:
+        - name: dummy
+          dummy: '{"log": "2023-08-11 19:56:44 W3SVC1 WIN-PC1 ::1 GET / - 80 ::1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/115.0.0.0+Safari/537.36+Edg/115.0.1901.200 - - localhost 304 142 756 1078 -"}'
+          tag: 'iis.*'
+
+    filters:
+      - name: wasm
+        match: 'iis.*'
+        wasm_path: /plugins/flb_filter_iis_wasm.wasm
+        function_name: flb_filter_log_iis_w3c_custom
+        accessible_paths: .
+
+    outputs:
+        - name: stdout
+          match: 'iis.*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
 ```text
 [INPUT]
     Name             dummy
@@ -149,6 +205,9 @@ This filter takes the [Internet Information Services (IIS)](https://learn.micros
     match            iis.*
 ```
 
+{% endtab %}
+{% endtabs %}
+
 The incoming raw strings from an IIS log are composed of the following fields:
 
 `date time s-sitename s-computername s-ip cs-method cs-uri-stem cs-uri-query s-port c-ip cs(User-Agent) cs(Cookie) cs(Referer) cs-host sc-status sc-bytes cs-bytes time-taken c-authorization-header`
@@ -158,32 +217,34 @@ The output after the filter logic will be:
 ```text
 [0] iis.*: [[1692131925.559486675, {}], {"c_authorization_header"=>"-", "c_ip"=>"::1", "cs_bytes"=>756, "cs_cookie"=>"-", "cs_host"=>"localhost", "cs_method"=>"GET", "cs_referer"=>"-", "cs_uri_query"=>"-", "cs_uri_stem"=>"/", "cs_user_agent"=>"Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/115.0.0.0+Safari/537.36+Edg/115.0.1901.200", "date"=>"2023-08-11 19:56:44", "s_computername"=>"WIN-PC1", "s_ip"=>"::1", "s_port"=>"80", "s_sitename"=>"W3SVC1", "sc_bytes"=>142, "sc_status"=>"304", "source"=>"LogEntryIIS", "tag"=>"iis.*", "time"=>"2023-08-15T20:38:45.559486675 +0000", "time_taken"=>1078}]
 ```
-This filter approach provides us with several powerful advantages inherent to programming languages. 
-For instance, it:
-- Can be extended by adding type conversion to fields such as `sc_bytes, cs_bytes, time_taken`. This is particularly useful when we need to validate our data results.
-- Allows for the use of conditions to apply more descriptive filters, for example, "get only all logs that contain status codes above 4xx or 5xx".
-- Can be used to define a `allow/deny` list using a data structure array or a file to store predefined IP addresses.
-- Makes it possible to call an external resource such as an API or database to enhance our data.
-- Allows all methods to be thoroughly tested and shared as a binary bundle or library.
-These examples can be applied in our demo and can serve as an ideal starting point to create more complex logic, depending on our requirements.
 
-### Optimize execution of WASM programs
+This filter approach offers several advantages inherent to programming languages. For example:
+
+- It can be extended by adding type conversion to fields, such as `sc_bytes`, `cs_bytes`, and `time_taken`. You can use this to validate data results.
+- It allows for the use of conditions to apply more descriptive filters. For example, you can get only all logs that contain status codes higher than `4xx` or `5xx`.
+- It can be used to define allow lists and deny lists using a data structure array or a file to store predefined IP addresses.
+- It makes it possible to call an external resource such as an API or database to enhance your data.
+- It allows all methods to be thoroughly tested and shared as a binary bundle or library.
+
+These examples can be applied in a demo and can serve as an ideal starting point to create more complex logic, depending on your requirements.
+
+### Optimize execution of Wasm programs
+
+To optimize Wasm program execution, there is the option of using `flb-wamrc`. This option reduces your runtime footprint and to be best performance for filtering operations.
 
-To optimize WASM program execution, there is the option of using `flb-wamrc`.
-`flb-wamrc` will reduce runtime footprint and to be best performance for filtering operations.
-This tool will be built when `-DFLB_WAMRC=On` cmake option is specified and llvm infrastructure is installed on the building box.
+This tool will be built when the `-DFLB_WAMRC=On` CMake option is specified and LLVM infrastructure is installed on the building box.
 
 ```shell
-$ flb-wamrc -o /path/to/built_wasm.aot /path/to/built_wasm.wasm
+flb-wamrc -o /path/to/built_wasm.aot /path/to/built_wasm.wasm
 ```
 
-For further optimizations to the specific CPU such as Cortex-A57 series, e.g:
+For further optimizations to the specific CPU, such as Cortex-A57 series:
 
 ```text
-$ flb-wamrc --size-level=3 --target=aarch64v8 --cpu=cortex-a57 -o /path/to/built_wasm.aot /path/to/built_wasm.wasm
+flb-wamrc --size-level=3 --target=aarch64v8 --cpu=cortex-a57 -o /path/to/built_wasm.aot /path/to/built_wasm.wasm
 ```
 
-Then, when AOT (Ahead Of Time) compiling is succeeded:
+Then, when AOT (Ahead Of Time) compiling has succeeded:
 
 ```text
 Create AoT compiler with:
@@ -196,13 +257,11 @@ Create AoT compiler with:
 Compile success, file /path/to/built_wasm.aot was generated.
 ```
 
-Note that AOT compiling should generate CPU architecture-dependent objects. If users want to use AOT compiled object on the different archtecture, it must align the **target** and **target cpu** for actual environments.
+AOT compiling should generate CPU architecture-dependent objects. If you want to use an AOT compiled object on different architecture, it must align the `target` and `target cpu` for actual environments.
 
-### Further Concrete Examples
+### Further examples
 
-* C Filter
-  * https://github.com/fluent/fluent-bit/tree/master/examples/filter_wasm_c
-* Rust Filter
-  * https://github.com/fluent/fluent-bit/tree/master/examples/filter_rust
-* TinyGo Filter
-  * https://github.com/fluent/fluent-bit/tree/master/examples/filter_wasm_go
+- [C filter](https://github.com/fluent/fluent-bit/tree/master/examples/filter_wasm_c)
+- [Rust Filter](https://github.com/fluent/fluent-bit/tree/master/examples/filter_rust)
+- [TinyGo
+  filter](https://github.com/fluent/fluent-bit/tree/master/examples/filter_wasm_go)
diff --git a/development/wasm-input-plugins.md b/development/wasm-input-plugins.md
index 7dab644ce..b838bd2b7 100644
--- a/development/wasm-input-plugins.md
+++ b/development/wasm-input-plugins.md
@@ -1,37 +1,36 @@
-# WASM Input Plugins
+# Wasm input plugins
 
-[WebAssembly](https://webassembly.org/) is binary instruction format for stack based virtual machine.
+[WebAssembly](https://webassembly.org/) (Wasm) is a binary instruction format for stack-based virtual machines.
 
-Fluent Bit currently supports integration of wasm plugins built as wasm/wasi objects for input and filter plugins only.
-The interface for the WASM filter plugins is currently under development but is functional.
+Fluent Bit supports integration of Wasm plugins built as Wasm/WASI objects for inputs and filter plugins only. The interface for Wasm filter plugins is currently under development but is functional.
 
 ## Prerequisites
 
-### Building Fluent Bit
+### Build Fluent Bit
 
-There are no additional requirements to execute WASM plugins.
+There are no additional requirements to execute Wasm plugins.
 
-### For Build WASM programs
+### For Wasm programs
 
-Currently, fluent-bit supports the following WASM toolchains:
+Fluent Bit supports the following Wasm tool chains:
 
-* Rust on `wasm32-unknown-unknown`.
-  * rustc 1.62.1 (e092d0b6b 2022-07-16) or later
-* [TinyGo](https://github.com/tinygo-org/tinygo) on wasm32-wasi
-  * v0.24.0 or later
-* [WASI SDK](https://github.com/WebAssembly/wasi-sdk) 13 or later.
+- Rust on `wasm32-unknown-unknown`
+  - rustc 1.62.1 (`e092d0b6b` 2022-07-16) or later
+- [TinyGo](https://github.com/tinygo-org/tinygo) on `wasm32-wasi`
+  - v0.24.0 or later
+- [WASI SDK](https://github.com/WebAssembly/wasi-sdk) 13 or later
 
-## Getting Started
+## Get started
 
-Compile Fluent Bit with WASM support, e.g:
+Compile Fluent Bit with Wasm support. For example:
 
 ```text
-$ cd build/
-$ cmake ..
-$ make
+cd build/
+cmake ..
+make
 ```
 
-Once compiled, we can see new plugins in which handles _wasm_, e.g:
+Once compiled, you can see new plugins that handle `wasm`. For example:
 
 ```text
 $ bin/fluent-bit -h
@@ -45,28 +44,47 @@ Filters
   wasm                    WASM program filter
 ```
 
-## Build a WASM Input for Input Plugin
+## Build a Wasm input for input plugin
 
-Currently, Fluent Bit's WASM input assumes WASI ABI that is also known as `wasm32-wasi` on Rust target and `wasm32-wasi` on TinyGo target.
+Wasm input in Fluent Bit assumes WASI ABI, also known as `wasm32-wasi` on Rust target and `wasm32-wasi` on TinyGo target.
 
-### To Install Additional Components
+### Install additional components
 
-TinyGo and WASI SDK support wasm target by default.
-When using Rust's `wasm32-wasi` target, users must install `wasm32-wasi` via [rustup](https://rustup.rs/). Then, installing that target components as:
+TinyGo and WASI SDK support Wasm target by default. When using Rust's `wasm32-wasi` target, you must install `wasm32-wasi` by using [`rustup`](https://rustup.rs/). Then, install the target components as:
 
 ```text
-$ rustup target add wasm32-wasi
+rustup target add wasm32-wasi
 ```
 
-### Requirements of WASM/WASI programs
+### Requirements of Wasm/WASI programs
 
-WASM input plugins execute the function that has wasi main function entrypoint.
-And Fluent Bit's WASM input plugin communicates via stdout on WASM programs.
+Wasm input plugins execute the function that has a WASI main function entrypoint, and Wasm input plugins in Fluent Bit communicate through stdout on Wasm programs.
 
-WASM programs should handle stdout for ingesting logs into Fluent Bit.
+Wasm programs should handle stdout for ingesting logs into Fluent Bit.
 
+Once built, a Wasm/WASI program will be available. Then you can execute that program with one of the following Fluent Bit configurations:
 
-Once built, a WASM/WASI program will be available. Then, that built program can be executed with the following Fluent Bit configuration:
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+    inputs:
+        - name: exec_wasi
+          tag: exec.wasi.local
+          wasi_path: /path/to/wasi_built_json.wasm
+          # For security reasons, WASM/WASI program cannot access its outer world
+          # without accessible permissions. Uncomment below 'accessible_paths' and
+          # run Fluent Bit from the 'wasi_path' location:
+          # accessible_paths /path/to/fluent-bit
+
+    outputs:
+        - name: stdout
+          match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
@@ -74,12 +92,17 @@ Once built, a WASM/WASI program will be available. Then, that built program can
     Tag  exec.wasi.local
     WASI_Path /path/to/wasi_built_json.wasm
     # For security reasons, WASM/WASI program cannot access its outer world
-    # without accessible permissions.
-    # accessible_paths .,/path/to/fluent-bit
+    # without accessible permissions. Uncomment below 'accessible_paths' and
+    # run Fluent Bit from the 'wasi_path' location:
+    # accessible_paths /path/to/fluent-bit
 
 [OUTPUT]
     Name  stdout
     Match *
 ```
 
-For further example that handles structured logs, fluent-bit has a Rust serde-json example: https://github.com/fluent/fluent-bit/tree/master/examples/wasi_serde_json
+{% endtab %}
+{% endtabs %}
+
+For an example that handles structured logs, see the [Rust `serde-json`
+example](https://github.com/fluent/fluent-bit/tree/master/examples/wasi_serde_json).
diff --git a/imgs/logo_documentation_1.6.png b/imgs/logo_documentation_1.6.png
deleted file mode 100644
index 6cd5b7ed0..000000000
Binary files a/imgs/logo_documentation_1.6.png and /dev/null differ
diff --git a/input/example-page-under-group-1.md b/input/example-page-under-group-1.md
deleted file mode 100644
index 2c9158684..000000000
--- a/input/example-page-under-group-1.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# example page under group 1
-
diff --git a/installation/amazon-ec2.md b/installation/amazon-ec2.md
index f35f0aa57..c92d02217 100644
--- a/installation/amazon-ec2.md
+++ b/installation/amazon-ec2.md
@@ -1,4 +1,3 @@
 # Amazon EC2
 
-Learn how to [install Fluent Bit and the AWS output plugins on Amazon Linux 2 via AWS Systems Manager](https://github.com/aws/aws-for-fluent-bit/tree/master/examples/fluent-bit/systems-manager-ec2).
-
+Learn how to install Fluent Bit and the AWS output plugins on Amazon Linux 2 using [AWS Systems Manager](https://github.com/aws/aws-for-fluent-bit/tree/master/examples/fluent-bit/systems-manager-ec2).
diff --git a/installation/aws-container.md b/installation/aws-container.md
index 89af22448..5fe227ebe 100644
--- a/installation/aws-container.md
+++ b/installation/aws-container.md
@@ -1,45 +1,47 @@
 # Containers on AWS
 
-AWS maintains a distribution of Fluent Bit combining the latest official release with a set of Go Plugins for sending logs to AWS services. AWS and Fluent Bit are working together to rewrite their plugins for inclusion in the official Fluent Bit distribution.
+AWS maintains a distribution of Fluent Bit that combines the latest official release with a set of Go Plugins for sending logs to AWS services. AWS and Fluent Bit are working together to rewrite their plugins for inclusion in the official Fluent Bit distribution.
 
 ## Plugins
 
-Currently, the [AWS for Fluent Bit](https://github.com/aws/aws-for-fluent-bit) image contains Go Plugins for:
+The [AWS for Fluent Bit](https://github.com/aws/aws-for-fluent-bit) image contains Go Plugins for:
 
-* [Amazon CloudWatch Logs](https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit)
-* [Amazon Kinesis Firehose](https://github.com/aws/amazon-kinesis-firehose-for-fluent-bit)
-* [Amazon Kinesis Streams](https://github.com/aws/amazon-kinesis-streams-for-fluent-bit)
+- Amazon CloudWatch as `cloudwatch_logs`. See the
+  [Fluent Bit docs](https://docs.fluentbit.io/manual/pipeline/outputs/cloudwatch) or the
+  [Plugin repository](https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit).
+- Amazon Kinesis Data Firehose as `kinesis_firehose`. See the
+  [Fluent Bit docs](https://docs.fluentbit.io/manual/pipeline/outputs/firehose) or the
+  [Plugin repository](https://github.com/aws/amazon-kinesis-firehose-for-fluent-bit).
+- Amazon Kinesis Data Streams as `kinesis_streams`. See the
+  [Fluent Bit docs](https://docs.fluentbit.io/manual/pipeline/outputs/kinesis) or the
+  [Plugin repository](https://github.com/aws/amazon-kinesis-streams-for-fluent-bit).
 
-Fluent Bit includes Amazon CloudWatch Logs plugin named `cloudwatch_logs`, Amazon Kinesis Firehose plugin named `kinesis_firehose` and Amazon Kinesis Data Streams plugin named `kinesis_streams` which are higher performance than Go plugins.
+These plugins are higher performance than Go plugins.
 
-* [Amazon CloudWatch](https://docs.fluentbit.io/manual/pipeline/outputs/cloudwatch)
-* [Amazon Kinesis Data Firehose](https://docs.fluentbit.io/manual/pipeline/outputs/firehose)
-* [Amazon Kinesis Data Streams](https://docs.fluentbit.io/manual/pipeline/outputs/kinesis)
+Also, Fluent Bit includes an S3 output plugin named `s3`.
 
-Also, Fluent Bit includes S3 output plugin named `s3`.
+- [Amazon S3](https://docs.fluentbit.io/manual/pipeline/outputs/s3)
 
-* [Amazon S3](https://docs.fluentbit.io/manual/pipeline/outputs/s3)
+## Versions and regional repositories
 
-## Versions and Regional Repositories
+AWS vends their container image using [Docker Hub](https://hub.docker.com/r/amazon/aws-for-fluent-bit), and a set of highly available regional Amazon ECR repositories. For more information, see the [AWS for Fluent Bit GitHub repository](https://github.com/aws/aws-for-fluent-bit#public-images).
 
-AWS vends their container image via [Docker Hub](https://hub.docker.com/r/amazon/aws-for-fluent-bit), and a set of highly available regional Amazon ECR repositories. For more information, see the [AWS for Fluent Bit GitHub repo](https://github.com/aws/aws-for-fluent-bit#public-images).
+The AWS for Fluent Bit image uses a custom versioning scheme because it contains multiple projects. To see what each release contains, see the [release notes on GitHub](https://github.com/aws/aws-for-fluent-bit/releases).
 
-The AWS for Fluent Bit image uses a custom versioning scheme because it contains multiple projects. To see what each release contains, check out the [release notes on GitHub](https://github.com/aws/aws-for-fluent-bit/releases).
+## SSM public parameters
 
-## SSM Public Parameters
-
-AWS vends SSM Public Parameters with the regional repository link for each image. These parameters can be queried by any AWS account.
+AWS vends SSM public parameters with the regional repository link for each image. These parameters can be queried by any AWS account.
 
 To see a list of available version tags in a given region, run the following command:
 
-```text
+```shell
 aws ssm get-parameters-by-path --region eu-central-1 --path /aws/service/aws-for-fluent-bit/ --query 'Parameters[*].Name'
 ```
 
 To see the ECR repository URI for a given image tag in a given region, run the following:
 
-```text
-$ aws ssm get-parameter --region ap-northeast-1 --name /aws/service/aws-for-fluent-bit/2.0.0
+```shell
+aws ssm get-parameter --region ap-northeast-1 --name /aws/service/aws-for-fluent-bit/2.0.0
 ```
 
 You can use these SSM public parameters as parameters in your CloudFormation templates:
@@ -50,5 +52,4 @@ Parameters:
     Description: Fluent Bit image for the FireLens Container
     Type: AWS::SSM::Parameter::Value<String>
     Default: /aws/service/aws-for-fluent-bit/latest
-```
-
+```
\ No newline at end of file
diff --git a/installation/buildroot-embedded-linux.md b/installation/buildroot-embedded-linux.md
index 28fdc7054..fead1adf5 100644
--- a/installation/buildroot-embedded-linux.md
+++ b/installation/buildroot-embedded-linux.md
@@ -1,24 +1,25 @@
-# Buildroot / Embedded Linux
+# Buildroot embedded Linux
 
-## Installing
+Install Fluent Bit in your embedded Linux system.
 
-To install, just select fluent-bit in your defconfig.
-See the Config.in file for all configuration options.
+## Install
 
-```defconfig
+To install, select Fluent Bit in your `defconfig`. See the `Config.in` file for all configuration options.
+
+```text
 BR2_PACKAGE_FLUENT_BIT=y
 ```
 
-## Running
+## Run
 
-The default config file is written to:
+The default configuration file is written to:
 
-```
+```text
 /etc/fluent-bit/fluent-bit.conf
 ```
 
-Fluent-bit is automatically started by the S99fluent-bit script.
+Fluent Bit is started by the `S99fluent-bit` script.
 
 ## Support
 
-All configurations with a toolchain that supports threads and dynamic library linking are supported.
+All configurations with a tool chain that supports threads and dynamic library linking are supported.
diff --git a/installation/docker.md b/installation/docker.md
index 4bfa18460..b97c1aea2 100644
--- a/installation/docker.md
+++ b/installation/docker.md
@@ -1,22 +1,101 @@
 # Docker
 
-Fluent Bit container images are available on Docker Hub ready for production usage.
-Current available images can be deployed in multiple architectures.
+Fluent Bit container images are available on Docker Hub ready for production usage. Current available images can be deployed in multiple architectures.
 
-## Quick Start
+## Start Docker
 
-Get started by simply typing the following command:
+Use the following command to start Docker with Fluent Bit:
 
 ```shell
 docker run -ti cr.fluentbit.io/fluent/fluent-bit
 ```
 
-## Tags and Versions
+### Use a configuration file
 
-The following table describes the Linux container tags that are available on Docker Hub [fluent/fluent-bit](https://hub.docker.com/r/fluent/fluent-bit/) repository:
+Use the following command to start Fluent Bit while using a configuration file:
 
-| Tag(s)       | Manifest Architectures    | Description                                                    |
+{% tabs %}
+{% tab title="fluent-bit.conf" %}
+
+```shell
+docker run -ti -v ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf \
+  cr.fluentbit.io/fluent/fluent-bit
+```
+
+{% endtab %}
+
+{% tab title="fluent-bit.yaml" %}
+
+```shell
+docker run -ti -v ./fluent-bit.yaml:/fluent-bit/etc/fluent-bit.yaml \
+  cr.fluentbit.io/fluent/fluent-bit \
+  -c /fluent-bit/etc/fluent-bit.yaml
+
+```
+
+{% endtab %}
+{% endtabs %}
+
+## Tags and versions
+
+The following table describes the Linux container tags that are available on Docker Hub [`fluent/fluent-bit`](https://hub.docker.com/r/fluent/fluent-bit/) repository:
+
+| Tags       | Manifest Architectures    | Description                                                    |
 | ------------ | ------------------------- | -------------------------------------------------------------- |
+| 4.0.6-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 4.0.6 | x86_64, arm64v8, arm32v7, s390x | Release [v4.0.6](https://fluentbit.io/announcements/v4.0.6/) |
+| 4.0.5-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 4.0.5 | x86_64, arm64v8, arm32v7, s390x | Release [v4.0.5](https://fluentbit.io/announcements/v4.0.5/) |
+| 4.0.4-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 4.0.4 | x86_64, arm64v8, arm32v7, s390x | Release [v4.0.4](https://fluentbit.io/announcements/v4.0.4/) |
+| 4.0.3-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 4.0.3 | x86_64, arm64v8, arm32v7, s390x | Release [v4.0.3](https://fluentbit.io/announcements/v4.0.3/) |
+| 4.0.1-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 4.0.1 | x86_64, arm64v8, arm32v7, s390x | Release [v4.0.1](https://fluentbit.io/announcements/v4.0.1/) |
+| 4.0.0-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 4.0.0 | x86_64, arm64v8, arm32v7, s390x | Release [v4.0.0](https://fluentbit.io/announcements/v4.0.0/) |
+| 3.2.10-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.2.10 | x86_64, arm64v8, arm32v7, s390x | Release [v3.2.10](https://fluentbit.io/announcements/v3.2.10/) |
+| 3.2.9-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.2.9 | x86_64, arm64v8, arm32v7, s390x | Release [v3.2.9](https://fluentbit.io/announcements/v3.2.9/) |
+| 3.2.8-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.2.8 | x86_64, arm64v8, arm32v7, s390x | Release [v3.2.8](https://fluentbit.io/announcements/v3.2.8/) |
+| 3.2.7-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.2.7 | x86_64, arm64v8, arm32v7, s390x | Release [v3.2.7](https://fluentbit.io/announcements/v3.2.7/) |
+| 3.2.6-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.2.6 | x86_64, arm64v8, arm32v7, s390x | Release [v3.2.6](https://fluentbit.io/announcements/v3.2.6/) |
+| 3.2.5-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.2.5 | x86_64, arm64v8, arm32v7, s390x | Release [v3.2.5](https://fluentbit.io/announcements/v3.2.5/) |
+| 3.2.4-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.2.4 | x86_64, arm64v8, arm32v7, s390x | Release [v3.2.4](https://fluentbit.io/announcements/v3.2.4/) |
+| 3.2.3-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.2.3 | x86_64, arm64v8, arm32v7, s390x | Release [v3.2.3](https://fluentbit.io/announcements/v3.2.3/) |
+| 3.2.2-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.2.2 | x86_64, arm64v8, arm32v7, s390x | Release [v3.2.2](https://fluentbit.io/announcements/v3.2.2/) |
+| 3.2.1-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.2.1 | x86_64, arm64v8, arm32v7, s390x | Release [v3.2.1](https://fluentbit.io/announcements/v3.2.1/) |
+| 3.1.10-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.1.10 | x86_64, arm64v8, arm32v7, s390x | Release [v3.1.10](https://fluentbit.io/announcements/v3.1.10/) |
+| 3.1.9-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.1.9 | x86_64, arm64v8, arm32v7, s390x | Release [v3.1.9](https://fluentbit.io/announcements/v3.1.9/) |
+| 3.1.8-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.1.8 | x86_64, arm64v8, arm32v7, s390x | Release [v3.1.8](https://fluentbit.io/announcements/v3.1.8/) |
+| 3.1.7-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.1.7 | x86_64, arm64v8, arm32v7, s390x | Release [v3.1.7](https://fluentbit.io/announcements/v3.1.7/) |
+| 3.1.6-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.1.6 | x86_64, arm64v8, arm32v7, s390x | Release [v3.1.6](https://fluentbit.io/announcements/v3.1.6/) |
+| 3.1.5-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.1.5 | x86_64, arm64v8, arm32v7, s390x | Release [v3.1.5](https://fluentbit.io/announcements/v3.1.5/) |
+| 3.1.4-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.1.4 | x86_64, arm64v8, arm32v7, s390x | Release [v3.1.4](https://fluentbit.io/announcements/v3.1.4/) |
+| 3.1.3-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.1.3 | x86_64, arm64v8, arm32v7, s390x | Release [v3.1.3](https://fluentbit.io/announcements/v3.1.3/) |
+| 3.1.2-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.1.2 | x86_64, arm64v8, arm32v7, s390x | Release [v3.1.2](https://fluentbit.io/announcements/v3.1.2/) |
+| 3.1.1-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.1.1 | x86_64, arm64v8, arm32v7, s390x | Release [v3.1.1](https://fluentbit.io/announcements/v3.1.1/) |
+| 3.1.0-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
+| 3.1.0 | x86_64, arm64v8, arm32v7, s390x | Release [v3.1.0](https://fluentbit.io/announcements/v3.1.0/) |
 | 3.0.7-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
 | 3.0.7 | x86_64, arm64v8, arm32v7, s390x | Release [v3.0.7](https://fluentbit.io/announcements/v3.0.7/) |
 | 3.0.6-debug | x86_64, arm64v8, arm32v7, s390x | Debug images |
@@ -51,75 +130,72 @@ The following table describes the Linux container tags that are available on Doc
 | 2.1.6 | x86_64, arm64v8, arm32v7 | Release [v2.1.6](https://fluentbit.io/announcements/v2.1.6/) |
 | 2.1.5 | x86_64, arm64v8, arm32v7 | Release [v2.1.5](https://fluentbit.io/announcements/v2.1.5/) |
 | 2.1.5-debug | x86_64, arm64v8, arm32v7 | Debug images |
-| 2.1.4 | x86_64, arm64v8, arm32v7 | Release [v2.1.4](https://fluentbit.io/announcements/v2.1.4/) |
-| 2.1.4-debug | x86_64, arm64v8, arm32v7 | Debug images |
 | 2.1.3 | x86_64, arm64v8, arm32v7 | Release [v2.1.3](https://fluentbit.io/announcements/v2.1.3/) |
 | 2.1.3-debug | x86_64, arm64v8, arm32v7 | Debug images |
 | 2.1.2 | x86_64, arm64v8, arm32v7 | Release [v2.1.2](https://fluentbit.io/announcements/v2.1.2/) |
 | 2.1.2-debug | x86_64, arm64v8, arm32v7 | Debug images |
-| 2.1.1        | x86\_64, arm64v8, arm32v7 | Release [v2.1.1](https://fluentbit.io/announcements/v2.1.1/)   |
-| 2.1.1-debug  | x86\_64, arm64v8, arm32v7 | v2.1.x releases (production + debug)                           |
-| 2.1.0        | x86\_64, arm64v8, arm32v7 | Release [v2.1.0](https://fluentbit.io/announcements/v2.1.0/)   |
-| 2.1.0-debug  | x86\_64, arm64v8, arm32v7 | v2.1.x releases (production + debug)                           |
-| 2.0.11       | x86\_64, arm64v8, arm32v7 | Release [v2.0.11](https://fluentbit.io/announcements/v2.0.11/) |
-| 2.0.11-debug | x86\_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                           |
-| 2.0.10       | x86\_64, arm64v8, arm32v7 | Release [v2.0.10](https://fluentbit.io/announcements/v2.0.10/) |
-| 2.0.10-debug | x86\_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                           |
-| 2.0.9       | x86\_64, arm64v8, arm32v7 | Release [v2.0.9](https://fluentbit.io/announcements/v2.0.9/) |
-| 2.0.9-debug | x86\_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
-| 2.0.8       | x86\_64, arm64v8, arm32v7 | Release [v2.0.8](https://fluentbit.io/announcements/v2.0.8/) |
-| 2.0.8-debug | x86\_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
-| 2.0.6       | x86\_64, arm64v8, arm32v7 | Release [v2.0.6](https://fluentbit.io/announcements/v2.0.6/) |
-| 2.0.6-debug | x86\_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
-| 2.0.5       | x86\_64, arm64v8, arm32v7 | Release [v2.0.5](https://fluentbit.io/announcements/v2.0.5/) |
-| 2.0.5-debug | x86\_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
-| 2.0.4       | x86\_64, arm64v8, arm32v7 | Release [v2.0.4](https://fluentbit.io/announcements/v2.0.4/) |
-| 2.0.4-debug | x86\_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
-| 2.0.3       | x86\_64, arm64v8, arm32v7 | Release [v2.0.3](https://fluentbit.io/announcements/v2.0.3/) |
-| 2.0.3-debug | x86\_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
-| 2.0.2       | x86\_64, arm64v8, arm32v7 | Release [v2.0.2](https://fluentbit.io/announcements/v2.0.2/) |
-| 2.0.2-debug | x86\_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
-| 2.0.1       | x86\_64, arm64v8, arm32v7 | Release [v2.0.1](https://fluentbit.io/announcements/v2.0.1/) |
-| 2.0.1-debug | x86\_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
-| 2.0.0       | x86\_64, arm64v8, arm32v7 | Release [v2.0.0](https://fluentbit.io/announcements/v2.0.0/) |
-| 2.0.0-debug | x86\_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
-| 1.9.9       | x86\_64, arm64v8, arm32v7 | Release [v1.9.9](https://fluentbit.io/announcements/v1.9.9/) |
-| 1.9.9-debug | x86\_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
-| 1.9.8       | x86\_64, arm64v8, arm32v7 | Release [v1.9.8](https://fluentbit.io/announcements/v1.9.8/) |
-| 1.9.8-debug | x86\_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
-| 1.9.7       | x86\_64, arm64v8, arm32v7 | Release [v1.9.7](https://fluentbit.io/announcements/v1.9.7/) |
-| 1.9.7-debug | x86\_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
-| 1.9.6       | x86\_64, arm64v8, arm32v7 | Release [v1.9.6](https://fluentbit.io/announcements/v1.9.6/) |
-| 1.9.6-debug | x86\_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
-| 1.9.5       | x86\_64, arm64v8, arm32v7 | Release [v1.9.5](https://fluentbit.io/announcements/v1.9.5/) |
-| 1.9.5-debug | x86\_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
-| 1.9.4       | x86\_64, arm64v8, arm32v7 | Release [v1.9.4](https://fluentbit.io/announcements/v1.9.4/) |
-| 1.9.4-debug | x86\_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
-| 1.9.3       | x86\_64, arm64v8, arm32v7 | Release [v1.9.3](https://fluentbit.io/announcements/v1.9.3/) |
-| 1.9.3-debug | x86\_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
-| 1.9.2       | x86\_64, arm64v8, arm32v7 | Release [v1.9.2](https://fluentbit.io/announcements/v1.9.2/) |
-| 1.9.2-debug | x86\_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
-| 1.9.1       | x86\_64, arm64v8, arm32v7 | Release [v1.9.1](https://fluentbit.io/announcements/v1.9.1/) |
-| 1.9.1-debug | x86\_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
-| 1.9.0       | x86\_64, arm64v8, arm32v7 | Release [v1.9.0](https://fluentbit.io/announcements/v1.9.0/) |
-| 1.9.0-debug | x86\_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
-
-It is strongly suggested that you always use the latest image of Fluent Bit.
-
-Windows container images are provided from v2.0.6 for Windows Server 2019 and Windows Server 2022.
-These can be found as tags on the same Docker Hub registry above.
-
-## Multi Architecture Images
-
-Our production stable images are based on [Distroless](https://github.com/GoogleContainerTools/distroless) focusing on security containing just the Fluent Bit binary and minimal system libraries and basic configuration.
-We also provide **debug** images for all architectures (from 1.9.0+) which contain a full (Debian) shell and package manager that can be used to troubleshoot or for testing purposes.
-
-From a deployment perspective, there is no need to specify an architecture, the container client tool that pulls the image gets the proper layer for the running architecture.
+| 2.1.1        | x86_64, arm64v8, arm32v7 | Release [v2.1.1](https://fluentbit.io/announcements/v2.1.1/)   |
+| 2.1.1-debug  | x86_64, arm64v8, arm32v7 | v2.1.x releases (production + debug)                           |
+| 2.1.0        | x86_64, arm64v8, arm32v7 | Release [v2.1.0](https://fluentbit.io/announcements/v2.1.0/)   |
+| 2.1.0-debug  | x86_64, arm64v8, arm32v7 | v2.1.x releases (production + debug)                           |
+| 2.0.11       | x86_64, arm64v8, arm32v7 | Release [v2.0.11](https://fluentbit.io/announcements/v2.0.11/) |
+| 2.0.11-debug | x86_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                           |
+| 2.0.10       | x86_64, arm64v8, arm32v7 | Release [v2.0.10](https://fluentbit.io/announcements/v2.0.10/) |
+| 2.0.10-debug | x86_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                           |
+| 2.0.9       | x86_64, arm64v8, arm32v7 | Release [v2.0.9](https://fluentbit.io/announcements/v2.0.9/) |
+| 2.0.9-debug | x86_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
+| 2.0.8       | x86_64, arm64v8, arm32v7 | Release [v2.0.8](https://fluentbit.io/announcements/v2.0.8/) |
+| 2.0.8-debug | x86_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
+| 2.0.6       | x86_64, arm64v8, arm32v7 | Release [v2.0.6](https://fluentbit.io/announcements/v2.0.6/) |
+| 2.0.6-debug | x86_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
+| 2.0.5       | x86_64, arm64v8, arm32v7 | Release [v2.0.5](https://fluentbit.io/announcements/v2.0.5/) |
+| 2.0.5-debug | x86_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
+| 2.0.4       | x86_64, arm64v8, arm32v7 | Release [v2.0.4](https://fluentbit.io/announcements/v2.0.4/) |
+| 2.0.4-debug | x86_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
+| 2.0.3       | x86_64, arm64v8, arm32v7 | Release [v2.0.3](https://fluentbit.io/announcements/v2.0.3/) |
+| 2.0.3-debug | x86_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
+| 2.0.2       | x86_64, arm64v8, arm32v7 | Release [v2.0.2](https://fluentbit.io/announcements/v2.0.2/) |
+| 2.0.2-debug | x86_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
+| 2.0.1       | x86_64, arm64v8, arm32v7 | Release [v2.0.1](https://fluentbit.io/announcements/v2.0.1/) |
+| 2.0.1-debug | x86_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
+| 2.0.0       | x86_64, arm64v8, arm32v7 | Release [v2.0.0](https://fluentbit.io/announcements/v2.0.0/) |
+| 2.0.0-debug | x86_64, arm64v8, arm32v7 | v2.0.x releases (production + debug)                         |
+| 1.9.9       | x86_64, arm64v8, arm32v7 | Release [v1.9.9](https://fluentbit.io/announcements/v1.9.9/) |
+| 1.9.9-debug | x86_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
+| 1.9.8       | x86_64, arm64v8, arm32v7 | Release [v1.9.8](https://fluentbit.io/announcements/v1.9.8/) |
+| 1.9.8-debug | x86_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
+| 1.9.7       | x86_64, arm64v8, arm32v7 | Release [v1.9.7](https://fluentbit.io/announcements/v1.9.7/) |
+| 1.9.7-debug | x86_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
+| 1.9.6       | x86_64, arm64v8, arm32v7 | Release [v1.9.6](https://fluentbit.io/announcements/v1.9.6/) |
+| 1.9.6-debug | x86_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
+| 1.9.5       | x86_64, arm64v8, arm32v7 | Release [v1.9.5](https://fluentbit.io/announcements/v1.9.5/) |
+| 1.9.5-debug | x86_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
+| 1.9.4       | x86_64, arm64v8, arm32v7 | Release [v1.9.4](https://fluentbit.io/announcements/v1.9.4/) |
+| 1.9.4-debug | x86_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
+| 1.9.3       | x86_64, arm64v8, arm32v7 | Release [v1.9.3](https://fluentbit.io/announcements/v1.9.3/) |
+| 1.9.3-debug | x86_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
+| 1.9.2       | x86_64, arm64v8, arm32v7 | Release [v1.9.2](https://fluentbit.io/announcements/v1.9.2/) |
+| 1.9.2-debug | x86_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
+| 1.9.1       | x86_64, arm64v8, arm32v7 | Release [v1.9.1](https://fluentbit.io/announcements/v1.9.1/) |
+| 1.9.1-debug | x86_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
+| 1.9.0       | x86_64, arm64v8, arm32v7 | Release [v1.9.0](https://fluentbit.io/announcements/v1.9.0/) |
+| 1.9.0-debug | x86_64, arm64v8, arm32v7 | v1.9.x releases (production + debug)                         |
+
+It's strongly suggested that you always use the latest image of Fluent Bit.
+
+Container images for Windows Server 2019 and Windows Server 2022 are provided for v2.0.6 and later. These can be found as tags on the same Docker Hub registry.
+
+## Multi-architecture images
+
+Fluent Bit production stable images are based on [Distroless](https://github.com/GoogleContainerTools/distroless). Focusing on security, these images contain only the Fluent Bit binary and minimal system libraries and basic configuration.
+
+Debug images are available for all architectures (for 1.9.0 and later), and contain a full Debian shell and package manager that can be used to troubleshoot or for testing purposes.
+
+From a deployment perspective, there's no need to specify an architecture. The container client tool that pulls the image gets the proper layer for the running architecture.
 
 ## Verify signed container images
 
-1.9 and 2.0 container images are signed using Cosign/Sigstore.
-These signatures can be verified using `cosign` ([install guide](https://docs.sigstore.dev/cosign/installation/)):
+Version 1.9 and 2.0 container images are signed using Cosign/Sigstore. Verify these signatures using `cosign` ([install guide](https://docs.sigstore.dev/quickstart/quickstart-cosign/)):
 
 ```shell
 $ cosign verify --key "https://packages.fluentbit.io/fluentbit-cosign.pub" fluent/fluent-bit:2.0.6
@@ -132,83 +208,80 @@ The following checks were performed on each of these signatures:
 [{"critical":{"identity":{"docker-reference":"index.docker.io/fluent/fluent-bit"},"image":{"docker-manifest-digest":"sha256:c740f90b07f42823d4ecf4d5e168f32ffb4b8bcd87bc41df8f5e3d14e8272903"},"type":"cosign container image signature"},"optional":{"release":"2.0.6","repo":"fluent/fluent-bit","workflow":"Release from staging"}}]
 ```
 
-Note: replace `cosign` above with the binary installed if it has a different name (e.g. `cosign-linux-amd64`).
+Replace `cosign` with the binary installed if it has a different name (for example, `cosign-linux-amd64`).
 
-Keyless signing is also provided but this is still experimental:
+Keyless signing is also provided but is still experimental:
 
 ```shell
 COSIGN_EXPERIMENTAL=1 cosign verify fluent/fluent-bit:2.0.6
 ```
 
-Note: `COSIGN_EXPERIMENTAL=1` is used to allow verification of images signed in KEYLESS mode.
-To learn more about keyless signing, please refer to [Keyless Signatures](https://github.com/sigstore/cosign/blob/main/KEYLESS.md#keyless-signatures).
+`COSIGN_EXPERIMENTAL=1` is used to allow verification of images signed in keyless mode. To learn more about keyless signing, see the [Sigstore keyless signature](https://docs.sigstore.dev/cosign/signing/overview/) documentation.
 
-## Getting Started
+## Get started
 
-Download the last stable image from 2.0 series:
+1. Download the last stable image from 2.0 series:
 
-```shell
-docker pull cr.fluentbit.io/fluent/fluent-bit:2.0
-```
+   ```shell
+   docker pull cr.fluentbit.io/fluent/fluent-bit:2.0
+   ```
 
-Once the image is in place, now run the following (useless) test which makes Fluent Bit measure CPU usage by the container:
+1. After the image is in place, run the following test which makes Fluent Bit measure CPU usage by the container:
 
-```shell
-docker run -ti cr.fluentbit.io/fluent/fluent-bit:2.0 \
-  -i cpu -o stdout -f 1
-```
+   ```shell
+   docker run -ti cr.fluentbit.io/fluent/fluent-bit:2.0 \
+     -i cpu -o stdout -f 1
+   ```
 
-That command will let Fluent Bit measure CPU usage every second and flush the results to the standard output, e.g:
+That command lets Fluent Bit measure CPU usage every second and flushes the results
+to the standard output. For example:
 
 ```shell
 [2019/10/01 12:29:02] [ info] [engine] started
 [0] cpu.0: [1504290543.000487750, {"cpu_p"=>0.750000, "user_p"=>0.250000, "system_p"=>0.500000, "cpu0.p_cpu"=>0.000000, "cpu0.p_user"=>0.000000, "cpu0.p_system"=>0.000000, "cpu1.p_cpu"=>1.000000, "cpu1.p_user"=>0.000000, "cpu1.p_system"=>1.000000, "cpu2.p_cpu"=>1.000000, "cpu2.p_user"=>1.000000, "cpu2.p_system"=>0.000000, "cpu3.p_cpu"=>0.000000, "cpu3.p_user"=>0.000000, "cpu3.p_system"=>0.000000}]
 ```
 
-## F.A.Q
-
-### Why there is no Fluent Bit Docker image based on Alpine Linux ?
-
-Alpine Linux uses Musl C library instead of Glibc. Musl is not fully compatible with Glibc which generated many issues in the following areas when used with Fluent Bit:
+## FAQ
 
-* Memory Allocator: to run Fluent Bit properly in high-load environments, we use Jemalloc as a default memory allocator which reduce fragmentation and provides better performance for our needs. Jemalloc cannot run smoothly with Musl and requires extra work.
-* Alpine Linux Musl functions bootstrap have a compatibility issue when loading Golang shared libraries, this generate problems when trying to load Golang output plugins in Fluent Bit.
-* Alpine Linux Musl Time format parser does not support Glibc extensions
-* Maintainers preference in terms of base image due to security and maintenance reasons are Distroless and Debian.
+### Why there is no Fluent Bit Docker image based on Alpine Linux?
 
-### Why use distroless containers ?
+Alpine Linux uses Musl C library instead of Glibc. Musl isn't fully compatible with Glibc, which generated many issues in the following areas when used with Fluent Bit:
 
-Briefly tackled in a [blog post](https://calyptia.com/2022/01/26/all-your-arch-are-belong-to-us/#security) which links out to the following possibly opposing views:
+- Memory Allocator: To run properly in high-load environments, Fluent Bit uses Jemalloc as a default memory allocator which reduces fragmentation and provides better performance. Jemalloc can't run smoothly with Musl and requires extra work.
+- Alpine Linux Musl functions bootstrap have a compatibility issue when loading Golang shared libraries. This causes problems when trying to load Golang output plugins in Fluent Bit.
+- Alpine Linux Musl Time format parser doesn't support Glibc extensions.
+- The Fluent Bit maintainers' preference for base images are Distroless and Debian for security and maintenance reasons.
 
-* <https://hackernoon.com/distroless-containers-hype-or-true-value-2rfl3wat>
-* <https://www.redhat.com/en/blog/why-distroless-containers-arent-security-solution-you-think-they-are>
+### Why use distroless containers?
 
-The reasons for using Distroless are fairly well covered here: <https://github.com/GoogleContainerTools/distroless#why-should-i-use-distroless-images>
+The reasons for using distroless are well covered in
+[Why should I use Distroless images?](https://github.com/GoogleContainerTools/distroless#why-should-i-use-distroless-images).
 
-* Only include what you need, reduce the attack surface available.
-* Reduces size so improves perfomance as well.
-* Reduces false positives on scans (and reduces resources required for scanning).
-* Reduces supply chain security requirements to just what you need.
-* Helps prevent unauthorised processes or users interacting with the container.
-* Less need to harden the container (and container runtime, K8S, etc.).
-* Faster CICD processes.
+- Include only what you need, reduce the attack surface available.
+- Reduces size and improves performance.
+- 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).
+- Faster CI/CD processes.
 
-With any choice of course there are downsides:
+With any choice, there are downsides:
 
-* No shell or package manager to update/add things.
-  * Generally though dynamic updating is a bad idea in containers as the time it is done affects the outcome: two containers started at different times using the same base image may perform differently or get different dependencies, etc.
-  * A better approach is to rebuild a new image version but then you can do this with Distroless, however it is harder requiring multistage builds or similar to provide the new dependencies.
-* Debugging can be harder.
-  * More specifically you need applications set up to properly expose information for debugging rather than rely on traditional debug approaches of connecting to processes or dumping memory. This can be an upfront cost vs a runtime cost but does shift left in the development process so hopefully is a reduction overall.
-* Assumption that Distroless is secure: nothing is secure (just more or less secure) and there are still exploits so it does not remove the need for securing your system.
-* Sometimes you need to use a common base image, e.g. with audit/security/health/etc. hooks integrated, or common base tooling (this could still be Distroless though).
+- No shell or package manager to update or add things.
+  - Generally, dynamic updating is a bad idea in containers as the time it's done affects the outcome: two containers started at different times using the same base image can perform differently or get different dependencies.
+  - A better approach is to rebuild a new image version. You can do this with Distroless, but it's harder and requires multistage builds or similar to provide the new dependencies.
+- Debugging can be harder.
+  - More specifically you need applications set up to properly expose information for debugging rather than rely on traditional debug approaches of connecting to processes or dumping memory. This can be an upfront cost versus a runtime cost but does shift left in the development process so hopefully is a reduction overall.
+- Assumption that Distroless is secure: nothing is secure and there are still exploits so it doesn't remove the need for securing your system.
+- Sometimes you need to use a common base image, such as with audits, security, health, and so on.
 
-One other important thing to note is that `exec`'ing into a container will potentially impact resource limits.
+Using `exec` to access a container will potentially impact resource limits.
 
-For debugging, debug containers are available now in K8S: <https://kubernetes.io/docs/tasks/debug/debug-application/debug-running-pod/#ephemeral-container>
+For debugging, debug containers are available now in K8S:
+<https://kubernetes.io/docs/tasks/debug/debug-application/debug-running-pod/#ephemeral-container>
 
-* This can be a quite different container from the one you want to investigate (e.g. lots of extra tools or even a different base).
-* No resource limits applied to this container - can be good or bad.
-* Runs in pod namespaces, just another container that can access everything the others can.
-* May need architecture of the pod to share volumes, etc.
-* Requires more recent versions of K8S and the container runtime plus RBAC allowing it.
+- This can be a significantly different container from the one you want to investigate, with lots of extra tools or even a different base.
+- No resource limits applied to this container, which can be good or bad.
+- Runs in pod namespaces. It's another container that can access everything the others can.
+- Might need architecture of the pod to share volumes or other information.
+- Requires more recent versions of K8S and the container runtime plus RBAC allowing it.
diff --git a/installation/getting-started-with-fluent-bit.md b/installation/getting-started-with-fluent-bit.md
index 04354dcff..f7bcad2fd 100644
--- a/installation/getting-started-with-fluent-bit.md
+++ b/installation/getting-started-with-fluent-bit.md
@@ -1,21 +1,22 @@
 ---
-description: The following serves as a guide on how to install/deploy/upgrade Fluent Bit
+description: A guide on how to install, deploy, and upgrade Fluent Bit
 ---
+# Get started with Fluent Bit
 
-# Getting Started with Fluent Bit
+<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=e9732f9c-44a4-46d3-ab87-86138455c698" />
 
-## Container Deployment
+## Container deployment
 
-| Deployment Type   | Instructions                                       |
+| Deployment Type   | Instructions |
 | ----------------- | -------------------------------------------------- |
 | Kubernetes        | [Deploy on Kubernetes](kubernetes.md#installation) |
 | Docker            | [Deploy with Docker](docker.md)                    |
 | Containers on AWS | [Deploy on Containers on AWS](aws-container.md)    |
 
-## Install on Linux (Packages)
+## Install on Linux (packages)
 
-| Operating System       | Installation  Instructions |
-| ---------------------- | -------------------------- |
+| Operating System       | Installation instructions |
+| ---------------------- | ------------------------- |
 | CentOS / Red Hat       | [CentOS 7](linux/redhat-centos.md#install-on-redhat-centos), [CentOS 8](linux/redhat-centos.md#install-on-redhat-centos), [CentOS 9 Stream](linux/redhat-centos.md#install-on-redhat-centos) |
 | Ubuntu                 | [Ubuntu 16.04 LTS](linux/ubuntu.md), [Ubuntu 18.04 LTS](linux/ubuntu.md), [Ubuntu 20.04 LTS](linux/ubuntu.md), [Ubuntu 22.04 LTS](linux/ubuntu.md) |
 | Debian                 | [Debian 10](linux/debian.md), [Debian 11](linux/debian.md), [Debian 12](linux/debian.md) |
@@ -24,38 +25,35 @@ description: The following serves as a guide on how to install/deploy/upgrade Fl
 | Yocto / Embedded Linux | [Yocto / Embedded Linux](yocto-embedded-linux.md#fluent-bit-and-other-architectures) |
 | Buildroot / Embedded Linux | [Buildroot / Embedded Linux](buildroot-embedded-linux.md) |
 
-## Install on Windows (Packages)
+## Install on Windows (packages)
 
-| Operating System    | Installation Instructions                                                                                                    |
-| ------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
-| Windows Server 2019 | [Windows Server EXE](windows.md#installing-from-exe-installer), [Windows Server ZIP](windows.md#installing-from-zip-archive) |
-| Windows 10 2019.03  | [Windows EXE](windows.md#installing-from-exe-installer), [Windows ZIP](windows.md#installing-from-zip-archive)               |
+| Operating System    | Installation instructions |
+| ------------------- | ------------------------- |
+| Windows Server 2019 | [Windows Server `EXE`](windows.md#installing-from-exe-installer), [Windows Server ZIP](windows.md#installing-from-zip-archive) |
+| Windows 10 2019.03  | [Windows `EXE`](windows.md#installing-from-exe-installer), [Windows ZIP](windows.md#installing-from-zip-archive)               |
 
-## Install on macOS (Packages)
+## Install on macOS (packages)
 
-| Operating System    | Installation Instructions                     |
+| Operating System    | Installation instructions                     |
 | ------------------- | --------------------------------------------- |
 | macOS               | [Homebrew](macos.md#installing-from-homebrew) |
 
-## Compile from Source (Linux, Windows, FreeBSD, macOS)
+## Compile from source (Linux, Windows, FreeBSD, macOS)
 
-| Operating System | Installation Instructions                                   |
+| Operating system | Installation instructions                                   |
 | ---------------- | ----------------------------------------------------------- |
 | Linux, FreeBSD   | [Compile from source](sources/build-and-install.md)         |
 | macOS            | [Compile from source](macos.md#compile-from-source) |
 | Windows          | [Compile from Source](windows.md#compile-from-source)       |
 
-## Sandbox Environment
+## Sandbox environment
 
-If you are interested in learning about Fluent Bit you can try out the sandbox environment
+If you are interested in learning about Fluent Bit you can try out the sandbox environment:
 
 {% embed url="https://play.instruqt.com/embed/Fluent/tracks/fluent-bit-getting-started-101?token=em_S2zOzhhDQepM0vDS" %}
-Fluent Bit Sandbox Environment
+Fluent Bit sandbox environment
 {% endembed %}
 
-## Enterprise Packages
+## Enterprise packages
 
 Fluent Bit packages are also provided by [enterprise providers](https://fluentbit.io/enterprise) for older end of life versions, Unix systems, and additional support and features including aspects like CVE backporting.
-A list provided by fluentbit.io/enterprise is provided below
-
-* [Calyptia Fluent Bit LTS](https://calyptia.com/products/lts-fluentbit/)
diff --git a/installation/kubernetes.md b/installation/kubernetes.md
index e417d285f..5c21fd9bf 100644
--- a/installation/kubernetes.md
+++ b/installation/kubernetes.md
@@ -4,95 +4,81 @@ description: Kubernetes Production Grade Log Processor
 
 # Kubernetes
 
-![](<../.gitbook/assets/fluentbit\_kube\_logging (1).png>)
+[Fluent Bit](http://fluentbit.io) is a lightweight and extensible log processor with full support for Kubernetes:
 
-[Fluent Bit](http://fluentbit.io) is a lightweight and extensible **Log Processor** that comes with full support for Kubernetes:
+- Process Kubernetes containers logs from the file system or Systemd/Journald.
+- Enrich logs with Kubernetes Metadata.
+- Centralize your logs in third party storage services like Elasticsearch, InfluxDB, HTTP, and so on.
 
-* Process Kubernetes containers logs from the file system or Systemd/Journald.
-* Enrich logs with Kubernetes Metadata.
-* Centralize your logs in third party storage services like Elasticsearch, InfluxDB, HTTP, etc.
+## Concepts
 
-## Concepts <a href="#concepts" id="concepts"></a>
+Before getting started it's important to understand how Fluent Bit will be deployed. Kubernetes manages a cluster of nodes. The Fluent Bit log agent tool needs to run on every node to collect logs from every pod. Fluent Bit is deployed as a DaemonSet, which is a pod that runs on every node of the cluster.
 
-Before getting started it is important to understand how Fluent Bit will be deployed. Kubernetes manages a cluster of _nodes_, so our log agent tool will need to run on every node to collect logs from every _POD_, hence Fluent Bit is deployed as a DaemonSet (a POD that runs on every _node_ of the cluster).
+When Fluent Bit runs, it reads, parses, and filters the logs of every pod. In addition, Fluent Bit adds metadata to each entry using the [Kubernetes](https://docs.fluentbit.io/manual/pipeline/filters/kubernetes) filter plugin.
 
-When Fluent Bit runs, it will read, parse and filter the logs of every POD and will enrich each entry with the following information (metadata):
+The Kubernetes filter plugin talks to the Kubernetes API Server to retrieve relevant information such as the `pod_id`, `labels`, and `annotations`. Other fields, such as `pod_name`, `container_id`, and `container_name`, are retrieved locally from the log file names. All of this is handled automatically, and no intervention is required from a configuration aspect.
 
-* Pod Name
-* Pod ID
-* Container Name
-* Container ID
-* Labels
-* Annotations
+## Installation
 
-To obtain this information, a built-in filter plugin called _kubernetes_ talks to the Kubernetes API Server to retrieve relevant information such as the _pod\_id_, _labels_ and _annotations_, other fields such as _pod\_name_, _container\_id_ and _container\_name_ are retrieved locally from the log file names. All of this is handled automatically, no intervention is required from a configuration aspect.
+Fluent Bit should be deployed as a DaemonSet, so it will be available on every node of your Kubernetes cluster.
 
-> Our Kubernetes Filter plugin is fully inspired by the [Fluentd Kubernetes Metadata Filter](https://github.com/fabric8io/fluent-plugin-kubernetes\_metadata\_filter) written by [Jimmi Dyson](https://github.com/jimmidyson).
+The recommended way to deploy Fluent Bit for Kubernetes is with the official [Helm Chart](https://github.com/fluent/helm-charts).
 
-## Installation <a href="#installation" id="installation"></a>
+### OpenShift
 
-[Fluent Bit](http://fluentbit.io) should be deployed as a DaemonSet, so it will be available on every node of your Kubernetes cluster.
+If you are using Red Hat OpenShift you must set up Security Context Constraints (SCC) using the relevant option in the helm chart.
 
-The recommended way to deploy Fluent Bit is with the official Helm Chart: <https://github.com/fluent/helm-charts>
+### Installing with Helm chart
 
-### Note for OpenShift
+[Helm](https://helm.sh) is a package manager for Kubernetes and lets you deploy application packages into your running cluster. Fluent Bit is distributed using a Helm chart found in the [Fluent Helm Charts repository](https://github.com/fluent/helm-charts).
 
-If you are using Red Hat OpenShift you will also need to set up security context constraints (SCC) using the relevant option in the helm chart.
-
-### Installing with Helm Chart
-
-[Helm](https://helm.sh) is a package manager for Kubernetes and allows you to quickly deploy application packages into your running cluster. Fluent Bit is distributed via a helm chart found in the Fluent Helm Charts repo: [https://github.com/fluent/helm-charts](https://github.com/fluent/helm-charts).
-
-To add the Fluent Helm Charts repo use the following command
+Use the following command to add the Fluent Helm charts repository
 
 ```shell
 helm repo add fluent https://fluent.github.io/helm-charts
 ```
 
-To validate that the repo was added you can run `helm search repo fluent` to ensure the charts were added. The default chart can then be installed by running the following
+To validate that the repository was added, run `helm search repo fluent` to ensure the charts were added. The default chart can then be installed by running the following command:
 
 ```shell
 helm upgrade --install fluent-bit fluent/fluent-bit
 ```
 
-### Default Values
+### Default values
 
-The default chart values include configuration to read container logs, with Docker parsing, systemd logs apply Kubernetes metadata enrichment and finally output to an Elasticsearch cluster. You can modify the values file included [https://github.com/fluent/helm-charts/blob/master/charts/fluent-bit/values.yaml](https://github.com/fluent/helm-charts/blob/master/charts/fluent-bit/values.yaml) to specify additional outputs, health checks, monitoring endpoints, or other configuration options.
+The default chart values include configuration to read container logs. With Docker parsing, Systemd logs apply Kubernetes metadata enrichment, and output to an Elasticsearch cluster. You can modify the [included values file](https://github.com/fluent/helm-charts/blob/master/charts/fluent-bit/values.yaml) to specify additional outputs, health checks, monitoring endpoints, or other configuration options.
 
 ## Details
 
-The default configuration of Fluent Bit makes sure of the following:
+The default configuration of Fluent Bit ensures the following:
 
-* Consume all containers logs from the running Node and parse them with either the `docker` or `cri` multiline parser.
-* Persist how far it got into each file it is tailing so if a pod is restarted it picks up from where it left off.
-* The Kubernetes filter will enrich the logs with Kubernetes metadata, specifically _labels_ and _annotations_. The filter only goes to the API Server when it cannot find the cached info, otherwise it uses the cache.
-* The default backend in the configuration is Elasticsearch set by the [Elasticsearch Output Plugin](../pipeline/outputs/elasticsearch.md). It uses the Logstash format to ingest the logs. If you need a different Index and Type, please refer to the plugin option and do your own adjustments.
-* There is an option called **Retry\_Limit** set to False, that means if Fluent Bit cannot flush the records to Elasticsearch it will re-try indefinitely until it succeed.
+- Consume all containers logs from the running node and parse them with either the `docker` or `cri` multi-line parser.
+- Persist how far it got into each file it's tailing so if a pod is restarted it picks up from where it left off.
+- The Kubernetes filter adds Kubernetes metadata, specifically `labels` and `annotations`. The filter only contacts the API Server when it can't find the cached information, otherwise it uses the cache.
+- The default backend in the configuration is Elasticsearch set by the [Elasticsearch Output Plugin](../pipeline/outputs/elasticsearch.md). It uses the Logstash format to ingest the logs. If you need a different `Index` and `Type`, refer to the plugin option and update as needed.
+- There is an option called `Retry_Limit`, which is set to `False`. If Fluent Bit can't flush the records to Elasticsearch, it will retry indefinitely until it succeeds.
 
-## Windows Deployment
+## Windows deployment
 
-Since v1.5.0, Fluent Bit supports deployment to Windows pods.
+Fluent Bit v1.5.0 and later supports deployment to Windows pods.
 
 ### Log files overview
 
 When deploying Fluent Bit to Kubernetes, there are three log files that you need to pay attention to.
 
-`C:\k\kubelet.err.log`
+- `C:\k\kubelet.err.log`
 
-* This is the error log file from kubelet daemon running on host.
-* You will need to retain this file for future troubleshooting (to debug deployment failures etc.)
+  This is the error log file from kubelet daemon running on host. Retain this file for future troubleshooting, including debugging deployment failures.
 
-`C:\var\log\containers\<pod>_<namespace>_<container>-<docker>.log`
+- `C:\var\log\containers\<pod>_<namespace>_<container>-<docker>.log`
 
-* This is the main log file you need to watch. Configure Fluent Bit to follow this file.
-* It is actually a symlink to the Docker log file in `C:\ProgramData\`, with some additional metadata on its file name.
+  This is the main log file you need to watch. Configure Fluent Bit to follow this file. It's a symlink to the Docker log file in `C:\ProgramData\`, with some additional metadata on the file's name.
 
-`C:\ProgramData\Docker\containers\<docker>\<docker>.log`
+- `C:\ProgramData\Docker\containers\<docker>\<docker>.log`
 
-* This is the log file produced by Docker.
-* Normally you don't directly read from this file, but you need to make sure that this file is visible from Fluent Bit.
+  This is the log file produced by Docker. Normally you don't directly read from this file, but you need to make sure that this file is visible from Fluent Bit.
 
-Typically, your deployment yaml contains the following volume configuration.
+Typically, your deployment YAML contains the following volume configuration.
 
 ```yaml
 spec:
@@ -120,9 +106,49 @@ spec:
 
 ### Configure Fluent Bit
 
-Assuming the basic volume configuration described above, you can apply the following config to start logging. You can visualize this configuration [here (Sign-up required)](https://calyptia.com/free-trial)
+Assuming the basic volume configuration described previously, you can apply one of the following configurations to start logging:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
 ```yaml
+parsers:
+    - name: docker
+      format: json
+      time_key: time
+      time_format: '%Y-%m-%dT%H:%M:%S.%L'
+      time_keep: true
+
+pipeline:
+    inputs:
+        - name: tail
+          tag: kube.*
+          path: 'C:\\var\\log\\containers\\*.log'
+          parser: docker
+          db: 'C:\\fluent-bit\\tail_docker.db'
+          mem_buf_limit: 7MB
+          refresh_interval: 10
+
+        - name: tail
+          tag: kube.error
+          path: 'C:\\k\\kubelet.err.log'
+          db: 'C:\\fluent-bit\\tail_kubelet.db'
+
+    filters:
+        - name: kubernetes
+          match: kube.*
+          kube_url: 'https://kubernetes.default.svc.cluster.local:443'
+
+    outputs:
+        - name: stdout
+          match: '*'
+```
+
+{% endtab %}
+
+{% tab title="fluent-bit.conf" %}
+
+```text
 fluent-bit.conf: |
     [SERVICE]
       Parsers_File      C:\\fluent-bit\\parsers.conf
@@ -160,19 +186,40 @@ parsers.conf: |
         Time_Keep    On
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ### Mitigate unstable network on Windows pods
 
 Windows pods often lack working DNS immediately after boot ([#78479](https://github.com/kubernetes/kubernetes/issues/78479)). To mitigate this issue, `filter_kubernetes` provides a built-in mechanism to wait until the network starts up:
 
-* `DNS_Retries` - Retries N times until the network start working (6)
-* `DNS_Wait_Time` - Lookup interval between network status checks (30)
+- `DNS_Retries`: Retries N times until the network start working (6)
+- `DNS_Wait_Time`: Lookup interval between network status checks (30)
+
+By default, Fluent Bit waits for three minutes (30 seconds x 6 times). If it's not enough for you, update the configuration as follows:
 
-By default, Fluent Bit waits for 3 minutes (30 seconds x 6 times). If it's not enough for you, tweak the configuration as follows.
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
+```yaml
+    filters:
+        - name: kubernetes
+          ...
+          dns_retries: 10
+          dns_wait_time: 30
 ```
+
+{% endtab %}
+
+{% tab title="fluent-bit.conf" %}
+
+```text
 [filter]
     Name kubernetes
     ...
     DNS_Retries 10
     DNS_Wait_Time 30
 ```
+
+% endtab %}
+{% endtabs %}
diff --git a/installation/linux/README.md b/installation/linux/README.md
index d84f58865..7aac3e7e0 100644
--- a/installation/linux/README.md
+++ b/installation/linux/README.md
@@ -1,19 +1,18 @@
-# Linux Packages
+# Linux packages
 
 The most secure option is to create the repositories according to the instructions for your specific OS.
 
-A simple installation script is provided to be used for most Linux targets.
-This will by default install the most recent version released.
+An installation script is provided for use with most Linux targets. This will by default install the most recent version released.
 
 ```bash
 curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
 ```
 
-This is purely a convenience helper and should always be validated prior to use.
+This is a helper and should always be validated prior to use.
 
 ## GPG key updates
 
-From the 1.9.0 and 1.8.15 releases please note that the GPG key has been updated at [https://packages.fluentbit.io/fluentbit.key](https://packages.fluentbit.io/fluentbit.key) so ensure this new one is added.
+For the 1.9.0 and 1.8.15 releases and later, the GPG key [has been updated](https://packages.fluentbit.io/fluentbit.key). Ensure the new key is added.
 
 The GPG Key fingerprint of the new key is:
 
@@ -22,7 +21,7 @@ C3C0 A285 34B9 293E AF51  FABD 9F9D DC08 3888 C1CD
 Fluentbit releases (Releases signing key) <releases@fluentbit.io>
 ```
 
-The previous key is still available at [https://packages.fluentbit.io/fluentbit-legacy.key](https://packages.fluentbit.io/fluentbit-legacy.key) and may be required to install previous versions.
+The previous key is [still available](https://packages.fluentbit.io/fluentbit-legacy.key) and might be required to install previous versions.
 
 The GPG Key fingerprint of the old key is:
 
@@ -34,5 +33,4 @@ Refer to the [supported platform documentation](./../supported-platforms.md) to
 
 ## Migration to Fluent Bit
 
-From version 1.9, `td-agent-bit` is a deprecated package and is removed after 1.9.9.
-The correct package name to use now is `fluent-bit`.
+For version 1.9 and later, `td-agent-bit` is a deprecated package and is removed after 1.9.9. The correct package name to use now is `fluent-bit`.
diff --git a/installation/linux/alma-rocky.md b/installation/linux/alma-rocky.md
new file mode 100644
index 000000000..df127b20c
--- /dev/null
+++ b/installation/linux/alma-rocky.md
@@ -0,0 +1,77 @@
+# Rocky Linux and Alma Linux
+
+Fluent Bit is distributed as the `fluent-bit` package and is available for the latest versions of Rocky or Alma Linux now that CentOS Stream is tracking more recent dependencies.
+
+Fluent Bit supports the following architectures:
+
+- `x86_64`
+- `aarch64`
+- `arm64v8`
+
+## Single line install
+
+Fluent Bit provides an installation script to use for most Linux targets. This will always install the most recently released version.
+
+```shell
+curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
+```
+
+This is a convenience helper and should always be validated prior to use. Older versions of this install script won't support auto-detecting Rocky or Alma Linux. The recommended secure deployment approach is to use the following instructions:
+
+## RHEL 9
+
+From CentOS 9 Stream and later, the CentOS dependencies will update more often than
+downstream usage. This might mean that incompatible (more recent) versions are
+provided of certain dependencies (for example, OpenSSL). For OSS, there are RockyLinux
+and AlmaLinux repositories. This might be required for RHEL 9 as well which will no
+longer track equivalent CentOS 9 stream dependencies. No RHEL 9 build is provided, it
+is expected to use one of the OSS variants listed.
+
+## Configure YUM
+
+The `fluent-bit` package is provided through a Yum repository. To add the repository reference to your system:
+
+1. In `/etc/yum.repos.d/`, add a new file called `fluent-bit.repo`.
+1. Add the following content to the file - replace `almalinux` with `rockylinux` if required:
+
+   ```text
+   [fluent-bit]
+     name = Fluent Bit
+     baseurl = https://packages.fluentbit.io/almalinux/$releasever/
+     gpgcheck=1
+     gpgkey=https://packages.fluentbit.io/fluentbit.key
+     repo_gpgcheck=1
+     enabled=1
+   ```
+
+1. As a best practice, enable `gpgcheck` and `repo_gpgcheck` for security reasons. Fluent Bit signs its repository metadata and all Fluent Bit packages.
+
+## Install
+
+1. After your repository is configured, run the following command to install it:
+
+   ```shell
+   sudo yum install fluent-bit
+   ```
+
+1. Instruct `Systemd` to enable the service:
+
+   ```shell
+   sudo systemctl start fluent-bit
+   ```
+
+If you do a status check, you should see a similar output like this:
+
+```shell
+$ systemctl status fluent-bit
+
+● fluent-bit.service - Fluent Bit
+   Loaded: loaded (/usr/lib/systemd/system/fluent-bit.service; disabled; vendor preset: disabled)
+   Active: active (running) since Thu 2016-07-07 02:08:01 BST; 9s ago
+ Main PID: 3820 (fluent-bit)
+   CGroup: /system.slice/fluent-bit.service
+           └─3820 /opt/fluent-bit/bin/fluent-bit -c etc/fluent-bit/fluent-bit.conf
+...
+```
+
+The default Fluent Bit configuration collect metrics of CPU usage and sends the records to the standard output. You can see the outgoing data in your `/var/log/messages` file.
\ No newline at end of file
diff --git a/installation/linux/amazon-linux.md b/installation/linux/amazon-linux.md
index 186763bd8..6e436a061 100644
--- a/installation/linux/amazon-linux.md
+++ b/installation/linux/amazon-linux.md
@@ -2,59 +2,54 @@
 
 ## Install on Amazon Linux
 
-Fluent Bit is distributed as **fluent-bit** package and is available for the latest Amazon Linux 2 and Amazon Linux 2023.
-The following architectures are supported
+Fluent Bit is distributed as the `fluent-bit` package and is available for the latest Amazon Linux 2 and Amazon Linux 2023. The following architectures are supported
 
-* x86\_64
-* aarch64 / arm64v8
+- x86_64
+- aarch64 / arm64v8
+
+Amazon Linux 2022 is no longer supported.
 
 ## Single line install
 
-A simple installation script is provided to be used for most Linux targets.
-This will always install the most recent version released.
+Fluent Bit provides an installation script to use for most Linux targets. This will always install the most recently released version.
 
-```bash
+```shell
 curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
 ```
 
-This is purely a convenience helper and should always be validated prior to use.
-The recommended secure deployment approach is to follow the instructions below.
-
-### Amazon Linux 2022
+This is a convenience helper and should always be validated prior to use. The recommended secure deployment approach is to use the following instructions:
 
-Amazon Linux 2022 was previously supported but is removed since it became GA Amazon Linux 2023
+## Configure YUM
 
-## Configure Yum
-
-We provide **fluent-bit** through a Yum repository. In order to add the repository reference to your system, please add a new file called _fluent-bit.repo_ in _/etc/yum.repos.d/_ with the following content:
+The `fluent-bit` is provided through a Yum repository. To add the repository reference to your system, add a new file called `fluent-bit.repo` in `/etc/yum.repos.d/` with the following content:
 
 ### Amazon Linux 2
 
-```config
+```text
 [fluent-bit]
-name = Fluent Bit
-baseurl = https://packages.fluentbit.io/amazonlinux/2/
-gpgcheck=1
-gpgkey=https://packages.fluentbit.io/fluentbit.key
-enabled=1
+  name = Fluent Bit
+  baseurl = https://packages.fluentbit.io/amazonlinux/2/
+  gpgcheck=1
+  gpgkey=https://packages.fluentbit.io/fluentbit.key
+  enabled=1
 ```
 
 ### Amazon Linux 2023
 
-```config
+```text
 [fluent-bit]
-name = Fluent Bit
-baseurl = https://packages.fluentbit.io/amazonlinux/2023/
-gpgcheck=1
-gpgkey=https://packages.fluentbit.io/fluentbit.key
-enabled=1
+  name = Fluent Bit
+  baseurl = https://packages.fluentbit.io/amazonlinux/2023/
+  gpgcheck=1
+  gpgkey=https://packages.fluentbit.io/fluentbit.key
+  enabled=1
 ```
 
-Note: we encourage you always enable the _gpgcheck_ for security reasons. All our packages are signed.
+You should always enable `gpgcheck` for security reasons. All Fluent Bit packages are signed.
 
 ### Updated key from March 2022
 
-From the 1.9.0 and 1.8.15 releases please note that the GPG key has been updated at [https://packages.fluentbit.io/fluentbit.key](https://packages.fluentbit.io/fluentbit.key) so ensure this new one is added.
+For the 1.9.0 and 1.8.15 and later releases, the [GPG key has been updated](https://packages.fluentbit.io/fluentbit.key). Ensure this new one is added.
 
 The GPG Key fingerprint of the new key is:
 
@@ -63,7 +58,7 @@ C3C0 A285 34B9 293E AF51  FABD 9F9D DC08 3888 C1CD
 Fluentbit releases (Releases signing key) <releases@fluentbit.io>
 ```
 
-The previous key is still available at [https://packages.fluentbit.io/fluentbit-legacy.key](https://packages.fluentbit.io/fluentbit-legacy.key) and may be required to install previous versions.
+The previous key is [still available](https://packages.fluentbit.io/fluentbit-legacy.key) and might be required to install previous versions.
 
 The GPG Key fingerprint of the old key is:
 
@@ -75,22 +70,23 @@ Refer to the [supported platform documentation](../supported-platforms.md) to se
 
 ### Install
 
-Once your repository is configured, run the following command to install it:
+1. After your repository is configured, run the following command to install it:
 
-```bash
-sudo yum install fluent-bit
-```
+   ```shell
+   sudo yum install fluent-bit
+   ```
 
-Now the following step is to instruct _systemd_ to enable the service:
+1. Instruct `systemd` to enable the service:
 
-```bash
+```shell
 sudo systemctl start fluent-bit
 ```
 
 If you do a status check, you should see a similar output like this:
 
-```bash
+```shell
 $ systemctl status fluent-bit
+
 ● fluent-bit.service - Fluent Bit
    Loaded: loaded (/usr/lib/systemd/system/fluent-bit.service; disabled; vendor preset: disabled)
    Active: active (running) since Thu 2016-07-07 02:08:01 BST; 9s ago
@@ -100,4 +96,4 @@ $ systemctl status fluent-bit
 ...
 ```
 
-The default configuration of **fluent-bit** is collecting metrics of CPU usage and sending the records to the standard output, you can see the outgoing data in your _/var/log/messages_ file.
+The default Fluent Bit configuration collect metrics of CPU usage and sends the records to the standard output. You can see the outgoing data in your `/var/log/messages` file.
\ No newline at end of file
diff --git a/installation/linux/debian.md b/installation/linux/debian.md
index a3246f4d8..00198e072 100644
--- a/installation/linux/debian.md
+++ b/installation/linux/debian.md
@@ -1,35 +1,36 @@
 # Debian
 
-Fluent Bit is distributed as **fluent-bit** package and is available for the latest (and legacy) stable Debian systems: Bookworm and Bullseye.
+Fluent Bit is distributed as the `fluent-bit` package and is available for the latest stable CentOS system.
+
 The following architectures are supported
 
-* x86\_64
-* aarch64 / arm64v8
+- `x86_64`
+- `aarch64`
+- `arm64v8`
 
 ## Single line install
 
-A simple installation script is provided to be used for most Linux targets.
-This will always install the most recent version released.
+Fluent Bit provides an installation script to use for most Linux targets. This will always install the most recently released version.
 
-```bash
+```shell
 curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
 ```
 
-This is purely a convenience helper and should always be validated prior to use.
-The recommended secure deployment approach is to follow the instructions below.
+This is a convenience helper and should always be validated prior to use. The recommended secure deployment approach is to use the following instructions:
 
 ## Server GPG key
 
-The first step is to add our server GPG key to your keyring, on that way you can get our signed packages.
-Follow the official Debian wiki guidance: <https://wiki.debian.org/DebianRepository/UseThirdParty#OpenPGP\_Key\_distribution>
+The first step is to add the Fluent Bit server GPG key to your keyring to ensure you can get the correct signed packages.
 
-```bash
-curl https://packages.fluentbit.io/fluentbit.key | gpg --dearmor > /usr/share/keyrings/fluentbit-keyring.gpg
+Follow the official [Debian wiki guidance](https://wiki.debian.org/DebianRepository/UseThirdParty#OpenPGP_Key_distribution).
+
+```shell
+sudo sh -c 'curl https://packages.fluentbit.io/fluentbit.key | gpg --dearmor > /usr/share/keyrings/fluentbit-keyring.gpg'
 ```
 
 ### Updated key from March 2022
 
-From the 1.9.0 and 1.8.15 releases please note that the GPG key has been updated at [https://packages.fluentbit.io/fluentbit.key](https://packages.fluentbit.io/fluentbit.key) so ensure this new one is added.
+For the 1.9.0 and 1.8.15 and later releases, the [GPG key has been updated](https://packages.fluentbit.io/fluentbit.key). Ensure this new one is added.
 
 The GPG Key fingerprint of the new key is:
 
@@ -38,7 +39,7 @@ C3C0 A285 34B9 293E AF51  FABD 9F9D DC08 3888 C1CD
 Fluentbit releases (Releases signing key) <releases@fluentbit.io>
 ```
 
-The previous key is still available at [https://packages.fluentbit.io/fluentbit-legacy.key](https://packages.fluentbit.io/fluentbit-legacy.key) and may be required to install previous versions.
+The previous key is [still available](https://packages.fluentbit.io/fluentbit-legacy.key) and might be required to install previous versions.
 
 The GPG Key fingerprint of the old key is:
 
@@ -50,42 +51,52 @@ Refer to the [supported platform documentation](../supported-platforms.md) to se
 
 ## Update your sources lists
 
-On Debian, you need to add our APT server entry to your sources lists, please add the following content at bottom of your **/etc/apt/sources.list** file - ensure to set `CODENAME` to your specific [Debian release name](https://wiki.debian.org/DebianReleases#Production\_Releases) (e.g. `bookworm` for Debian 12):
+For Debian, you must add the Fluent Bit APT server entry to your sources lists.
+Ensure codename is set to your specific [Debian release name](https://wiki.debian.org/DebianReleases#Production_Releases). (for example: `bookworm` for Debian 12).
+
+```shell
+codename=$(grep -oP '(?<=VERSION_CODENAME=).*' /etc/os-release 2>/dev/null || lsb_release -cs 2>/dev/null)
+```
+
+Update your source's lists:
 
 ```bash
-deb [signed-by=/usr/share/keyrings/fluentbit-keyring.gpg] https://packages.fluentbit.io/debian/${CODENAME} ${CODENAME} main
+echo "deb [signed-by=/usr/share/keyrings/fluentbit-keyring.gpg] https://packages.fluentbit.io/debian/$codename $codename main" | sudo tee /etc/apt/sources.list.d/fluent-bit.list
 ```
 
 ## Update your repositories database
 
-Now let your system update the _apt_ database:
+Update your system's `apt` database:
 
-```bash
+```shell
 sudo apt-get update
 ```
 
 {% hint style="info" %}
-We recommend upgrading your system (`sudo apt-get upgrade`). This could avoid potential issues with expired certificates.
+
+Fluent Bit recommends upgrading your system (`sudo apt-get upgrade`). This could avoid potential issues with expired certificates.
+
 {% endhint %}
 
 ## Install Fluent Bit
 
-Using the following _apt-get_ command you are able now to install the latest _fluent-bit_:
+1. Use the following `apt-get` command to install the latest Fluent Bit:
 
-```bash
-sudo apt-get install fluent-bit
-```
+   ```shell
+   sudo apt-get install fluent-bit
+   ```
 
-Now the following step is to instruct _systemd_ to enable the service:
+1. Instruct `systemd` to enable the service:
 
-```bash
-sudo systemctl start fluent-bit
-```
+   ```shell
+   sudo systemctl start fluent-bit
+   ```
 
-If you do a status check, you should see a similar output like this:
+If you do a status check, you should see a similar output similar to:
+
+```shell
+$ sudo service fluent-bit status
 
-```bash
-sudo service fluent-bit status
 ● fluent-bit.service - Fluent Bit
    Loaded: loaded (/lib/systemd/system/fluent-bit.service; disabled; vendor preset: enabled)
    Active: active (running) since mié 2016-07-06 16:58:25 CST; 2h 45min ago
@@ -98,4 +109,4 @@ sudo service fluent-bit status
 ...
 ```
 
-The default configuration of **fluent-bit** is collecting metrics of CPU usage and sending the records to the standard output, you can see the outgoing data in your _/var/log/syslog_ file.
+The default Fluent Bit configuration collect metrics of CPU usage and sends the records to the standard output. You can see the outgoing data in your `/var/log/messages` file.
\ No newline at end of file
diff --git a/installation/linux/raspbian-raspberry-pi.md b/installation/linux/raspbian-raspberry-pi.md
index cc0889f18..cfa999827 100644
--- a/installation/linux/raspbian-raspberry-pi.md
+++ b/installation/linux/raspbian-raspberry-pi.md
@@ -1,21 +1,22 @@
-# Raspbian / Raspberry Pi
+# Raspberry Pi
 
-Fluent Bit is distributed as **fluent-bit** package and is available for the Raspberry, specifically for [Raspbian](http://raspbian.org) distribution, the following versions are supported:
+Fluent Bit is distributed as the `fluent-bit` package and is available for [Raspberry Pi](https://www.raspberrypi.com/software/operating-systems/). The following versions are supported:
 
-* Raspbian Bullseye \(11\)
-* Raspbian Buster \(10\)
+- Raspbian Bookworm (12)
+- Raspbian Bullseye (11)
+- Raspbian Buster (10)
 
 ## Server GPG key
 
-The first step is to add our server GPG key to your keyring, on that way you can get our signed packages:
+The first step is to add the Fluent Bit server GPG key to your keyring so you can get FLuent Bit signed packages:
 
-```text
-curl https://packages.fluentbit.io/fluentbit.key | sudo apt-key add -
+```shell
+sudo sh -c 'curl https://packages.fluentbit.io/fluentbit.key | sudo apt-key add - '
 ```
 
 ### Updated key from March 2022
 
-From the 1.9.0 and 1.8.15 releases please note that the GPG key has been updated at [https://packages.fluentbit.io/fluentbit.key](https://packages.fluentbit.io/fluentbit.key) so ensure this new one is added.
+For the 1.9.0 and 1.8.15 and later releases, the [GPG key has been updated](https://packages.fluentbit.io/fluentbit.key). Ensure this new one is added.
 
 The GPG Key fingerprint of the new key is:
 
@@ -24,7 +25,7 @@ C3C0 A285 34B9 293E AF51  FABD 9F9D DC08 3888 C1CD
 Fluentbit releases (Releases signing key) <releases@fluentbit.io>
 ```
 
-The previous key is still available at [https://packages.fluentbit.io/fluentbit-legacy.key](https://packages.fluentbit.io/fluentbit-legacy.key) and may be required to install previous versions.
+The previous key is [still available](https://packages.fluentbit.io/fluentbit-legacy.key) and might be required to install previous versions.
 
 The GPG Key fingerprint of the old key is:
 
@@ -36,50 +37,61 @@ Refer to the [supported platform documentation](./../supported-platforms.md) to
 
 ## Update your sources lists
 
-On Debian and derivative systems such as Raspbian, you need to add our APT server entry to your sources lists, please add the following content at bottom of your **/etc/apt/sources.list** file.
+On Debian and derivative systems such as Raspbian, you need to add the Fluent Bit APT server entry to your sources lists.
 
-### Raspbian 11 \(Bullseye\)
+Add the following content at bottom of your `/etc/apt/sources.list` file.
 
-```text
-deb https://packages.fluentbit.io/raspbian/bullseye bullseye main
+### Raspbian 12 (Bookworm)
+
+```shell
+echo "deb https://packages.fluentbit.io/raspbian/bookworm bookworm main" | sudo tee /etc/apt/sources.list.d/fluent-bit.list
 ```
 
-### Raspbian 10 \(Buster\)
+### Raspbian 11 (Bullseye)
 
-```text
-deb https://packages.fluentbit.io/raspbian/buster buster main
+```shell
+echo "deb https://packages.fluentbit.io/raspbian/bullseye bullseye main" | sudo tee /etc/apt/sources.list.d/fluent-bit.list
+```
+
+### Raspbian 10 (Buster)
+
+```shell
+echo "deb https://packages.fluentbit.io/raspbian/buster buster main" | sudo tee /etc/apt/sources.list.d/fluent-bit.list
 ```
 
 ### Update your repositories database
 
-Now let your system update the _apt_ database:
+Now let your system update the `apt` database:
 
-```bash
+```shell
 sudo apt-get update
 ```
 
 {% hint style="info" %}
-We recommend upgrading your system (```sudo apt-get upgrade```). This could avoid potential issues with expired certificates.
+
+Fluent Bit recommends upgrading your system (`sudo apt-get upgrade`) to avoid potential issues with expired certificates.
+
 {% endhint %}
 
 ## Install Fluent Bit
 
-Using the following _apt-get_ command you are able now to install the latest _fluent-bit_:
+1. Use the following `apt-get` command to install the latest Fluent Bit:
 
-```text
-sudo apt-get install fluent-bit
-```
+   ```shell
+   sudo apt-get install fluent-bit
+   ```
 
-Now the following step is to instruct _systemd_ to enable the service:
+1. Instruct `systemd` to enable the service:
 
-```bash
-sudo service fluent-bit start
-```
+   ```shell
+   sudo service fluent-bit start
+   ```
 
 If you do a status check, you should see a similar output like this:
 
-```bash
-sudo service fluent-bit status
+```shell
+$ sudo service fluent-bit status
+
 ● fluent-bit.service - Fluent Bit
    Loaded: loaded (/lib/systemd/system/fluent-bit.service; disabled; vendor preset: enabled)
    Active: active (running) since mié 2016-07-06 16:58:25 CST; 2h 45min ago
@@ -92,4 +104,4 @@ sudo service fluent-bit status
 ...
 ```
 
-The default configuration of **fluent-bit** is collecting metrics of CPU usage and sending the records to the standard output, you can see the outgoing data in your _/var/log/syslog_ file.
+The default configuration of Fluent Bit collects metrics for CPU usage and sends the records to the standard output. You can see the outgoing data in your `/var/log/syslog` file.
\ No newline at end of file
diff --git a/installation/linux/redhat-centos.md b/installation/linux/redhat-centos.md
index 277a26f8a..3501218f4 100644
--- a/installation/linux/redhat-centos.md
+++ b/installation/linux/redhat-centos.md
@@ -1,60 +1,68 @@
-# Redhat / CentOS
+# Red Hat and CentOS
 
-## Install on Redhat / CentOS
+Fluent Bit is distributed as the `fluent-bit` package and is available for the latest stable CentOS system.
 
-Fluent Bit is distributed as **fluent-bit** package and is available for the latest stable CentOS system.
+Fluent Bit supports the following architectures:
 
-The following architectures are supported
+- `x86_64`
+- `aarch64`
+- `arm64v8`
 
-* x86\_64
-* aarch64 / arm64v8
-
-For CentOS 9+ we use CentOS Stream as the canonical base system.
+For CentOS 9 and later, Fluent Bit uses [CentOS Stream](https://www.centos.org/centos-stream/) as the canonical base system.
 
 ## Single line install
 
-A simple installation script is provided to be used for most Linux targets.
-This will always install the most recent version released.
+Fluent Bit provides an installation script to use for most Linux targets. This will always install the most recently released version.
 
-```bash
+```shell
 curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
 ```
 
-This is purely a convenience helper and should always be validated prior to use.
-The recommended secure deployment approach is to follow the instructions below.
+This is a convenience helper and should always be validated prior to use. The recommended secure deployment approach is to use the following instructions:
 
 ## CentOS 8
 
-CentOS 8 is now EOL so the default Yum repositories are unavailable.
+CentOS 8 is now end-of-life, so the default Yum repositories are unavailable.
 
-Make sure to configure to use an appropriate mirror, for example:
+Ensure you've configured an appropriate mirror. For example:
 
 ```shell
 $ sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* && \
-  sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
+
+$ sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
 ```
 
-An alternative is to use Rocky or Alma Linux which _should_ be equivalent.
+An alternative is to use Rocky or Alma Linux, which should be equivalent.
 
-## Configure Yum
+## RHEL, AlmaLinux, RockyLinux, and CentOS 9 Stream
 
-We provide **fluent-bit** through a Yum repository. In order to add the repository reference to your system, please add a new file called _fluent-bit.repo_ in _/etc/yum.repos.d/_ with the following content:
+From CentOS 9 Stream and later, the CentOS dependencies will update more often than downstream usage. This might mean that incompatible (more recent) versions are
+provided of certain dependencies (for example, OpenSSL). For OSS, Fluent Bit also provide RockyLinux and AlmaLinux repositories.
 
-```shell
-[fluent-bit]
-name = Fluent Bit
-baseurl = https://packages.fluentbit.io/centos/$releasever/
-gpgcheck=1
-gpgkey=https://packages.fluentbit.io/fluentbit.key
-repo_gpgcheck=1
-enabled=1
-```
+Replace the `centos` string in Yum configuration with `almalinux` or `rockylinux` to use those repositories instead. This might be required for RHEL 9 as well which will no longer track equivalent CentOS 9 stream dependencies. No RHEL 9 build is provided, as it's expected you're using one of the OSS variants listed.
+
+## Configure YUM
+
+The`fluent-bit` package is provided through a Yum repository. To add the repository reference to your system:
+
+1. In `/etc/yum.repos.d/`, add a new file called `fluent-bit.repo`.
+1. Add the following content to the file:
 
-It is best practice to always enable the _gpgcheck_ and _repo\_gpgcheck_ for security reasons. We sign our repository metadata as well as all of our packages.
+   ```text
+   [fluent-bit]
+     name = Fluent Bit
+     baseurl = https://packages.fluentbit.io/centos/$releasever/
+     gpgcheck=1
+     gpgkey=https://packages.fluentbit.io/fluentbit.key
+     repo_gpgcheck=1
+     enabled=1
+   ```
+
+1. As a best practice, enable `gpgcheck` and `repo_gpgcheck` for security reasons. Fluent Bit signs its repository metadata and all Fluent Bit packages.
 
 ### Updated key from March 2022
 
-From the 1.9.0 and 1.8.15 releases please note that the GPG key has been updated at [https://packages.fluentbit.io/fluentbit.key](https://packages.fluentbit.io/fluentbit.key) so ensure this new one is added.
+For the 1.9.0 and 1.8.15 and later releases, the [GPG key has been updated](https://packages.fluentbit.io/fluentbit.key). Ensure this new one is added.
 
 The GPG Key fingerprint of the new key is:
 
@@ -63,7 +71,7 @@ C3C0 A285 34B9 293E AF51  FABD 9F9D DC08 3888 C1CD
 Fluentbit releases (Releases signing key) <releases@fluentbit.io>
 ```
 
-The previous key is still available at [https://packages.fluentbit.io/fluentbit-legacy.key](https://packages.fluentbit.io/fluentbit-legacy.key) and may be required to install previous versions.
+The previous key is [still available](https://packages.fluentbit.io/fluentbit-legacy.key) and might be required to install previous versions.
 
 The GPG Key fingerprint of the old key is:
 
@@ -75,22 +83,23 @@ Refer to the [supported platform documentation](../supported-platforms.md) to se
 
 ### Install
 
-Once your repository is configured, run the following command to install it:
+1. After your repository is configured, run the following command to install it:
 
-```bash
-sudo yum install fluent-bit
-```
+   ```shell
+   sudo yum install fluent-bit
+   ```
 
-Now the following step is to instruct _Systemd_ to enable the service:
+1. Instruct `Systemd` to enable the service:
 
-```bash
-sudo systemctl start fluent-bit
-```
+   ```shell
+   sudo systemctl start fluent-bit
+   ```
 
 If you do a status check, you should see a similar output like this:
 
-```bash
+```shell
 $ systemctl status fluent-bit
+
 ● fluent-bit.service - Fluent Bit
    Loaded: loaded (/usr/lib/systemd/system/fluent-bit.service; disabled; vendor preset: disabled)
    Active: active (running) since Thu 2016-07-07 02:08:01 BST; 9s ago
@@ -100,31 +109,36 @@ $ systemctl status fluent-bit
 ...
 ```
 
-The default configuration of **fluent-bit** is collecting metrics of CPU usage and sending the records to the standard output, you can see the outgoing data in your _/var/log/messages_ file.
+The default Fluent Bit configuration collect metrics of CPU usage and sends the records to the standard output. You can see the outgoing data in your `/var/log/messages` file.
 
 ## FAQ
 
-### Yum install fails with a "404 - Page not found" error for the package mirror
+### Yum install fails with a `404 - Page not found` error for the package mirror
 
-The fluent-bit.repo file for the latest installations of Fluent-Bit uses a $releasever variable to determine the correct version of the package to install to your system:
+The `fluent-bit.repo` file for the latest installations of Fluent Bit uses a `$releasever` variable to determine the correct version of the package to install to your system:
 
 ```text
 [fluent-bit]
-name = Fluent Bit
-baseurl = https://packages.fluentbit.io/centos/$releasever/$basearch/
-...
+  name = Fluent Bit
+  baseurl = https://packages.fluentbit.io/centos/$releasever/$basearch/
 ```
 
-Depending on your Red Hat distribution version, this variable may return a value other than the OS major release version (e.g., RHEL7 Server distributions return "7Server" instead of just "7"). The Fluent-Bit package url uses just the major OS release version, so any other value here will cause a 404.
+Depending on your Red Hat distribution version, this variable can return a value other than the OS major release version (for example, RHEL7 Server distributions return `7Server` instead of `7`). The Fluent Bit package URL uses the major OS release version, so any other value here will cause a 404.
 
-In order to resolve this issue, you can replace the $releasever variable with your system's OS major release version. For example:
+To resolve this issue, replace the `$releasever` variable with your system's OS major release version. For example:
 
 ```text
 [fluent-bit]
-name = Fluent Bit
-baseurl = https://packages.fluentbit.io/centos/7/$basearch/
-gpgcheck=1
-gpgkey=https://packages.fluentbit.io/fluentbit.key
-repo_gpgcheck=1
-enabled=1
+  name = Fluent Bit
+  baseurl = https://packages.fluentbit.io/centos/7/$basearch/
+  gpgcheck=1
+  gpgkey=https://packages.fluentbit.io/fluentbit.key
+  repo_gpgcheck=1
+  enabled=1
 ```
+
+### Yum install fails with incompatible dependencies using CentOS 9+
+
+CentOS 9 and later will no longer be compatible with RHEL 9 as it might track more recent dependencies. Alternative AlmaLinux and RockyLinux repositories are available.
+
+See the previous guidance.
diff --git a/installation/linux/ubuntu.md b/installation/linux/ubuntu.md
index 8310bdf33..28a49011e 100644
--- a/installation/linux/ubuntu.md
+++ b/installation/linux/ubuntu.md
@@ -1,32 +1,30 @@
 # Ubuntu
 
-Fluent Bit is distributed as **fluent-bit** package and is available for long-term support releases of Ubuntu. 
-The latest officially supported version is Noble Numbat (24.04).
+Fluent Bit is distributed as the `fluent-bit` package and is available for long-term support releases of Ubuntu. The latest officially supported version is Noble Numbat (24.04).
 
 ## Single line install
 
-A simple installation script is provided to be used for most Linux targets.
-This will always install the most recent version released.
+An installation script is provided for most Linux targets. This will always install the most recent version released.
 
-```bash
+```shell
 curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
 ```
 
-This is purely a convenience helper and should always be validated prior to use.
-The recommended secure deployment approach is to follow the instructions below.
+This is purely a convenience helper and should always be validated prior to use. The recommended secure deployment approach is to use the following instructions.
 
 ## Server GPG key
 
-The first step is to add our server GPG key to your keyring to ensure you can get our signed packages.
-Follow the official Debian wiki guidance: <https://wiki.debian.org/DebianRepository/UseThirdParty#OpenPGP\_Key\_distribution>
+The first step is to add the Fluent Bit server GPG key to your keyring to ensure you can get the correct signed packages.
 
-```bash
-curl https://packages.fluentbit.io/fluentbit.key | gpg --dearmor > /usr/share/keyrings/fluentbit-keyring.gpg
+Follow the official [Debian wiki guidance](https://wiki.debian.org/DebianRepository/UseThirdParty#OpenPGP_Key_distribution).
+
+```shell
+sudo sh -c 'curl https://packages.fluentbit.io/fluentbit.key | gpg --dearmor > /usr/share/keyrings/fluentbit-keyring.gpg'
 ```
 
 ### Updated key from March 2022
 
-From the 1.9.0 and 1.8.15 releases please note that the GPG key has been updated at [https://packages.fluentbit.io/fluentbit.key](https://packages.fluentbit.io/fluentbit.key) so ensure this new one is added.
+For releases 1.9.0 and 1.8.15 and later, the [GPG key has been updated](https://packages.fluentbit.io/fluentbit.key). Ensure the new key is added.
 
 The GPG Key fingerprint of the new key is:
 
@@ -35,7 +33,7 @@ C3C0 A285 34B9 293E AF51  FABD 9F9D DC08 3888 C1CD
 Fluentbit releases (Releases signing key) <releases@fluentbit.io>
 ```
 
-The previous key is still available at [https://packages.fluentbit.io/fluentbit-legacy.key](https://packages.fluentbit.io/fluentbit-legacy.key) and may be required to install previous versions.
+The previous key is [still available](https://packages.fluentbit.io/fluentbit-legacy.key) and might be required to install previous versions.
 
 The GPG Key fingerprint of the old key is:
 
@@ -47,46 +45,58 @@ Refer to the [supported platform documentation](../supported-platforms.md) to se
 
 ## Update your sources lists
 
-On Ubuntu, you need to add our APT server entry to your sources lists, please add the following content at bottom of your **/etc/apt/sources.list** file - ensure to set `CODENAME` to your specific [Ubuntu release name](https://wiki.ubuntu.com/Releases) (e.g. `focal` for Ubuntu 20.04):
+On Ubuntu, you need to add the Fluent Bit APT server entry to your sources lists.
+Ensure `codename` is set to your specific [Ubuntu release name](https://wiki.ubuntu.com/Releases). For example, `focal` for Ubuntu 20.04.
+
+```shell
+codename=$(grep -oP '(?<=VERSION_CODENAME=).*' /etc/os-release 2>/dev/null || lsb_release -cs 2>/dev/null)
+```
+
+Update your source's list:
 
-```bash
-deb [signed-by=/usr/share/keyrings/fluentbit-keyring.gpg] https://packages.fluentbit.io/ubuntu/${CODENAME} ${CODENAME} main
+```shell
+echo "deb [signed-by=/usr/share/keyrings/fluentbit-keyring.gpg] https://packages.fluentbit.io/ubuntu/$codename $codename main" | sudo tee /etc/apt/sources.list.d/fluent-bit.list
 ```
 
 ### Update your repositories database
 
-Now let your system update the _apt_ database:
+Update the `apt` database on your system:
 
-```bash
+```shell
 sudo apt-get update
 ```
 
 {% hint style="info" %}
-We recommend upgrading your system (`sudo apt-get upgrade`). This could avoid potential issues with expired certificates.
-{% endhint %}
 
-{% hint style="info" %}
-If you have the following error "Certificate verification failed", you might want to check if the package `ca-certificates` is properly installed (`sudo apt-get install ca-certificates`).
+Fluent Bit recommends upgrading your system to avoid potential issues with expired certificates:
+
+`sudo apt-get upgrade`
+
+If you receive the error `Certificate verification failed`, check if the package `ca-certificates` is properly installed:
+
+`sudo apt-get install ca-certificates`
+
 {% endhint %}
 
 ## Install Fluent Bit
 
-Using the following _apt-get_ command you are able now to install the latest _fluent-bit_:
+1. Use the following `apt-get` command to install the latest Fluent Bit:
 
-```text
-sudo apt-get install fluent-bit
-```
+   ```shell
+   sudo apt-get install fluent-bit
+   ```
 
-Now the following step is to instruct _systemd_ to enable the service:
+1. Instruct `systemd` to enable the service:
 
-```bash
-sudo systemctl start fluent-bit
-```
+   ```shell
+   sudo systemctl start fluent-bit
+   ```
 
 If you do a status check, you should see a similar output like this:
 
-```bash
-systemctl status fluent-bit
+```shell
+$ systemctl status fluent-bit
+
 ● fluent-bit.service - Fluent Bit
    Loaded: loaded (/lib/systemd/system/fluent-bit.service; disabled; vendor preset: enabled)
    Active: active (running) since mié 2016-07-06 16:58:25 CST; 2h 45min ago
@@ -99,4 +109,4 @@ systemctl status fluent-bit
 ...
 ```
 
-The default configuration of **fluent-bit** is collecting metrics of CPU usage and sending the records to the standard output, you can see the outgoing data in your _/var/log/syslog_ file.
+The default configuration of `fluent-bit` is collecting metrics of CPU usage and sending the records to the standard output. You can see the outgoing data in your `/var/log/syslog` file.
\ No newline at end of file
diff --git a/installation/macos.md b/installation/macos.md
index 0c890152a..f4aead5c9 100644
--- a/installation/macos.md
+++ b/installation/macos.md
@@ -1,129 +1,133 @@
 # macOS
 
-Fluent Bit is compatible with latest Apple macOS system on x86_64 and Apple Silicon architectures.
+Fluent Bit is compatible with the latest Apple macOS software for x86_64 and Apple Silicon architectures.
 
-## Installation Packages
+## Installation packages
 
-The packages can be found here: <https://packages.fluentbit.io/macos/>
+Installation packages can be found [in the Fluent Bit repository](https://packages.fluentbit.io/macos/).
 
 ## Requirements
 
-For the next steps, you will need to have [Homebrew](https://brew.sh/) installed in your system.
-If is not there, you can install it with the following command:
+You must have [Homebrew](https://brew.sh/) installed in your system. If it isn't present, install it with the following command:
 
-```bash
+```shell
 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
 ```
 
 ## Installing from Homebrew
 
-The Fluent Bit package on Homebrew is not officially supported, but should work for basic use cases and testing. It can be installed using:
+The Fluent Bit package on Homebrew isn't officially supported, but should work for basic use cases and testing. It can be installed using:
 
-```bash
+```shell
 brew install fluent-bit
 ```
 
-## Compile from Source
+## Compile from source
 
 ### Install build dependencies
 
 Run the following brew command in your terminal to retrieve the dependencies:
 
-```bash
-brew install git cmake openssl bison
+```shell
+brew install git cmake openssl bison libyaml
 ```
 
-## Get the source and build it
+## Download and build the source
 
-Grab a fresh copy of the Fluent Bit source code (upstream):
+1. Download a copy of the Fluent Bit source code (upstream):
 
-```bash
-git clone https://github.com/fluent/fluent-bit
-cd fluent-bit
-```
+   ```shell
+   $ git clone https://github.com/fluent/fluent-bit
+   
+   $ cd fluent-bit
+   ```
 
-Optionally, if you want to use a specific version, just checkout to the proper tag.
-If you want to use `v1.8.13` just do:
+   If you want to use a specific version, checkout to the proper tag. For example, to use `v4.0.4`, use the command:
 
-```bash
-git checkout v1.8.13
-```
+   ```shell
+   git checkout v4.0.4
+   ```
 
-In order to prepare the build system, we need to expose certain environment variables so Fluent Bit CMake build rules can pick the right libraries:
+1. To prepare the build system, you must expose certain environment variables so Fluent Bit CMake build rules can pick the right libraries:
 
-```bash
-export OPENSSL_ROOT_DIR=`brew --prefix openssl`
-export PATH=`brew --prefix bison`/bin:$PATH
-```
+   ```shell
+   $ export OPENSSL_ROOT_DIR=`brew --prefix openssl`
+   
+   $ export PATH=`brew --prefix bison`/bin:$PATH
+   ```
 
-Change to the _build/_ directory inside the Fluent Bit sources:
+1. Change to the `build/` directory inside the Fluent Bit sources:
 
-```bash
-cd build/
-```
+   ```shell
+   cd build/
+   ```
 
-Build Fluent Bit.
-Note that we are indicating to the build system "where" the final binaries and config files should be installed:
+1. Build Fluent Bit. This example indicates to the build system the location the final binaries and `config` files should be installed:
 
-```bash
-cmake -DFLB_DEV=on -DCMAKE_INSTALL_PREFIX=/opt/fluent-bit ../
-make -j 16
-```
+   ```shell
+   $ cmake -DFLB_DEV=on -DCMAKE_INSTALL_PREFIX=/opt/fluent-bit ../
+   
+   $ make -j 16
+   ```
 
-Install Fluent Bit to the directory specified above.
-Note that this requires root privileges due to the directory we will write information to:
+1. Install Fluent Bit to the previously specified directory. Writing to this directory requires root privileges.
 
-```bash
-sudo make install
-```
+   ```shell
+   sudo make install
+   ```
 
 The binaries and configuration examples can be located at `/opt/fluent-bit/`.
 
 ## Create macOS installer from source
 
-Grab a fresh copy of the Fluent Bit source code (upstream):
+1. Clone the Fluent Bit source code (upstream):
 
-```bash
-git clone https://github.com/fluent/fluent-bit
-cd fluent-bit
-```
+   ```shell
+   $ git clone https://github.com/fluent/fluent-bit
+   
+   $ cd fluent-bit
+   ```
 
-Optionally, if you want to use a specific version, just checkout to the proper tag. If you want to use `v1.9.2` just do:
+   If you want to use a specific version, checkout to the proper tag. For example,
+   to use `v4.0.4` do:
 
-```bash
-git checkout v1.9.2
-```
+   ```shell
+   git checkout v4.0.4
+   ```
 
-In order to prepare the build system, we need to expose certain environment variables so Fluent Bit CMake build rules can pick the right libraries:
+1. To prepare the build system, you must expose certain environment variables so Fluent Bit CMake build rules can pick the right libraries:
 
-```bash
-export OPENSSL_ROOT_DIR=`brew --prefix openssl`
-export PATH=`brew --prefix bison`/bin:$PATH
-```
+   ```shell
+   $ export OPENSSL_ROOT_DIR=`brew --prefix openssl`
+   
+   $ export PATH=`brew --prefix bison`/bin:$PATH
+   ```
 
-And then, creating the specific macOS SDK target (For example, specifying macOS Big Sur (11.3) SDK environment):
+1. Create the specific macOS SDK target. For example, to specify macOS Big Sur (11.3) SDK environment:
 
-```bash
-export MACOSX_DEPLOYMENT_TARGET=11.3
-```
+   ```shell
+   export MACOSX_DEPLOYMENT_TARGET=11.3
+   ```
 
-Change to the _build/_ directory inside the Fluent Bit sources:
+1. Change to the `build/` directory inside the Fluent Bit sources:
 
-```bash
-cd build/
-```
+   ```shell
+   cd build/
+   ```
 
-Build the Fluent Bit macOS installer.
+1. Build the Fluent Bit macOS installer:
 
-```bash
-cmake -DCPACK_GENERATOR=productbuild -DCMAKE_INSTALL_PREFIX=/opt/fluent-bit ../
-make -j 16
-cpack -G productbuild
-```
+   ```shell
+   $ cmake -DCPACK_GENERATOR=productbuild -DCMAKE_INSTALL_PREFIX=/opt/fluent-bit ../
+   
+   $ make -j 16
+   
+   $ cpack -G productbuild
+   ```
 
-Then, macOS installer will be generated as:
+The macOS installer will be generated as:
 
-```log
+```text
 CPack: Create package using productbuild
 CPack: Install projects
 CPack: - Run preinstall target for: fluent-bit
@@ -140,40 +144,30 @@ CPack: -   Building component package: /Users/fluent-bit-builder/GitHub/fluent-b
 CPack: - package: /Users/fluent-bit-builder/GitHub/fluent-bit/build/fluent-bit-1.9.2-apple.pkg generated.
 ```
 
-Finally, fluent-bit-`<fluent-bit version>`-`(intel or apple)`.pkg will be generated.
+Finally, the `fluent-bit-<fluent-bit version>-(intel or apple)`.pkg will be generated.
 
 The created installer will put binaries at `/opt/fluent-bit/`.
 
 ## Running Fluent Bit
 
-To make the access path easier to Fluent Bit binary, in your terminal extend the `PATH` variable:
+To make the access path easier to Fluent Bit binary, extend the `PATH` variable:
 
-```bash
+```shell
 export PATH=/opt/fluent-bit/bin:$PATH
 ```
 
-Now as a simple test, try Fluent Bit by generating a simple dummy message which will be printed to the standard output interface every 1 second:
+To test, try Fluent Bit by generating a test message using the [Dummy input plugin](https://docs.fluentbit.io/manual/pipeline/inputs/dummy) which prints to the standard output interface every one second:
 
-```bash
- fluent-bit -i dummy -o stdout -f 1
+```shell
+fluent-bit -i dummy -o stdout -f 1
 ```
 
 You will see an output similar to this:
 
-```bash
-Fluent Bit v1.9.0
-* Copyright (C) 2015-2021 The Fluent Bit Authors
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
-
-[2022/02/08 17:13:52] [ info] [engine] started (pid=14160)
-[2022/02/08 17:13:52] [ info] [storage] version=1.1.6, initializing...
-[2022/02/08 17:13:52] [ info] [storage] in-memory
-[2022/02/08 17:13:52] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128
-[2022/02/08 17:13:52] [ info] [cmetrics] version=0.2.2
-[2022/02/08 17:13:52] [ info] [sp] stream processor started
+```text
+...
 [0] dummy.0: [1644362033.676766000, {"message"=>"dummy"}]
 [0] dummy.0: [1644362034.676914000, {"message"=>"dummy"}]
 ```
 
-To halt the process, press `ctrl-c` in the terminal.
+To halt the process, press `ctrl-c` in the terminal.
\ No newline at end of file
diff --git a/installation/requirements.md b/installation/requirements.md
index efaf1ada0..f71f5365d 100644
--- a/installation/requirements.md
+++ b/installation/requirements.md
@@ -1,12 +1,14 @@
 # Requirements
 
-[Fluent Bit](http://fluentbit.io) uses very low CPU and Memory consumption, it's compatible with most of x86, x86\_64, arm32v7, arm64v8 based platforms. In order to build it you need the following components in your system for the build process:
+[Fluent Bit](http://fluentbit.io) has very low CPU and memory consumption. It's compatible with most x86-, x86_64-, arm32v7-, and arm64v8-based platforms.
 
-* Compiler: GCC or clang
-* CMake
-* Flex & Bison: only if you enable the Stream Processor or Record Accessor feature \(both enabled by default\)
-* Libyaml development headers and libraries
+The build process requires the following components:
 
-In the core there are not other dependencies, For certain features that depends on third party components like output plugins with special backend libraries \(e.g: kafka\), those are included in the main source code repository.
+- Compiler: GCC or clang
+- CMake
+- Flex and Bison: Required for [Stream Processor](https://docs.fluentbit.io/manual/stream-processing/introduction) or [Record Accessor](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/record-accessor)
+- Libyaml development headers and libraries
 
-Fluent Bit is supported on Linux on IBM Z(s390x), but the WASM and LUA filter plugins are not.
+Core has no other dependencies. Some features depend on third-party components. For example, output plugins with special backend libraries like Kafka include those libraries in the main source code repository.
+
+Fluent Bit is supported on Linux on IBM Z(s390x), but the Wasm and Lua filter plugins aren't.
diff --git a/installation/sources/build-and-install.md b/installation/sources/build-and-install.md
index 568130cb4..5e24cc8a6 100644
--- a/installation/sources/build-and-install.md
+++ b/installation/sources/build-and-install.md
@@ -1,222 +1,235 @@
-# Build and Install
+# Build and install
 
-[Fluent Bit](http://fluentbit.io) uses [CMake](http://cmake.org) as its build system. The suggested procedure to prepare the build system consists of the following steps:
+[Fluent Bit](http://fluentbit.io) uses [CMake](http://cmake.org) as its build system.
 
 ## Requirements
 
-- CMake >= 3.12
+- CMake 3.12 or greater. You might need to use `cmake3` instead of `cmake`.
 - Flex
-- Bison >= 3
+- Bison 3 or greater
 - YAML headers
 - OpenSSL headers
 
 ## Prepare environment
 
-> In the following steps you can find exact commands to build and install the project with the default options. If you already know how CMake works you can skip this part and look at the build options available. Note that Fluent Bit requires CMake 3.x. You may need to use `cmake3` instead of `cmake` to complete the following steps on your system.
-
-Change to the _build/_ directory inside the Fluent Bit sources:
-
-```bash
-$ cd build/
-```
-
-Let [CMake](http://cmake.org) configure the project specifying where the root path is located:
-
-```bash
-$ cmake ../
--- The C compiler identification is GNU 4.9.2
--- Check for working C compiler: /usr/bin/cc
--- Check for working C compiler: /usr/bin/cc -- works
--- Detecting C compiler ABI info
--- Detecting C compiler ABI info - done
--- The CXX compiler identification is GNU 4.9.2
--- Check for working CXX compiler: /usr/bin/c++
--- Check for working CXX compiler: /usr/bin/c++ -- works
-...
--- Could NOT find Doxygen (missing:  DOXYGEN_EXECUTABLE)
--- Looking for accept4
--- Looking for accept4 - not found
--- Configuring done
--- Generating done
--- Build files have been written to: /home/edsiper/coding/fluent-bit/build
-```
-
-Now you are ready to start the compilation process through the simple _make_ command:
-
-```bash
-$ make
-Scanning dependencies of target msgpack
-[  2%] Building C object lib/msgpack-1.1.0/CMakeFiles/msgpack.dir/src/unpack.c.o
-[  4%] Building C object lib/msgpack-1.1.0/CMakeFiles/msgpack.dir/src/objectc.c.o
-[  7%] Building C object lib/msgpack-1.1.0/CMakeFiles/msgpack.dir/src/version.c.o
-...
-[ 19%] Building C object lib/monkey/mk_core/CMakeFiles/mk_core.dir/mk_file.c.o
-[ 21%] Building C object lib/monkey/mk_core/CMakeFiles/mk_core.dir/mk_rconf.c.o
-[ 23%] Building C object lib/monkey/mk_core/CMakeFiles/mk_core.dir/mk_string.c.o
-...
-Scanning dependencies of target fluent-bit-static
-[ 66%] Building C object src/CMakeFiles/fluent-bit-static.dir/flb_pack.c.o
-[ 69%] Building C object src/CMakeFiles/fluent-bit-static.dir/flb_input.c.o
-[ 71%] Building C object src/CMakeFiles/fluent-bit-static.dir/flb_output.c.o
-...
-Linking C executable ../bin/fluent-bit
-[100%] Built target fluent-bit-bin
-```
-
-to continue installing the binary on the system just do:
-
-```bash
-$ make install
-```
-
-it's likely you may need root privileges so you can try to prefixing the command with _sudo_.
-
-## Build Options
-
-Fluent Bit provides certain options to CMake that can be enabled or disabled when configuring, please refer to the following tables under the _General Options_, _Development Options_, Input Plugins _and \_Output Plugins_ sections.
-
-### General Options
-
-| option | description | default |
+If you already know how CMake works, you can skip this section and review the available [build options](#general-options).
+
+The following steps explain how to build and install the project with the default options.
+
+1. Change to the `build/` directory inside the Fluent Bit sources:
+
+   ```shell
+   cd build/
+   ```
+
+1. Let [CMake](http://cmake.org) configure the project specifying where the root path is located:
+
+   ```shell
+   cmake ../
+   ```
+
+   This command displays a series of results similar to:
+
+   ```text
+   -- The C compiler identification is GNU 4.9.2
+   -- Check for working C compiler: /usr/bin/cc
+   -- Check for working C compiler: /usr/bin/cc -- works
+   -- Detecting C compiler ABI info
+   -- Detecting C compiler ABI info - done
+   -- The CXX compiler identification is GNU 4.9.2
+   -- Check for working CXX compiler: /usr/bin/c++
+   -- Check for working CXX compiler: /usr/bin/c++ -- works
+   ...
+   -- Could NOT find Doxygen (missing:  DOXYGEN_EXECUTABLE)
+   -- Looking for accept4
+   -- Looking for accept4 - not found
+   -- Configuring done
+   -- Generating done
+   -- Build files have been written to: /home/edsiper/coding/fluent-bit/build
+   ```
+
+1. Start the compilation process using the `make` command:
+
+   ```shell
+   make
+   ```
+
+   This command displays results similar to:
+
+   ```text
+   Scanning dependencies of target msgpack
+   [  2%] Building C object lib/msgpack-1.1.0/CMakeFiles/msgpack.dir/src/unpack.c.o
+   [  4%] Building C object lib/msgpack-1.1.0/CMakeFiles/msgpack.dir/src/objectc.c.o
+   [  7%] Building C object lib/msgpack-1.1.0/CMakeFiles/msgpack.dir/src/version.c.o
+   ...
+   [ 19%] Building C object lib/monkey/mk_core/CMakeFiles/mk_core.dir/mk_file.c.o
+   [ 21%] Building C object lib/monkey/mk_core/CMakeFiles/mk_core.dir/mk_rconf.c.o
+   [ 23%] Building C object lib/monkey/mk_core/CMakeFiles/mk_core.dir/mk_string.c.o
+   ...
+   Scanning dependencies of target fluent-bit-static
+   [ 66%] Building C object src/CMakeFiles/fluent-bit-static.dir/flb_pack.c.o
+   [ 69%] Building C object src/CMakeFiles/fluent-bit-static.dir/flb_input.c.o
+   [ 71%] Building C object src/CMakeFiles/fluent-bit-static.dir/flb_output.c.o
+   ...
+   Linking C executable ../bin/fluent-bit
+   [100%] Built target fluent-bit-bin
+   ```
+
+1. To continue installing the binary on the system, use `make install`:
+
+   ```shell
+   make install
+   ```
+
+   If the command indicates insufficient permissions, prefix the command with `sudo`.
+
+## Build options
+
+Fluent Bit provides configurable options to CMake that can be enabled or disabled.
+
+### General options
+
+| Option | Description | Default |
 | :--- | :--- | :--- |
-| FLB\_ALL | Enable all features available | No |
-| FLB\_JEMALLOC | Use Jemalloc as default memory allocator | No |
-| FLB\_TLS | Build with SSL/TLS support | Yes |
-| FLB\_BINARY | Build executable | Yes |
-| FLB\_EXAMPLES | Build examples | Yes |
-| FLB\_SHARED\_LIB | Build shared library | Yes |
-| FLB\_MTRACE | Enable mtrace support | No |
-| FLB\_INOTIFY | Enable Inotify support | Yes |
-| FLB\_POSIX\_TLS | Force POSIX thread storage | No |
-| FLB\_SQLDB | Enable SQL embedded database support | No |
-| FLB\_HTTP\_SERVER | Enable HTTP Server | No |
-| FLB\_LUAJIT | Enable Lua scripting support | Yes |
-| FLB\_RECORD\_ACCESSOR | Enable record accessor | Yes |
-| FLB\_SIGNV4 | Enable AWS Signv4 support | Yes |
-| FLB\_STATIC\_CONF | Build binary using static configuration files. The value of this option must be a directory containing configuration files. |  |
-| FLB\_STREAM\_PROCESSOR | Enable Stream Processor | Yes |
-| FLB\_CONFIG\_YAML | Enable YAML configuration support | Yes |
-| FLB\_WASM | Build with WASM runtime support | Yes |
-| FLB\_WAMRC | Build with WASM AOT compiler executable | No |
-
-### Development Options
-
-| option | description | default |
+| `FLB_ALL` | Enable all features available | `No` |
+| `FLB_JEMALLOC` | Use Jemalloc as default memory allocator | `No` |
+| `FLB_TLS` | Build with SSL/TLS support | `Yes` |
+| `FLB_BINARY` | Build executable | `Yes` |
+| `FLB_EXAMPLES` | Build examples | `Yes` |
+| `FLB_SHARED_LIB` | Build shared library | `Yes` |
+| `FLB_MTRACE` | Enable `mtrace` support | `No` |
+| `FLB_INOTIFY` | Enable Inotify support | `Yes` |
+| `FLB_POSIX_TLS` | Force POSIX thread storage | `No` |
+| `FLB_SQLDB` | Enable SQL embedded database support | `No` |
+| `FLB_HTTP_SERVER` | Enable HTTP Server | `No` |
+| `FLB_LUAJIT` | Enable Lua scripting support | `Yes` |
+| `FLB_RECORD_ACCESSOR` | Enable record accessor | `Yes` |
+| `FLB_SIGNV4` | Enable AWS Signv4 support | `Yes` |
+| `FLB_STATIC_CONF` | Build binary using static configuration files. The value of this option must be a directory containing configuration files. |  |
+| `FLB_STREAM_PROCESSOR` | Enable Stream Processor | `Yes` |
+| `FLB_CONFIG_YAML` | Enable YAML configuration support | `Yes` |
+| `FLB_WASM` | Build with Wasm runtime support | `Yes` |
+| `FLB_WAMRC` | Build with Wasm AOT compiler executable | `No` |
+
+### Development options
+
+| Option | Description | Default |
 | :--- | :--- | :--- |
-| FLB\_DEBUG | Build binaries with debug symbols | No |
-| FLB\_VALGRIND | Enable Valgrind support | No |
-| FLB\_TRACE | Enable trace mode | No |
-| FLB\_SMALL | Minimise binary size | No |
-| FLB\_TESTS\_RUNTIME | Enable runtime tests | No |
-| FLB\_TESTS\_INTERNAL | Enable internal tests | No |
-| FLB\_TESTS | Enable tests | No |
-| FLB\_BACKTRACE | Enable backtrace/stacktrace support | Yes |
-
-### Optimization Options
-
-| option | description | default |
+| `FLB_DEBUG` | Build binaries with debug symbols | `No` |
+| `FLB_VALGRIND` | Enable `Valgrind` support | `No` |
+| `FLB_TRACE` | Enable trace mode | `No` |
+| `FLB_SMALL` | Minimise binary size | `No` |
+| `FLB_TESTS_RUNTIME` | Enable runtime tests | `No` |
+| `FLB_TESTS_INTERNAL` | Enable internal tests | `No` |
+| `FLB_TESTS` | Enable tests | `No` |
+| `FLB_BACKTRACE` | Enable backtrace/stacktrace support | `Yes` |
+
+### Optimization options
+
+| Option | Description | Default |
 | :--- | :--- | :--- |
-| FLB\_MSGPACK\_TO\_JSON\_INIT\_BUFFER\_SIZE | Determine initial buffer size for msgpack to json conversion in terms of memory used by payload. | 2.0 |
-| FLB\_MSGPACK\_TO\_JSON\_REALLOC\_BUFFER\_SIZE | Determine percentage of reallocation size when msgpack to json conversion buffer runs out of memory. | 0.1 |
+| `FLB_MSGPACK_TO_JSON_INIT_BUFFER_SIZE` | Determine initial buffer size for `msgpack` to `json` conversion in terms of memory used by payload. | `2.0` |
+| `FLB_MSGPACK_TO_JSON_REALLOC_BUFFER_SIZE` | Determine percentage of reallocation size when `msgpack` to `json` conversion buffer runs out of memory. | `0.1` |
 
-### Input Plugins
+### Input plugins
 
-The _input plugins_ provides certain features to gather information from a specific source type which can be a network interface, some built-in metric or through a specific input device, the following input plugins are available:
+Input plugins gather information from a specific source type like network interfaces, some built-in metrics, or through a specific input device. The following input plugins are available:
 
-| option | description | default |
-| :--- | :--- | :--- |
-| [FLB\_IN\_COLLECTD](../../pipeline/inputs/collectd.md) | Enable Collectd input plugin | On |
-| [FLB\_IN\_CPU](../../pipeline/inputs/cpu-metrics.md) | Enable CPU input plugin | On |
-| [FLB\_IN\_DISK](../../pipeline/inputs/disk-io-metrics.md) | Enable Disk I/O Metrics input plugin | On |
-| [FLB\_IN\_DOCKER](../../pipeline/inputs/docker-events.md) | Enable Docker metrics input plugin | On |
-| [FLB\_IN\_EXEC](../../pipeline/inputs/exec.md) | Enable Exec input plugin | On |
-| [FLB\_IN\_EXEC\_WASI](../../pipeline/inputs/exec-wasi.md) | Enable Exec WASI input plugin | On |
-| [FLB_IN_FLUENTBIT_METRICS](../../pipeline/inputs/fluentbit-metrics.md) | Enable Fluent Bit metrics input plugin | On |
-| [FLB\_IN\_ELASTICSEARCH](../../pipeline/inputs/elasticsearch.md) | Enable Elasticsearch/OpenSearch Bulk input plugin | On |
-| [FLB\_IN\_FORWARD](../../pipeline/inputs/forward.md) | Enable Forward input plugin | On |
-| [FLB\_IN\_HEAD](../../pipeline/inputs/head.md) | Enable Head input plugin | On |
-| [FLB\_IN\_HEALTH](../../pipeline/inputs/health.md) | Enable Health input plugin | On |
-| [FLB\_IN\_KMSG](../../pipeline/inputs/kernel-logs.md) | Enable Kernel log input plugin | On |
-| [FLB\_IN\_MEM](../../pipeline/inputs/memory-metrics.md) | Enable Memory input plugin | On |
-| [FLB\_IN\_MQTT](../../pipeline/inputs/mqtt.md) | Enable MQTT Server input plugin | On |
-| [FLB\_IN\_NETIF](../../pipeline/inputs/network-io-metrics.md) | Enable Network I/O metrics input plugin | On |
-| [FLB\_IN\_PROC](../../pipeline/inputs/process.md) | Enable Process monitoring input plugin | On |
-| [FLB\_IN\_RANDOM](../../pipeline/inputs/random.md) | Enable Random input plugin | On |
-| [FLB\_IN\_SERIAL](../../pipeline/inputs/serial-interface.md) | Enable Serial input plugin | On |
-| [FLB\_IN\_STDIN](../../pipeline/inputs/standard-input.md) | Enable Standard input plugin | On |
-| [FLB\_IN\_SYSLOG](../../pipeline/inputs/syslog.md) | Enable Syslog input plugin | On |
-| [FLB\_IN\_SYSTEMD](../../pipeline/inputs/systemd.md) | Enable Systemd / Journald input plugin | On |
-| [FLB\_IN\_TAIL](../../pipeline/inputs/tail.md) | Enable Tail \(follow files\) input plugin | On |
-| [FLB\_IN\_TCP](../../pipeline/inputs/tcp.md) | Enable TCP input plugin | On |
-| [FLB\_IN\_THERMAL](../../pipeline/inputs/thermal.md) | Enable system temperature\(s\) input plugin | On |
-| [FLB\_IN\_UDP](../../pipeline/inputs/udp.md) | Enable UDP input plugin | On |
-| [FLB\_IN\_WINLOG](../../pipeline/inputs/windows-event-log.md) | Enable Windows Event Log input plugin \(Windows Only\) | On |
-| [FLB\_IN\_WINEVTLOG](../../pipeline/inputs/windows-event-log-winevtlog.md) | Enable Windows Event Log input plugin using winevt.h API \(Windows Only\) | On |
-
-### Filter Plugins
-
-The _filter plugins_ allows to modify, enrich or drop records. The following table describes the filters available on this version:
-
-| option | description | default |
+| Option | Description | Default |
 | :--- | :--- | :--- |
-| [FLB\_FILTER\_AWS](../../pipeline/filters/aws-metadata.md) | Enable AWS metadata filter | On |
-| [FLB\_FILTER\_ECS](../../pipeline/filters/ecs-metadata.md) | Enable AWS metadata filter | On |
-| FLB\_FILTER\_EXPECT | Enable Expect data test filter | On |
-| [FLB\_FILTER\_GREP](../../pipeline/filters/grep.md) | Enable Grep filter | On |
-| [FLB\_FILTER\_KUBERNETES](../../pipeline/filters/kubernetes.md) | Enable Kubernetes metadata filter | On |
-| [FLB\_FILTER\_LUA](../../pipeline/filters/lua.md) | Enable Lua scripting filter | On |
-| [FLB\_FILTER\_MODIFY](../../pipeline/filters/modify.md) | Enable Modify filter | On |
-| [FLB\_FILTER\_NEST](../../pipeline/filters/nest.md) | Enable Nest filter | On |
-| [FLB\_FILTER\_PARSER](../../pipeline/filters/parser.md) | Enable Parser filter | On |
-| [FLB\_FILTER\_RECORD\_MODIFIER](../../pipeline/filters/record-modifier.md) | Enable Record Modifier filter | On |
-| [FLB\_FILTER\_REWRITE\_TAG](../../pipeline/filters/rewrite-tag.md) | Enable Rewrite Tag filter | On |
-| [FLB\_FILTER\_STDOUT](../../pipeline/filters/standard-output.md) | Enable Stdout filter | On |
-| [FLB\_FILTER\_SYSINFO](../../pipeline/filters/sysinfo.md) | Enable Sysinfo filter | On |
-| [FLB\_FILTER\_THROTTLE](../../pipeline/filters/throttle.md) | Enable Throttle filter | On |
-| [FLB\_FILTER\_TYPE\_CONVERTER](../../pipeline/filters/type-converter.md) | Enable Type Converter filter | On |
-| [FLB\_FILTER\_WASM](../../pipeline/filters/wasm.md) | Enable WASM filter | On |
-
-### Output Plugins
-
-The _output plugins_ gives the capacity to flush the information to some external interface, service or terminal, the following table describes the output plugins available as of this version:
-
-| option | description | default |
+| [`FLB_IN_COLLECTD`](../../pipeline/inputs/collectd.md) | Enable Collectd input plugin | `On` |
+| [`FLB_IN_CPU`](../../pipeline/inputs/cpu-metrics.md) | Enable CPU input plugin | `On` |
+| [`FLB_IN_DISK`](../../pipeline/inputs/disk-io-metrics.md) | Enable Disk I/O Metrics input plugin | `On` |
+| [`FLB_IN_DOCKER`](../../pipeline/inputs/docker-events.md) | Enable Docker metrics input plugin | `On` |
+| [`FLB_IN_EXEC`](../../pipeline/inputs/exec.md) | Enable Exec input plugin | `On` |
+| [`FLB_IN_EXEC_WASI`](../../pipeline/inputs/exec-wasi.md) | Enable Exec WASI input plugin | `On` |
+| [`FLB_IN_FLUENTBIT_METRICS`](../../pipeline/inputs/fluentbit-metrics.md) | Enable Fluent Bit metrics input plugin | `On` |
+| [`FLB_IN_ELASTICSEARCH`](../../pipeline/inputs/elasticsearch.md) | Enable Elasticsearch/OpenSearch Bulk input plugin | `On` |
+| [`FLB_IN_FORWARD`](../../pipeline/inputs/forward.md) | Enable Forward input plugin | `On` |
+| [`FLB_IN_HEAD`](../../pipeline/inputs/head.md) | Enable Head input plugin | `On` |
+| [`FLB_IN_HEALTH`](../../pipeline/inputs/health.md) | Enable Health input plugin | `On` |
+| [`FLB_IN_KMSG`](../../pipeline/inputs/kernel-logs.md) | Enable Kernel log input plugin | `On` |
+| [`FLB_IN_MEM`](../../pipeline/inputs/memory-metrics.md) | Enable Memory input plugin | `On` |
+| [`FLB_IN_MQTT`](../../pipeline/inputs/mqtt.md) | Enable MQTT Server input plugin | `On` |
+| [`FLB_IN_NETIF`](../../pipeline/inputs/network-io-metrics.md) | Enable Network I/O metrics input plugin | `On` |
+| [`FLB_IN_PROC`](../../pipeline/inputs/process.md) | Enable Process monitoring input plugin | `On` |
+| [`FLB_IN_RANDOM`](../../pipeline/inputs/random.md) | Enable Random input plugin | `On` |
+| [`FLB_IN_SERIAL`](../../pipeline/inputs/serial-interface.md) | Enable Serial input plugin | `On` |
+| [`FLB_IN_STDIN`](../../pipeline/inputs/standard-input.md) | Enable Standard input plugin | `On` |
+| [`FLB_IN_SYSLOG`](../../pipeline/inputs/syslog.md) | Enable Syslog input plugin | `On` |
+| [`FLB_IN_SYSTEMD`](../../pipeline/inputs/systemd.md) | Enable Systemd / Journald input plugin | `On` |
+| [`FLB_IN_TAIL`](../../pipeline/inputs/tail.md) | Enable Tail (follow files) input plugin | `On` |
+| [`FLB_IN_TCP`](../../pipeline/inputs/tcp.md) | Enable TCP input plugin | `On` |
+| [`FLB_IN_THERMAL`](../../pipeline/inputs/thermal.md) | Enable system temperature input plugin | `On` |
+| [`FLB_IN_UDP`](../../pipeline/inputs/udp.md) | Enable UDP input plugin | `On` |
+| [`FLB_IN_WINLOG`](../../pipeline/inputs/windows-event-log.md) | Enable Windows Event Log input plugin (Windows Only) | `On` |
+| [`FLB_IN_WINEVTLOG`](../../pipeline/inputs/windows-event-log-winevtlog.md) | Enable Windows Event Log input plugin using `winevt.h` API (Windows Only) | `On` |
+
+### Filter plugins
+
+Filter plugins let you modify, enrich or drop records. The following table describes the filters available on this version:
+
+| Option | Description | Default |
 | :--- | :--- | :--- |
-| [FLB\_OUT\_AZURE](../../pipeline/outputs/azure.md) | Enable Microsoft Azure output plugin | On |
-| [FLB\_OUT\_AZURE\_KUSTO](../../pipeline/outputs/azure_kusto.md) | Enable Azure Kusto output plugin | On |
-| [FLB\_OUT\_BIGQUERY](../../pipeline/outputs/bigquery.md) | Enable Google BigQuery output plugin | On |
-| [FLB\_OUT\_COUNTER](../../pipeline/outputs/counter.md) | Enable Counter output plugin | On |
-| [FLB\_OUT\_CLOUDWATCH\_LOGS](../../pipeline/outputs/cloudwatch.md) | Enable Amazon CloudWatch output plugin | On |
-| [FLB\_OUT\_DATADOG](../../pipeline/outputs/datadog.md) | Enable Datadog output plugin | On |
-| [FLB\_OUT\_ES](../../pipeline/outputs/elasticsearch.md) | Enable [Elastic Search](http://www.elastic.co) output plugin | On |
-| [FLB\_OUT\_FILE](../../pipeline/outputs/file.md) | Enable File output plugin | On |
-| [FLB\_OUT\_KINESIS\_FIREHOSE](../../pipeline/outputs/firehose.md) | Enable Amazon Kinesis Data Firehose output plugin | On |
-| [FLB\_OUT\_KINESIS\_STREAMS](../../pipeline/outputs/kinesis.md) | Enable Amazon Kinesis Data Streams output plugin | On |
-| [FLB\_OUT\_FLOWCOUNTER](../../pipeline/outputs/flowcounter.md) | Enable Flowcounter output plugin | On |
-| [FLB\_OUT\_FORWARD](../../pipeline/outputs/forward.md) | Enable [Fluentd](http://www.fluentd.org) output plugin | On |
-| [FLB\_OUT\_GELF](../../pipeline/outputs/gelf.md) | Enable Gelf output plugin | On |
-| [FLB\_OUT\_HTTP](../../pipeline/outputs/http.md) | Enable HTTP output plugin | On |
-| [FLB\_OUT\_INFLUXDB](../../pipeline/outputs/influxdb.md) | Enable InfluxDB output plugin | On |
-| [FLB\_OUT\_KAFKA](../../pipeline/outputs/kafka.md) | Enable Kafka output | Off |
-| [FLB\_OUT\_KAFKA\_REST](../../pipeline/outputs/kafka-rest-proxy.md) | Enable Kafka REST Proxy output plugin | On |
-| FLB\_OUT\_LIB | Enable Lib output plugin | On |
-| [FLB\_OUT\_NATS](../../pipeline/outputs/nats.md) | Enable [NATS](http://www.nats.io) output plugin | On |
-| FLB\_OUT\_NULL | Enable NULL output plugin | On |
-| FLB\_OUT\_PGSQL | Enable PostgreSQL output plugin | On |
-| FLB\_OUT\_PLOT | Enable Plot output plugin | On |
-| FLB\_OUT\_SLACK | Enable Slack output plugin | On |
-| [FLB\_OUT\_S3](../../pipeline/outputs/s3.md) | Enable Amazon S3 output plugin | On |
-| [FLB\_OUT\_SPLUNK](../../pipeline/outputs/splunk.md) | Enable Splunk output plugin | On |
-| [FLB\_OUT\_STACKDRIVER](../../pipeline/outputs/stackdriver.md) | Enable Google Stackdriver output plugin | On |
-| [FLB\_OUT\_STDOUT](build-and-install.md) | Enable STDOUT output plugin | On |
-| FLB\_OUT\_TCP | Enable TCP/TLS output plugin | On |
-| [FLB\_OUT\_TD](../../pipeline/outputs/treasure-data.md) | Enable [Treasure Data](http://www.treasuredata.com) output plugin | On |
-
-### Processor Plugins
-
-The _processor plugins_ provide the capability to handle the events within the processor pipelines to allow modifying, enrich or drop events. 
-The following table describes the processors available on this version:
-
-| option | description | default |
+| [`FLB_FILTER_AWS`](../../pipeline/filters/aws-metadata.md) | Enable AWS metadata filter | `On` |
+| [`FLB_FILTER_ECS`](../../pipeline/filters/ecs-metadata.md) | Enable AWS metadata filter | `On` |
+| `FLB_FILTER_EXPECT` | Enable Expect data test filter | `On` |
+| [`FLB_FILTER_GREP`](../../pipeline/filters/grep.md) | Enable Grep filter | `On` |
+| [`FLB_FILTER_KUBERNETES`](../../pipeline/filters/kubernetes.md) | Enable Kubernetes metadata filter | `On` |
+| [`FLB_FILTER_LUA`](../../pipeline/filters/lua.md) | Enable Lua scripting filter | `On` |
+| [`FLB_FILTER_MODIFY`](../../pipeline/filters/modify.md) | Enable Modify filter | `On` |
+| [`FLB_FILTER_NEST`](../../pipeline/filters/nest.md) | Enable Nest filter | `On` |
+| [`FLB_FILTER_PARSER`](../../pipeline/filters/parser.md) | Enable Parser filter | `On` |
+| [`FLB_FILTER_RECORD_MODIFIER`](../../pipeline/filters/record-modifier.md) | Enable Record Modifier filter | `On` |
+| [`FLB_FILTER_REWRITE_TAG`](../../pipeline/filters/rewrite-tag.md) | Enable Rewrite Tag filter | `On` |
+| [`FLB_FILTER_STDOUT`](../../pipeline/filters/standard-output.md) | Enable Stdout filter | `On` |
+| [`FLB_FILTER_SYSINFO`](../../pipeline/filters/sysinfo.md) | Enable Sysinfo filter | `On` |
+| [`FLB_FILTER_THROTTLE`](../../pipeline/filters/throttle.md) | Enable Throttle filter | `On` |
+| [`FLB_FILTER_TYPE_CONVERTER`](../../pipeline/filters/type-converter.md) | Enable Type Converter filter | `On` |
+| [`FLB_FILTER_WASM`](../../pipeline/filters/wasm.md) | Enable Wasm filter | `On` |
+
+### Output plugins
+
+Output plugins let you flush the information to some external interface, service, or terminal. The following table describes the output plugins available:
+
+| Option | Description | Default |
 | :--- | :--- | :--- |
-| [FLB\_PROCESSOR\_METRICS\_SELECTOR](../../pipeline/processors/metrics-selector.md) | Enable metrics selector processor | On |
+| [`FLB_OUT_AZURE`](../../pipeline/outputs/azure.md) | Enable Microsoft Azure output plugin | `On` |
+| [`FLB_OUT_AZURE_KUSTO`](../../pipeline/outputs/azure_kusto.md) | Enable Azure Kusto output plugin | `On` |
+| [`FLB_OUT_BIGQUERY`](../../pipeline/outputs/bigquery.md) | Enable Google BigQuery output plugin | `On` |
+| [`FLB_OUT_COUNTER`](../../pipeline/outputs/counter.md) | Enable Counter output plugin | `On` |
+| [`FLB_OUT_CLOUDWATCH_LOGS`](../../pipeline/outputs/cloudwatch.md) | Enable Amazon CloudWatch output plugin | `On` |
+| [`FLB_OUT_DATADOG`](../../pipeline/outputs/datadog.md) | Enable Datadog output plugin | `On` |
+| [`FLB_OUT_ES`](../../pipeline/outputs/elasticsearch.md) | Enable [Elastic Search](http://www.elastic.co) output plugin | `On` |
+| [`FLB_OUT_FILE`](../../pipeline/outputs/file.md) | Enable File output plugin | `On` |
+| [`FLB_OUT_KINESIS_FIREHOSE`](../../pipeline/outputs/firehose.md) | Enable Amazon Kinesis Data Firehose output plugin | `On` |
+| [`FLB_OUT_KINESIS_STREAMS`](../../pipeline/outputs/kinesis.md) | Enable Amazon Kinesis Data Streams output plugin | `On` |
+| [`FLB_OUT_FLOWCOUNTER`](../../pipeline/outputs/flowcounter.md) | Enable Flow counter output plugin | `On` |
+| [`FLB_OUT_FORWARD`](../../pipeline/outputs/forward.md) | Enable [Fluentd](http://www.fluentd.org) output plugin | `On` |
+| [`FLB_OUT_GELF`](../../pipeline/outputs/gelf.md) | Enable GELF output plugin | `On` |
+| [`FLB_OUT_HTTP`](../../pipeline/outputs/http.md) | Enable HTTP output plugin | `On` |
+| [`FLB_OUT_INFLUXDB`](../../pipeline/outputs/influxdb.md) | Enable InfluxDB output plugin | `On` |
+| [`FLB_OUT_KAFKA`](../../pipeline/outputs/kafka.md) | Enable Kafka output | Off |
+| [`FLB_OUT_KAFKA_REST`](../../pipeline/outputs/kafka-rest-proxy.md) | Enable Kafka REST Proxy output plugin | `On` |
+| `FLB_OUT_LIB` | Enable Lib output plugin | `On` |
+| [`FLB_OUT_NATS`](../../pipeline/outputs/nats.md) | Enable [NATS](http://www.nats.io) output plugin | `On` |
+| `FLB_OUT_NULL` | Enable `NULL` output plugin | `On` |
+| `FLB_OUT_PGSQL` | Enable PostgreSQL output plugin | `On` |
+| `FLB_OUT_PLOT` | Enable Plot output plugin | `On` |
+| `FLB_OUT_SLACK` | Enable Slack output plugin | `On` |
+| [`FLB_OUT_S3`](../../pipeline/outputs/s3.md) | Enable Amazon S3 output plugin | `On` |
+| [`FLB_OUT_SPLUNK`](../../pipeline/outputs/splunk.md) | Enable Splunk output plugin | `On` |
+| [`FLB_OUT_STACKDRIVER`](../../pipeline/outputs/stackdriver.md) | Enable Google Stackdriver output plugin | `On` |
+| [`FLB_OUT_STDOUT`](build-and-install.md) | Enable STDOUT output plugin | `On` |
+| `FLB_OUT_TCP` | Enable TCP/TLS output plugin | `On` |
+| [`FLB_OUT_TD`](../../pipeline/outputs/treasure-data.md) | Enable [Treasure Data](http://www.treasuredata.com) output plugin | `On` |
+
+### Processor plugins
+
+Processor plugins handle the events within the processor pipelines to allow modifying, enriching, or dropping events.
+
+The following table describes the processors available:
+
+| Option | Description | Default || :--- | :--- | :--- |
+| [`FLB_PROCESSOR_METRICS_SELECTOR`](../../pipeline/processors/metrics-selector.md) | Enable metrics selector processor | `On` |
+| [`FLB_PROCESSOR_LABELS`](../../pipeline/processors/labels.md) | Enable metrics label manipulation processor | `On` |
diff --git a/installation/sources/build-with-static-configuration.md b/installation/sources/build-with-static-configuration.md
index 9e1b9dd7f..824e6515e 100644
--- a/installation/sources/build-with-static-configuration.md
+++ b/installation/sources/build-with-static-configuration.md
@@ -1,58 +1,87 @@
-# Build with Static Configuration
+# Build with static configuration
 
-[Fluent Bit](https://fluentbit.io) in normal operation mode allows to be configurable through [text files](https://github.com/fluent/fluent-bit-docs/tree/8ab2f4cda8dfdd8def7fa0cf5c7ffc23069e5a70/installation/configuration/file.md) or using specific arguments in the command line, while this is the ideal deployment case, there are scenarios where a more restricted configuration is required: static configuration mode.
+[Fluent Bit](https://fluentbit.io) in normal operation mode is configurable through text files or using specific arguments in the command line. Although this is the ideal deployment case, there are scenarios where a more restricted configuration is required. Static configuration mode restricts configuration ability.
 
-Static configuration mode aims to include a built-in configuration in the final binary of Fluent Bit, disabling the usage of external files or flags at runtime.
+Static configuration mode includes a built-in configuration in the final binary of Fluent Bit, disabling the usage of external files or flags at runtime.
 
-## Getting Started
+## Get started
 
 ### Requirements
 
-The following steps assumes you are familiar with configuring Fluent Bit using text files and you have experience building it from scratch as described in the [Build and Install](https://github.com/fluent/fluent-bit-docs/tree/8ab2f4cda8dfdd8def7fa0cf5c7ffc23069e5a70/installation/sources/build_install.md) section.
+The following steps assume you are familiar with configuring Fluent Bit using text files and you have experience building it from scratch as described in [Build and Install](build-and-install.md).
 
-#### Configuration Directory
+#### Configuration directory
 
-In your file system prepare a specific directory that will be used as an entry point for the build system to lookup and parse the configuration files. It is mandatory that this directory contain as a minimum one configuration file called _fluent-bit.conf_ containing the required [SERVICE](https://github.com/fluent/fluent-bit-docs/tree/8ab2f4cda8dfdd8def7fa0cf5c7ffc23069e5a70/installation/configuration/file.md#config_section), [INPUT](https://github.com/fluent/fluent-bit-docs/tree/8ab2f4cda8dfdd8def7fa0cf5c7ffc23069e5a70/installation/sources/configuration/file.md#config_input) and [OUTPUT](https://github.com/fluent/fluent-bit-docs/tree/8ab2f4cda8dfdd8def7fa0cf5c7ffc23069e5a70/installation/configuration/file.md#config_output) sections. As an example create a new _fluent-bit.conf_ file with the following content:
+In your file system, prepare a specific directory that will be used as an entry point for the build system to lookup and parse the configuration files. This directory must contain a minimum of one configuration file called `fluent-bit.conf` containing the required [`SERVICE`](/administration/configuring-fluent-bit/yaml/service-section.md), [`INPUT`](/concepts/data-pipeline/input.md), and [`OUTPUT`](/concepts/data-pipeline/output.md) sections.
 
-```python
+As an example, create a new `fluent-bit.yaml` file or `fluent-bit.conf` file:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  daemon: off
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: cpu
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [SERVICE]
-    Flush     1
-    Daemon    off
-    Log_Level info
+  Flush     1
+  Daemon    off
+  Log_Level info
 
 [INPUT]
-    Name      cpu
+  Name      cpu
 
 [OUTPUT]
-    Name      stdout
-    Match     *
+  Name      stdout
+  Match     *
 ```
 
-the configuration provided above will calculate CPU metrics from the running system and print them to the standard output interface.
+{% endtab %}
+{% endtabs %}
 
-#### Build with Custom Configuration
+This configuration calculates CPU metrics from the running system and prints them to the standard output interface.
 
-Inside Fluent Bit source code, get into the build/ directory and run CMake appending the FLB\_STATIC\_CONF option pointing the configuration directory recently created, e.g:
+#### Build with custom configuration
 
-```bash
-$ cd fluent-bit/build/
-$ cmake -DFLB_STATIC_CONF=/path/to/my/confdir/
-```
+1. Go to the Fluent Bit source code build directory:
 
-then build it:
+   ```shell
+   cd fluent-bit/build/
+   ```
 
-```bash
-$ make
-```
+1. Run CMake, appending the `FLB_STATIC_CONF` option pointing to
+   the configuration directory recently created:
 
-At this point the fluent-bit binary generated is ready to run without necessity of further configuration:
+   ```shell
+   cmake -DFLB_STATIC_CONF=/path/to/my/confdir/
+   ```
 
-```bash
-$ bin/fluent-bit 
-Fluent-Bit v0.15.0
-Copyright (C) Treasure Data
+1. Build Fluent Bit:
 
-[2018/10/19 15:32:31] [ info] [engine] started (pid=15186)
-[0] cpu.local: [1539984752.000347547, {"cpu_p"=>0.750000, "user_p"=>0.500000, "system_p"=>0.250000, "cpu0.p_cpu"=>1.000000, "cpu0.p_user"=>1.000000, "cpu0.p_system"=>0.000000, "cpu1.p_cpu"=>0.000000, "cpu1.p_user"=>0.000000, "cpu1.p_system"=>0.000000, "cpu2.p_cpu"=>0.000000, "cpu2.p_user"=>0.000000, "cpu2.p_system"=>0.000000, "cpu3.p_cpu"=>1.000000, "cpu3.p_user"=>1.000000, "cpu3.p_system"=>0.000000}]
-```
+   ```shell
+   make
+   ```
 
+The generated `fluent-bit` binary is ready to run without additional configuration:
+
+```shell
+$ bin/fluent-bit
+
+...
+[0] cpu.local: [1539984752.000347547, {"cpu_p"=>0.750000, "user_p"=>0.500000, "system_p"=>0.250000, "cpu0.p_cpu"=>1.000000, "cpu0.p_user"=>1.000000, "cpu0.p_system"=>0.000000, "cpu1.p_cpu"=>0.000000, "cpu1.p_user"=>0.000000, "cpu1.p_system"=>0.000000, "cpu2.p_cpu"=>0.000000, "cpu2.p_user"=>0.000000, "cpu2.p_system"=>0.000000, "cpu3.p_cpu"=>1.000000, "cpu3.p_user"=>1.000000, "cpu3.p_system"=>0.000000}]
+```
\ No newline at end of file
diff --git a/installation/sources/download-source-code.md b/installation/sources/download-source-code.md
index b82d74098..7282caf9b 100644
--- a/installation/sources/download-source-code.md
+++ b/installation/sources/download-source-code.md
@@ -1,23 +1,26 @@
-# Download Source Code
+# Download source code
+
+You can download the most recent stable or development source code.
 
 ## Stable
 
-For production systems, we strongly suggest that you always get the latest stable release of the source code in either zip or tarball format from Github using the following link pattern:
+For production systems, it's strongly suggested that you get the latest stable release of the source code in either zip file or tarball file format from GitHub using the following link pattern:
 
+```text
 https://github.com/fluent/fluent-bit/archive/refs/tags/v&lt;release version&gt;.tar.gz
 https://github.com/fluent/fluent-bit/archive/refs/tags/v&lt;release version&gt;.zip
+```
 
-For example for version 1.8.12 the link is the following: [https://github.com/fluent/fluent-bit/archive/refs/tags/v1.8.12.tar.gz](https://github.com/fluent/fluent-bit/archive/refs/tags/v1.8.12.tar.gz)
+For example, for version 1.8.12 the link is: [https://github.com/fluent/fluent-bit/archive/refs/tags/v1.8.12.tar.gz](https://github.com/fluent/fluent-bit/archive/refs/tags/v1.8.12.tar.gz)
 
 ## Development
 
-For anyone who aims to contribute to the project by testing or extending the code base, you can get the development version from our GIT repository:
+If you want to contribute to Fluent Bit, you should use the most recent code. You can get the development version from the Git repository:
 
-```bash
-$ git clone https://github.com/fluent/fluent-bit
+```shell
+git clone https://github.com/fluent/fluent-bit
 ```
 
-Note that our _master_ branch is where the development of Fluent Bit happens.
-Since it's a development version, expect issues when compiling or at run time.
+The `master` branch is where the development of Fluent Bit happens. Development version users should expect issues when compiling or at run time.
 
-We encourage everybody to help us testing every development version, at the end this is what will become stable.
+Fluent Bit users are encouraged to help test every development version to ensure a stable release.
\ No newline at end of file
diff --git a/installation/supported-platforms.md b/installation/supported-platforms.md
index 5e919fdba..260759f1f 100644
--- a/installation/supported-platforms.md
+++ b/installation/supported-platforms.md
@@ -1,34 +1,32 @@
-# Supported Platforms
+# Supported platforms
 
-The following operating systems and architectures are supported in Fluent Bit.
+Fluent Bit supports the following operating systems and architectures:
 
 | Operating System | Distribution | Architectures |
 | :--- | :--- | :--- |
-| Linux | [Amazon Linux 2023](linux/amazon-linux.md) | x86\_64, Arm64v8 |
-|  | [Amazon Linux 2](linux/amazon-linux.md) | x86\_64, Arm64v8 |
-|  | [Centos 9 Stream](linux/redhat-centos.md) | x86\_64, Arm64v8 |
-|  | [Centos 8](linux/redhat-centos.md) | x86\_64, Arm64v8 |
-|  | [Centos 7](linux/redhat-centos.md) | x86\_64, Arm64v8 |
-|  | [Rocky Linux 8](linux/redhat-centos.md) | x86\_64, Arm64v8 |
-|  | [Alma Linux 8](linux/redhat-centos.md) | x86\_64, Arm64v8 |
-|  | [Debian 12 \(Bookworm\)](linux/debian.md) | x86\_64, Arm64v8 |
-|  | [Debian 11 \(Bullseye\)](linux/debian.md) | x86\_64, Arm64v8 |
-|  | [Debian 10 \(Buster\)](linux/debian.md) | x86\_64, Arm64v8 |
-|  | [Ubuntu 24.04 \(Noble Numbat\)](linux/ubuntu.md) | x86\_64, Arm64v8 |
-|  | [Ubuntu 22.04 \(Jammy Jellyfish\)](linux/ubuntu.md) | x86\_64, Arm64v8 |
-|  | [Ubuntu 20.04 \(Focal Fossa\)](linux/ubuntu.md) | x86\_64, Arm64v8 |
-|  | [Ubuntu 18.04 \(Bionic Beaver\)](linux/ubuntu.md) | x86\_64, Arm64v8 |
-|  | [Ubuntu 16.04 \(Xenial Xerus\)](linux/ubuntu.md) | x86\_64 |
-|  | [Raspbian 11 \(Bullseye\)](linux/raspbian-raspberry-pi.md) | Arm32v7 |
-|  | [Raspbian 10 \(Buster\)](linux/raspbian-raspberry-pi.md) | Arm32v7 |
+| Linux | [Amazon Linux 2023](linux/amazon-linux.md) | x86_64, Arm64v8 |
+|  | [Amazon Linux 2](linux/amazon-linux.md) | x86_64, Arm64v8 |
+|  | [CentOS 9 Stream](linux/redhat-centos.md) | x86_64, Arm64v8 |
+|  | [CentOS 8](linux/redhat-centos.md) | x86_64, Arm64v8 |
+|  | [CentOS 7](linux/redhat-centos.md) | x86_64, Arm64v8 |
+|  | [Rocky Linux 8](linux/alma-rocky.md) | x86_64, Arm64v8 |
+|  | [Rocky Linux 9](linux/alma-rocky.md) | x86_64, Arm64v8 |
+|  | [Alma Linux 8](linux/alma-rocky.md) | x86_64, Arm64v8 |
+|  | [Alma Linux 9](linux/alma-rocky.md) | x86_64, Arm64v8 |
+|  | [Debian 12 (Bookworm)](linux/debian.md) | x86_64, Arm64v8 |
+|  | [Debian 11 (Bullseye)](linux/debian.md) | x86_64, Arm64v8 |
+|  | [Debian 10 (Buster)](linux/debian.md) | x86_64, Arm64v8 |
+|  | [Ubuntu 24.04 (Noble Numbat)](linux/ubuntu.md) | x86_64, Arm64v8 |
+|  | [Ubuntu 22.04 (Jammy Jellyfish)](linux/ubuntu.md) | x86_64, Arm64v8 |
+|  | [Raspbian 12 (Bookworm)](linux/raspbian-raspberry-pi.md) | Arm32v7 |
 | macOS | * | x86_64, Apple M1 |
-| Windows | [Windows Server 2019](windows.md) | x86\_64, x86 |
-|  | [Windows 10 1903](windows.md) | x86\_64, x86 |
+| Windows | [Windows Server 2019](windows.md) | x86_64, x86 |
+|  | [Windows 10 1903](windows.md) | x86_64, x86 |
 
-From an architecture support perspective, Fluent Bit is fully functional on x86\_64, Arm64v8 and Arm32v7 based processors.
+From an architecture support perspective, Fluent Bit is fully functional on x86_64, Arm64v8, and Arm32v7 based processors.
 
-Fluent Bit can work also on OSX and \*BSD systems, but not all plugins will be available on all platforms.
-Official support will be expanding based on community demand.
-Fluent Bit may run on older operating systems though will need to be built from source, or use custom packages from [enterprise providers](https://fluentbit.io/enterprise).
+Fluent Bit can work also on macOS and Berkeley Software Distribution (BSD) systems, but not all plugins will be available on all platforms.
 
-Fluent Bit is supported on Linux on IBM Z (s390x) environment with some restrictions but only container images are provided for these targets officially.
+Official support is based on community demand. Fluent Bit might run on older operating systems, but must be built from source, or using custom packages from [enterprise providers](https://fluentbit.io/enterprise).
+
+Fluent Bit is supported for Linux on IBM Z (s390x) environments with some restrictions, but only container images are provided for these targets officially.
diff --git a/installation/upgrade-notes.md b/installation/upgrade-notes.md
index 68d21f8cb..e650715f2 100644
--- a/installation/upgrade-notes.md
+++ b/installation/upgrade-notes.md
@@ -1,145 +1,132 @@
-# Upgrade Notes
+# Upgrade notes
 
-The following article cover the relevant notes for users upgrading from previous Fluent Bit versions. We aim to cover compatibility changes that you must be aware of.
+The following article covers the relevant compatibility changes for users upgrading from previous Fluent Bit versions.
 
-For more details about changes on each release please refer to the [Official Release Notes](https://fluentbit.io/announcements/).
+For more details about changes on each release, refer to the [Official Release Notes](https://fluentbit.io/announcements/).
 
-Note: release notes will be prepared in advance of a Git tag for a release so an official release should provide both a tag and a release note together to allow users to verify and understand the release contents.
+Release notes will be prepared in advance of a Git tag for a release. An official release should provide both a tag and a release note together to allow users to verify and understand the release contents.
 
-The tag drives the overall binary release process so release binaries (containers/packages) will appear after a tag and its associated release note.
-This allows users to expect the new release binary to appear and allow/deny/update it as appropriate in their infrastructure.
+The tag drives the binary release process. Release binaries (containers and packages) will appear after a tag and its associated release note. This lets users to expect the new release binary to appear and allow/deny/update it as appropriate in their infrastructure.
 
 ## Fluent Bit v1.9.9
 
-The `td-agent-bit` package is no longer provided after this release.
-Users should switch to the `fluent-bit` package.
+The `td-agent-bit` package is no longer provided after this release. Users should switch to the `fluent-bit` package.
 
 ## Fluent Bit v1.6
 
-If you are migrating from previous version of Fluent Bit please review the following important changes:
+If you are migrating from previous version of Fluent Bit, review the following important changes:
 
-### Tail Input Plugin
+### Tail input plugin
 
-Now by default the plugin follows a file from the end once the service starts \(old behavior was always read from the beginning\). For every file found at start, its followed from it last position, for new files discovered at runtime or rotated, they are read from the beginning.
+By default, the tail input plugin follows a file from the end after the service starts, instead of reading it from the beginning. Every file found when the plugin starts is followed from it last position. New files discovered at runtime or when files rotate are read from the beginning.
 
-If you desire to keep the old behavior you can set the option `read_from_head` to true.
+To keep the old behavior, set the option `read_from_head` to `true`.
 
-### Stackdriver Output Plugin
+### Stackdriver output plugin
 
-The project\_id of [resource](https://cloud.google.com/logging/docs/reference/v2/rest/v2/MonitoredResource) in [LogEntry](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry) sent to Google Cloud Logging would be set to the project ID rather than the project number. To learn the difference between Project ID and project number, see [this](https://cloud.google.com/resource-manager/docs/creating-managing-projects#before_you_begin) for more details.
+The `project_id` of [resource](https://cloud.google.com/logging/docs/reference/v2/rest/v2/MonitoredResource) in [LogEntry](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry) sent to Google Cloud Logging would be set to the `project_id` rather than the project number. To learn the difference between Project ID and project number, see [Creating and managing projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects#before_you_begin).
 
-If you have any existing queries based on the resource's project\_id, please update your query accordingly.
+If you have existing queries based on the resource's `project_id,` update your query accordingly.
 
 ## Fluent Bit v1.5
 
 The migration from v1.4 to v1.5 is pretty straightforward.
 
-* If you enabled `keepalive` mode in your configuration, note that this configuration property has been renamed to `net.keepalive`. Now all Network I/O keepalive is enabled by default, to learn more about this and other associated configuration properties read the [Networking Administration](https://docs.fluentbit.io/manual/administration/networking#tcp-keepalive) section.
-* If you use the Elasticsearch output plugin, note the default value of `type` [changed from `flb_type` to `_doc`](https://github.com/fluent/fluent-bit/commit/04ed3d8104ca8a2f491453777ae6e38e5377817e#diff-c9ae115d3acaceac5efb949edbb21196). Many versions of Elasticsearch will tolerate this, but ES v5.6 through v6.1 require a type _without_ a leading underscore. See the [Elasticsearch output plugin documentation FAQ entry](https://docs.fluentbit.io/manual/pipeline/outputs/elasticsearch#faq-underscore) for more.
+- The `keepalive` configuration mode has been renamed to `net.keepalive`. Now, all Network I/O keepalive is enabled by default. To learn more about this and other associated configuration properties read the [Networking Administration](https://docs.fluentbit.io/manual/administration/networking#tcp-keepalive) section. - If you use the Elasticsearch output plugin, the default value of `type` [changed from `flb_type` to `_doc`](https://github.com/fluent/fluent-bit/commit/04ed3d8104ca8a2f491453777ae6e38e5377817e#diff-c9ae115d3acaceac5efb949edbb21196). Many versions of Elasticsearch tolerate this, but Elasticsearch v5.6 through v6.1 require a `type` without a leading underscore. See the [Elasticsearch output plugin documentation FAQ entry](https://docs.fluentbit.io/manual/pipeline/outputs/elasticsearch#faq-underscore) for more.
 
 ## Fluent Bit v1.4
 
-If you are migrating from Fluent Bit v1.3, there are no breaking changes. Just new exciting features to enjoy :\)
+If you are migrating from Fluent Bit v1.3, there are no breaking changes.
 
 ## Fluent Bit v1.3
 
-If you are migrating from Fluent Bit v1.2 to v1.3, there are no breaking changes. If you are upgrading from an older version please review the incremental changes below.
+If you are migrating from Fluent Bit v1.2 to v1.3, there are no breaking changes. If you are upgrading from an older version, review the following incremental changes:
 
 ## Fluent Bit v1.2
 
-### Docker, JSON, Parsers and Decoders
+### Docker, JSON, parsers, and decoders
 
-On Fluent Bit v1.2 we have fixed many issues associated with JSON encoding and decoding, for hence when parsing Docker logs **is no longer necessary** to use decoders. The new Docker parser looks like this:
+Fluent Bit v1.2 fixed many issues associated with JSON encoding and decoding.
+
+For example, when parsing Docker logs, it's no longer necessary to use decoders. The new Docker parser looks like this:
 
 ```text
-[PARSER]
-    Name         docker
-    Format       json
-    Time_Key     time
-    Time_Format  %Y-%m-%dT%H:%M:%S.%L
-    Time_Keep    On
+[PARSER] 
+  Name        docker 
+  Format      json 
+  Time_Key    time 
+  Time_Format %Y-%m-%dT%H:%M:%S.%L 
+  Time_Keep   On 
 ```
 
-> Note: again, do not use decoders.
-
-### Kubernetes Filter
+### Kubernetes filter
 
-We have done improvements also on how Kubernetes Filter handle the stringified _log_ message. If the option _Merge\_Log_ is enabled, it will try to handle the log content as a JSON map, if so, it will add the keys to the root map.
+Fluent Bit made improvements to Kubernetes Filter handling of stringified `log` messages. If the `Merge_Log` option is enabled, it will try to handle the log content as a JSON map, if so, it will add the keys to the root map.
 
-In addition, we have fixed and improved the option called _Merge\_Log\_Key_. If a merge log succeed, all new keys will be packaged under the key specified by this option, a suggested configuration is as follows:
+In addition, fixes and improvements were made to the `Merge_Log_Key` option. If a merge log succeed, all new keys will be packaged under the key specified by this option. A suggested configuration is as follows:
 
-```text
-[FILTER]
-    Name             Kubernetes
-    Match            kube.*
-    Kube_Tag_Prefix  kube.var.log.containers.
-    Merge_Log        On
-    Merge_Log_Key    log_processed
+```text 
+[FILTER] 
+  Name Kubernetes 
+  Match kube.* 
+  Kube_Tag_Prefix kube.var.log.containers. 
+  Merge_Log On 
+  Merge_Log_Key log_processed 
 ```
 
 As an example, if the original log content is the following map:
 
-```javascript
-{"key1": "val1", "key2": "val2"}
+```json
+{"key1": "val1", "key2": "val2"} 
 ```
 
 the final record will be composed as follows:
 
-```javascript
-{
-    "log": "{\"key1\": \"val1\", \"key2\": \"val2\"}",
-    "log_processed": {
-        "key1": "val1",
-        "key2": "val2"
-    }
-}
+```json 
+{"log": "{\"key1\": \"val1\", \"key2\": \"val2\"}", "log_processed": { "key1": "val1", "key2": "val2" } } 
 ```
 
 ## Fluent Bit v1.1
 
-If you are upgrading from **Fluent Bit &lt;= 1.0.x** you should take in consideration the following relevant changes when switching to **Fluent Bit v1.1** series:
+If you are upgrading from Fluent Bit 1.0.x or earlier, review the following relevant changes when switching to Fluent Bit v1.1 or later series:
 
-### Kubernetes Filter
+### Kubernetes filter
 
-We introduced a new configuration property called _Kube\_Tag\_Prefix_ to help Tag prefix resolution and address an unexpected behavior that landed in previous versions.
+Fluent Bit introduced a new configuration property called `Kube_Tag_Prefix` to help Tag prefix resolution and address an unexpected behavior in previous versions.
 
-During 1.0.x release cycle, a commit in Tail input plugin changed the default behavior on how the Tag was composed when using the wildcard for expansion generating breaking compatibility with other services. Consider the following configuration example:
+During the `1.0.x` release cycle, a commit in the Tail input plugin changed the default behavior on how the Tag was composed when using the wildcard for expansion generating breaking compatibility with other services. Consider the following configuration example:
 
-```text
-[INPUT]
-    Name  tail
-    Path  /var/log/containers/*.log
-    Tag   kube.*
+```text 
+[INPUT] 
+  Name tail 
+  Path /var/log/containers/*.log 
+  Tag kube.* 
 ```
 
 The expected behavior is that Tag will be expanded to:
 
-```text
-kube.var.log.containers.apache.log
-```
+```text kube.var.log.containers.apache.log ```
 
-but the change introduced in 1.0 series switched from absolute path to the base file name only:
+The change introduced in the 1.0 series switched from absolute path to the base filename only:
 
-```text
-kube.apache.log
-```
+```text kube.apache.log ```
 
-On Fluent Bit v1.1 release we restored to our default behavior and now the Tag is composed using the absolute path of the monitored file.
+THe Fluent Bit v1.1 release restored the default behavior and now the Tag is composed using the absolute path of the monitored file.
 
-> Having absolute path in the Tag is relevant for routing and flexible configuration where it also helps to keep compatibility with Fluentd behavior.
+Having absolute path in the Tag is relevant for routing and flexible configuration where it also helps to keep compatibility with Fluentd behavior.
 
-This behavior switch in Tail input plugin affects how Filter Kubernetes operates. As you know when the filter is used it needs to perform local metadata lookup that comes from the file names when using Tail as a source. Now with the new _Kube\_Tag\_Prefix_ option you can specify what's the prefix used in Tail input plugin, for the configuration example above the new configuration will look as follows:
+This behavior switch in Tail input plugin affects how Filter Kubernetes operates. When the filter is used it needs to perform local metadata lookup that comes from the file names when using Tail as a source. With the new `Kube_Tag_Prefix` option you can specify the prefix used in the Tail input plugin. For the previous configuration example the new configuration will look like:
 
-```text
-[INPUT]
-    Name  tail
-    Path  /var/log/containers/*.log
-    Tag   kube.*
-
-[FILTER]
-    Name             kubernetes
-    Match            *
-    Kube_Tag_Prefix  kube.var.log.containers.
+```text 
+[INPUT] 
+  Name tail 
+  Path /var/log/containers/*.log 
+  Tag kube.*
+
+[FILTER] 
+  Name kubernetes 
+  Match * 
+  Kube_Tag_Prefix kube.var.log.containers. 
 ```
 
-So the proper for _Kube\_Tag\_Prefix_ value must be composed by Tag prefix set in Tail input plugin plus the converted monitored directory replacing slashes with dots.
+The proper value for `Kube_Tag_Prefix` must be composed by Tag prefix set in Tail input plugin plus the converted monitored directory replacing slashes with dots.
\ No newline at end of file
diff --git a/installation/windows.md b/installation/windows.md
index ab49d847c..8d155139a 100644
--- a/installation/windows.md
+++ b/installation/windows.md
@@ -1,201 +1,226 @@
 # Windows
 
-Fluent Bit is distributed as **fluent-bit** package for Windows and as a [Windows container on Docker Hub](docker.md). Fluent Bit has two flavours of Windows installers: a ZIP archive (for quick testing) and an EXE installer (for system installation).
+Fluent Bit is distributed as the `fluent-bit` package for Windows and as a [Windows container on Docker Hub](docker.md). Fluent Bit provides two Windows installers: a `ZIP` archive and an `EXE` installer.
 
-Not all plugins are supported on Windows: the [CMake configuration](https://github.com/fluent/fluent-bit/blob/master/cmake/windows-setup.cmake) shows the default set of supported plugins.
+Not all plugins are supported on Windows. The [CMake configuration](https://github.com/fluent/fluent-bit/blob/master/cmake/windows-setup.cmake) shows the default set of supported plugins.
 
 ## Configuration
 
-Make sure to provide a valid Windows configuration with the installation, a sample one is shown below:
+Provide a valid Windows configuration with the installation.
+
+The following configuration is an example:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 5
+  daemon: off
+  log_level: info
+  parsers_file: parsers.yaml
+  plugins_file: plugins.yaml
+  http_server: off
+  http_listen: 0.0.0.0
+  http_port: 2020
+  storage.metrics: on
+
+pipeline:
+  inputs:
+    - name: winlog
+      channels: Setup,Windows Powershell
+      interval_sec: 1
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [SERVICE]
-    # Flush
-    # =====
-    # set an interval of seconds before to flush records to a destination
-    flush        5
-
-    # Daemon
-    # ======
-    # instruct Fluent Bit to run in foreground or background mode.
-    daemon       Off
-
-    # Log_Level
-    # =========
-    # Set the verbosity level of the service, values can be:
-    #
-    # - error
-    # - warning
-    # - info
-    # - debug
-    # - trace
-    #
-    # by default 'info' is set, that means it includes 'error' and 'warning'.
-    log_level    info
-
-    # Parsers File
-    # ============
-    # specify an optional 'Parsers' configuration file
-    parsers_file parsers.conf
-
-    # Plugins File
-    # ============
-    # specify an optional 'Plugins' configuration file to load external plugins.
-    plugins_file plugins.conf
-
-    # HTTP Server
-    # ===========
-    # Enable/Disable the built-in HTTP Server for metrics
-    http_server  Off
-    http_listen  0.0.0.0
-    http_port    2020
-
-    # Storage
-    # =======
-    # Fluent Bit can use memory and filesystem buffering based mechanisms
-    #
-    # - https://docs.fluentbit.io/manual/administration/buffering-and-storage
-    #
-    # storage metrics
-    # ---------------
-    # publish storage pipeline metrics in '/api/v1/storage'. The metrics are
-    # exported only if the 'http_server' option is enabled.
-    #
-    storage.metrics on
+  # Flush
+  # =====
+  # set an interval of seconds before to flush records to a destination
+  flush        5
+
+  # Daemon
+  # ======
+  # instruct Fluent Bit to run in foreground or background mode.
+  daemon       Off
+
+  # Log_Level
+  # =========
+  # Set the verbosity level of the service, values can be:
+  #
+  # - error
+  # - warning
+  # - info
+  # - debug
+  # - trace
+  #
+  # by default 'info' is set, that means it includes 'error' and 'warning'.
+  log_level    info
+
+  # Parsers File
+  # ============
+  # specify an optional 'Parsers' configuration file
+  parsers_file parsers.conf
+
+  # Plugins File
+  # ============
+  # specify an optional 'Plugins' configuration file to load external plugins.
+  plugins_file plugins.conf
+
+  # HTTP Server
+  # ===========
+  # Enable/Disable the built-in HTTP Server for metrics
+  http_server  Off
+  http_listen  0.0.0.0
+  http_port    2020
+
+  # Storage
+  # =======
+  # Fluent Bit can use memory and filesystem buffering based mechanisms
+  #
+  # - https://docs.fluentbit.io/manual/administration/buffering-and-storage
+  #
+  # storage metrics
+  # ---------------
+  # publish storage pipeline metrics in '/api/v1/storage'. The metrics are
+  # exported only if the 'http_server' option is enabled.
+  #
+  storage.metrics on
 
 [INPUT]
-    Name         winlog
-    Channels     Setup,Windows PowerShell
-    Interval_Sec 1
+  Name         winlog
+  Channels     Setup,Windows PowerShell
+  Interval_Sec 1
 
 [OUTPUT]
-    name  stdout
-    match *
+  name  stdout
+  match *
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ## Migration to Fluent Bit
 
-From version 1.9, `td-agent-bit` is a deprecated package and was removed after 1.9.9. The correct package name to use now is `fluent-bit`.
+For version 1.9 and later, `td-agent-bit` is a deprecated package and was removed after 1.9.9. The correct package name to use now is `fluent-bit`.
+
+## Installation packages
 
-## Installation Packages
+The latest stable version is 4.0.6.
 
-The latest stable version is 3.0.7.
-Each version is available via the following download URLs.
+<!-- vale off -->
 
-| INSTALLERS                                                                                       | SHA256 CHECKSUMS                                                 |
-| ------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- |
-| [fluent-bit-3.0.7-win32.exe](https://packages.fluentbit.io/windows/fluent-bit-3.0.7-win32.exe) | [cdbb85c4aad135b44af8431db4f5be118478d4dcc393036dd5b51c5ef13abd22](https://packages.fluentbit.io/windows/fluent-bit-3.0.7-win32.exe.sha256) |
-| [fluent-bit-3.0.7-win32.zip](https://packages.fluentbit.io/windows/fluent-bit-3.0.7-win32.zip) | [069e8a03085ad0ff871d6e84400e1f90676d55db417d7b14b8a53fab557ed5a9](https://packages.fluentbit.io/windows/fluent-bit-3.0.7-win32.zip.sha256) |
-| [fluent-bit-3.0.7-win64.exe](https://packages.fluentbit.io/windows/fluent-bit-3.0.7-win64.exe) | [a0cc600f3b745a90b1a8fc3e584ea55bc5988b4f0b508092ade4701dbb52762f](https://packages.fluentbit.io/windows/fluent-bit-3.0.7-win64.exe.sha256) |
-| [fluent-bit-3.0.7-win64.zip](https://packages.fluentbit.io/windows/fluent-bit-3.0.7-win64.zip) | [1d0919178a134f4d56a5e5ca45078600127f76eae3d33aae814b238ef2c29796](https://packages.fluentbit.io/windows/fluent-bit-3.0.7-win64.zip.sha256) |
-| [fluent-bit-3.0.7-winarm64.exe](https://packages.fluentbit.io/windows/fluent-bit-3.0.7-winarm64.exe) | [81d81f081067b15cd4404986a65bfdca59aad26b7b1b05d0b8214d68e14a3b0b](https://packages.fluentbit.io/windows/fluent-bit-3.0.7-winarm64.exe.sha256) |
-| [fluent-bit-3.0.7-winarm64.zip](https://packages.fluentbit.io/windows/fluent-bit-3.0.7-winarm64.zip) | [9c97af63cd149808536babede3162e072da032accedbbe92b755e661292481c6](https://packages.fluentbit.io/windows/fluent-bit-3.0.7-winarm64.zip.sha256) |
+| INSTALLERS | SHA256 CHECKSUMS |
+|----------- | ---------------- |
+| [`fluent-bit-4.0.6-win32.exe`](https://packages.fluentbit.io/windows/fluent-bit-4.0.6-win32.exe) | [844f9a19ec70648f83f0d849e92fe78df5cf4e7fd0c047f45d8b51c5b3acdb46](https://packages.fluentbit.io/windows/fluent-bit-4.0.6-win32.exe.sha256) |
+| [`fluent-bit-4.0.6-win32.zip`](https://packages.fluentbit.io/windows/fluent-bit-4.0.6-win32.zip) | [bb24a9920e55c16dfd4fa96f6a03efa53335a40c21e8541fe0e45102bf281c86](https://packages.fluentbit.io/windows/fluent-bit-4.0.6-win32.zip.sha256) |
+| [`fluent-bit-4.0.6-win64.exe`](https://packages.fluentbit.io/windows/fluent-bit-4.0.6-win64.exe) | [61018ef4d0e6ed37582e16dd4417438a76e8cf9590ac517fd277eb4e45ff4732](https://packages.fluentbit.io/windows/fluent-bit-4.0.6-win64.exe.sha256) |
+| [`fluent-bit-4.0.6-win64.zip`](https://packages.fluentbit.io/windows/fluent-bit-4.0.6-win64.zip) | [63894d7cebd2db9a3697bbf3d66fae6c33ec68496d7132e0cccd06b3e4b28b78](https://packages.fluentbit.io/windows/fluent-bit-4.0.6-win64.zip.sha256) |
+| [`fluent-bit-4.0.6-winarm64.exe`](https://packages.fluentbit.io/windows/fluent-bit-4.0.6-winarm64.exe) | [7e0ccbaf18634ccd0b9cedc137a3905202c715a67d744a21221aa71696371ae3](https://packages.fluentbit.io/windows/fluent-bit-4.0.6-winarm64.exe.sha256) |
+| [`fluent-bit-4.0.6-winarm64.zip`](https://packages.fluentbit.io/windows/fluent-bit-4.0.6-winarm64.zip) | [ebc9d2942ebdf5e406fcf13d8b76df14ca92f5f8c35c35d19a29b8f3fea141e2](https://packages.fluentbit.io/windows/fluent-bit-4.0.6-winarm64.zip.sha256) |
 
-**Note these are now using the Github Actions built versions, the legacy AppVeyor builds are still available (AMD 32/64 only) at releases.fluentbit.io but are deprecated.**
+<!-- vale on -->
+
+These are now using the Github Actions built versions. Legacy AppVeyor builds are still available (AMD 32/64 only) at releases.fluentbit.io but are deprecated.
 
 MSI installers are also available:
 
-- [fluent-bit-3.0.7-win32.msi](https://packages.fluentbit.io/windows/fluent-bit-3.0.7-win32.msi)
-- [fluent-bit-3.0.7-win64.msi](https://packages.fluentbit.io/windows/fluent-bit-3.0.7-win64.msi)
-- [fluent-bit-3.0.7-winarm64.msi](https://packages.fluentbit.io/windows/fluent-bit-3.0.7-winarm64.msi)
+- [`fluent-bit-4.0.6-win32.msi`](https://packages.fluentbit.io/windows/fluent-bit-4.0.6-win32.msi)
+- [`fluent-bit-4.0.6-win64.msi`](https://packages.fluentbit.io/windows/fluent-bit-4.0.6-win64.msi)
+- [`fluent-bit-4.0.6-winarm64.msi`](https://packages.fluentbit.io/windows/fluent-bit-4.0.6-winarm64.msi)
 
-To check the integrity, use `Get-FileHash` cmdlet on PowerShell.
+To check the integrity, use the `Get-FileHash` cmdlet for PowerShell.
 
-```powershell
-PS> Get-FileHash fluent-bit-3.0.7-win32.exe
+```shell
+Get-FileHash fluent-bit-4.0.6-win32.exe
 ```
 
-## Installing from ZIP archive
+## Installing from a ZIP archive
 
-Download a ZIP archive from above. There are installers for 32-bit and 64-bit environments, so choose one suitable for your environment.
+1. Download a ZIP archive. Choose the suitable installers for your 32-bit or 64-bit environments.
 
-Then you need to expand the ZIP archive. You can do this by clicking "Extract All" on Explorer, or if you're using PowerShell, you can use `Expand-Archive` cmdlet.
+1. Expand the ZIP archive. You can do this by clicking **Extract All** in Explorer or `Expand-Archive` in PowerShell.
 
-```powershell
-PS> Expand-Archive fluent-bit-3.0.7-win64.zip
-```
+   ```shell
+   Expand-Archive fluent-bit-4.0.6-win64.zip
+   ```
 
-The ZIP package contains the following set of files.
+   The ZIP package contains the following set of files.
 
-```
-fluent-bit
-├── bin
-│   ├── fluent-bit.dll
-│   └── fluent-bit.exe
-│   └── fluent-bit.pdb
-├── conf
-│   ├── fluent-bit.conf
-│   ├── parsers.conf
-│   └── plugins.conf
-└── include
-    │   ├── flb_api.h
-    │   ├── ...
-    │   └── flb_worker.h
-    └── fluent-bit.h
-```
+   ```text
+   fluent-bit
+   ├── bin
+   │   ├── fluent-bit.dll
+   │   └── fluent-bit.exe
+   │   └── fluent-bit.pdb
+   ├── conf
+   │   ├── fluent-bit.conf
+   │   ├── parsers.conf
+   │   └── plugins.conf
+   └── include
+       │   ├── flb_api.h
+       │   ├── ...
+       │   └── flb_worker.h
+       └── fluent-bit.h
+   ```
 
-Now, launch cmd.exe or PowerShell on your machine, and execute `fluent-bit.exe` as follows.
+1. Launch `cmd.exe` or PowerShell on your machine, and execute `fluent-bit.exe`:
 
-```powershell
-PS> .\bin\fluent-bit.exe -i dummy -o stdout
-```
+   ```shell
+   fluent-bit.exe -i dummy -o stdout
+   ```
+
+The following output indicates Fluent Bit is running:
+
+```shell
+fluent-bit.exe  -i dummy -o stdout
 
-If you see the following output, it's working fine!
-
-```powershell
-PS> .\bin\fluent-bit.exe  -i dummy -o stdout
-Fluent Bit v2.0.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
-
-[2019/06/28 10:13:04] [ info] [storage] initializing...
-[2019/06/28 10:13:04] [ info] [storage] in-memory
-[2019/06/28 10:13:04] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128
-[2019/06/28 10:13:04] [ info] [engine] started (pid=10324)
-[2019/06/28 10:13:04] [ info] [sp] stream processor started
+...
 [0] dummy.0: [1561684385.443823800, {"message"=>"dummy"}]
 [1] dummy.0: [1561684386.428399000, {"message"=>"dummy"}]
 [2] dummy.0: [1561684387.443641900, {"message"=>"dummy"}]
 [3] dummy.0: [1561684388.441405800, {"message"=>"dummy"}]
 ```
 
-To halt the process, press CTRL-C in the terminal.
+To halt the process, press `Control+C` in the terminal.
 
-## Installing from EXE installer
+## Installing from the executable installer
 
-Download an EXE installer from above. It has both 32-bit and 64-bit builds. Choose one which is suitable for you.
+1. Download an `EXE` installer for the appropriate 32-bit or 64-bit build.
+1. Double-click the `EXE` installer you've downloaded. The installation wizard starts.
 
-Double-click the EXE installer you've downloaded. The installation wizard will automatically start.
+1. Click **Next** and finish the installation. By default, Fluent Bit is installed in `C:\Program Files\fluent-bit\`.
 
-![Installation wizard screenshot](<../.gitbook/assets/windows\_installer (1) (1).png>)
-
-Click Next and proceed. By default, Fluent Bit is installed into `C:\Program Files\fluent-bit\`, so you should be able to launch fluent-bit as follows after installation.
-
-```powershell
-PS> C:\Program Files\fluent-bit\bin\fluent-bit.exe -i dummy -o stdout
+```shell
+& "C:\Program Files\fluent-bit\bin\fluent-bit.exe" -i dummy -o stdout
 ```
 
 ### Installer options
 
-The Windows installer is built by \[`CPack` using NSIS([https://cmake.org/cmake/help/latest/cpack\_gen/nsis.html](https://cmake.org/cmake/help/latest/cpack\_gen/nsis.html)) and so supports the [default options](https://nsis.sourceforge.io/Docs/Chapter3.html#3.2.1) that all NSIS installers do for silent installation and the directory to install to.
+The Windows installer is built by [`CPack` using NSIS](https://cmake.org/cmake/help/latest/cpack_gen/nsis.html) and supports the [default NSIS options](https://nsis.sourceforge.io/Docs/Chapter3.html#3.2.1) for silent installation and install directory.
 
 To silently install to `C:\fluent-bit` directory here is an example:
 
-```powershell
-PS> <installer exe> /S /D=C:\fluent-bit
+```shell
+<installer exe> /S /D=C:\fluent-bit
 ```
 
-The uninstaller automatically provided also supports a silent un-install using the same `/S` flag. This may be useful for provisioning with automation like Ansible, Puppet, etc.
+The uninstaller also supports a silent uninstall using the same `/S` flag. This can be used for provisioning with automation like Ansible, Puppet, and so on.
 
-## Windows Service Support
+## Windows service support
 
-Windows services are equivalent to "daemons" in UNIX (i.e. long-running background processes). Since v1.5.0, Fluent Bit has the native support for Windows Service.
+Windows services are equivalent to daemons in Unix (long-running background processes). For v1.5.0 and later, Fluent Bit has native support for Windows services.
 
-Suppose you have the following installation layout:
+For example, you have the following installation layout:
 
-```
+```text
 C:\fluent-bit\
 ├── conf
 │   ├── fluent-bit.conf
@@ -207,63 +232,57 @@ C:\fluent-bit\
     └── fluent-bit.pdb
 ```
 
-To register Fluent Bit as a Windows service, you need to execute the following command on Command Prompt. Please be careful that a single space is required after `binpath=`.
+To register Fluent Bit as a Windows service, execute the following command on at a command prompt. A single space is required after `binpath=`.
 
-```powershell
-% sc.exe create fluent-bit binpath= "\fluent-bit\bin\fluent-bit.exe -c \fluent-bit\conf\fluent-bit.conf"
+```shell
+sc.exe create fluent-bit binpath= "\fluent-bit\bin\fluent-bit.exe -c \fluent-bit\conf\fluent-bit.conf"
 ```
 
-Now Fluent Bit can be started and managed as a normal Windows service.
+Fluent Bit can be started and managed as a normal Windows service.
 
-```powershell
-% sc.exe start fluent-bit
-% sc.exe query fluent-bit
+```shell
+sc.exe start fluent-bit
+sc.exe query fluent-bit
 SERVICE_NAME: fluent-bit
     TYPE               : 10  WIN32_OWN_PROCESS
     STATE              : 4 Running
     ...
 ```
 
-To halt the Fluent Bit service, just execute the "stop" command.
+To halt the Fluent Bit service, use the `stop` command.
 
-```powershell
-% sc.exe stop fluent-bit
+```shell
+sc.exe stop fluent-bit
 ```
 
 To start Fluent Bit automatically on boot, execute the following:
 
-```
-% sc.exe config fluent-bit start= auto
+```shell
+sc.exe config fluent-bit start= auto
 ```
 
-### \[FAQ] Fluent Bit fails to start up when installed under `C:\Program Files`
+## FAQs
 
-Quotations are required if file paths contain spaces. Here is an example:
-
-```
-% sc.exe create fluent-bit binpath= "\"C:\Program Files\fluent-bit\bin\fluent-bit.exe\" -c \"C:\Program Files\fluent-bit\conf\fluent-bit.conf\""
-```
-
-### \[FAQ] How can I manage Fluent Bit service via PowerShell?
+### Can you manage Fluent Bit service using PowerShell?
 
 Instead of `sc.exe`, PowerShell can be used to manage Windows services.
 
 Create a Fluent Bit service:
 
-```powershell
-PS> New-Service fluent-bit -BinaryPathName "C:\fluent-bit\bin\fluent-bit.exe -c C:\fluent-bit\conf\fluent-bit.conf" -StartupType Automatic
+```shell
+New-Service fluent-bit -BinaryPathName "`"C:\Program Files\fluent-bit\bin\fluent-bit.exe`" -c `"C:\Program Files\fluent-bit\conf\fluent-bit.conf`"" -StartupType Automatic -Description "This service runs Fluent Bit, a log collector that enables real-time processing and delivery of log data to centralized logging systems."
 ```
 
 Start the service:
 
-```powershell
-PS> Start-Service fluent-bit
+```shell
+Start-Service fluent-bit
 ```
 
 Query the service status:
 
-```powershell
-PS> get-Service fluent-bit | format-list
+```shell
+get-Service fluent-bit | format-list
 Name                : fluent-bit
 DisplayName         : fluent-bit
 Status              : Running
@@ -277,82 +296,81 @@ ServiceType         : Win32OwnProcess
 
 Stop the service:
 
-```powershell
-PS> Stop-Service fluent-bit
+```shell
+Stop-Service fluent-bit
 ```
 
 Remove the service (requires PowerShell 6.0 or later)
 
-```powershell
-PS> Remove-Service fluent-bit
+```shell
+Remove-Service fluent-bit
 ```
 
-## Compile from Source
+## Compile from source
 
-If you need to create a custom executable, you can use the following procedure to compile Fluent Bit by yourself.
+If you need to create a custom executable, use the following procedure to compile Fluent Bit by yourself.
 
 ### Preparation
 
-First, you need Microsoft Visual C++ to compile Fluent Bit. You can install the minimum toolkit by the following command:
+1. Install Microsoft Visual C++ to compile Fluent Bit. You can install the minimum toolkit using the following command:
 
-```powershell
-PS> wget -o vs.exe https://aka.ms/vs/16/release/vs_buildtools.exe
-PS> start vs.exe
+```shell
+wget -o vs.exe https://aka.ms/vs/16/release/vs_buildtools.exe
+start vs.exe
 ```
 
-When asked which packages to install, choose "C++ Build Tools" (make sure that "C++ CMake tools for Windows" is selected too) and wait until the process finishes.
+1. Choose `C++ Build Tools` and `C++ CMake tools for Windows` and wait until the process finishes.
 
-Also you need to install flex and bison. One way to install them on Windows is to use [winflexbison](https://github.com/lexxmark/winflexbison).
+1. Install flex and bison. One way to install them on Windows is to use [`winflexbison`](https://github.com/lexxmark/winflexbison).
 
-```powershell
-PS> wget -o winflexbison.zip https://github.com/lexxmark/winflexbison/releases/download/v2.5.22/win_flex_bison-2.5.22.zip
-PS> Expand-Archive winflexbison.zip -Destination C:\WinFlexBison
-PS> cp -Path C:\WinFlexBison\win_bison.exe C:\WinFlexBison\bison.exe
-PS> cp -Path C:\WinFlexBison\win_flex.exe C:\WinFlexBison\flex.exe
-```
+   ```shell
+   wget -o winflexbison.zip https://github.com/lexxmark/winflexbison/releases/download/v2.5.22/win_flex_bison-2.5.22.zip
+   Expand-Archive winflexbison.zip -Destination C:\WinFlexBison
+   cp -Path C:\WinFlexBison\win_bison.exe C:\WinFlexBison\bison.exe
+   cp -Path C:\WinFlexBison\win_flex.exe C:\WinFlexBison\flex.exe
+   ```
 
-Add the path `C:\WinFlexBison` to your systems environment variable "Path". [Here's how to do that](https://www.architectryan.com/2018/03/17/add-to-the-path-on-windows-10/).
+1. Add the path `C:\WinFlexBison` to your systems environment variable `Path`. [Here's how to do that](https://www.architectryan.com/2018/03/17/add-to-the-path-on-windows-10/).
 
-It is important to have installed OpenSSL binaries, at least the library files and headers.
+1. Install OpenSSL binaries, at least the library files and headers.
 
-Also you need to install [git](https://git-scm.com/download/win) to pull the source code from the repository.
+1. Install [Git](https://git-scm.com/download/win) to pull the source code from the repository.
 
-```powershell
-PS> wget -o git.exe https://github.com/git-for-windows/git/releases/download/v2.28.0.windows.1/Git-2.28.0-64-bit.exe
-PS> start git.exe
-```
+   ```shell
+   wget -o git.exe https://github.com/git-for-windows/git/releases/download/v2.28.0.windows.1/Git-2.28.0-64-bit.exe
+   start git.exe
+   ```
 
 ### Compilation
 
-Open the start menu on Windows and type "Command Prompt for VS". From the result list select the one  that corresponds to your target system ( x86 or x64).
+1. Open the **Start menu** on Windows and type `command Prompt for VS`. From the result list, select the one that corresponds to your target system ( `x86` or `x64`).
 
-> **Note:** Check that  the  installed OpenSSL library files  match the selected target. You can check the library files by using the **dumpbin** command with the  **/headers** option .
+1. Verify the installed OpenSSL library files match the selected target. You can examine the library files by using the `dumpbin` command with the  `/headers` option.
 
+1. Clone the source code of Fluent Bit.
 
-Clone the source code of Fluent Bit.
+   ```shell
+   git clone https://github.com/fluent/fluent-bit
+   cd fluent-bit/build
+   ```
 
-```powershell
-% git clone https://github.com/fluent/fluent-bit
-% cd fluent-bit/build
-```
-
-Compile the source code.
+1. Compile the source code.
 
-```powershell
-% cmake .. -G "NMake Makefiles"
-% cmake --build .
-```
+   ```shell
+   cmake .. -G "NMake Makefiles"
+   cmake --build .
+   ```
 
 Now you should be able to run Fluent Bit:
 
-```powershell
-% .\bin\debug\fluent-bit.exe -i dummy -o stdout
+```shell
+fluent-bit.exe -i dummy -o stdout
 ```
 
 ### Packaging
 
 To create a ZIP package, call `cpack` as follows:
 
-```powershell
-% cpack -G ZIP
+```shell
+cpack -G ZIP
 ```
diff --git a/installation/yocto-embedded-linux.md b/installation/yocto-embedded-linux.md
index ccb135e72..313d4174d 100644
--- a/installation/yocto-embedded-linux.md
+++ b/installation/yocto-embedded-linux.md
@@ -1,16 +1,16 @@
-# Yocto / Embedded Linux
+# Yocto embedded Linux
 
-[Fluent Bit](https://fluentbit.io) source code provides Bitbake recipes to configure, build and package the software for a Yocto based image. Note that specific steps of usage of these recipes in your Yocto environment \(Poky\) is out of the scope of this documentation.
+[Fluent Bit](https://fluentbit.io) source code provides BitBake recipes to configure, build, and package the software for a Yocto-based image. Specific steps in the usage of these recipes in your Yocto environment (Poky) is out of the scope of this documentation.
 
-We distribute two main recipes, one for testing/dev purposes and other with the latest stable release.
+Fluent Bit distributes two main recipes, one for testing/dev purposes and one with the latest stable release.
 
 | Version | Recipe | Description |
 | :--- | :--- | :--- |
-| devel | [fluent-bit\_git.bb](https://github.com/fluent/fluent-bit/blob/master/fluent-bit_git.bb) | Build Fluent Bit from GIT master. This recipe aims to be used for development and testing purposes only. |
-| v1.8.11 | [fluent-bit\_1.8.11.bb](https://github.com/fluent/fluent-bit/blob/v1.8.11/fluent-bit_1.8.11.bb) | Build latest stable version of Fluent Bit. |
+| `devel` | [fluent-bit_git.bb](https://github.com/fluent/fluent-bit/blob/master/fluent-bit_git.bb) | Build Fluent Bit from Git master. Use for development and testing purposes only. |
+| `v1.8.11` | [fluent-bit_1.8.11.bb](https://github.com/fluent/fluent-bit/blob/v1.8.11/fluent-bit_1.8.11.bb) | Build latest stable version of Fluent Bit. |
 
-It's strongly recommended to always use the stable release of Fluent Bit recipe and not the one from GIT master for production deployments.
+It's strongly recommended to always use the stable release of the Fluent Bit recipe and not the one from Git master for production deployments.
 
 ## Fluent Bit and other architectures
 
-Fluent Bit &gt;= v1.1.x fully supports x86\_64, x86, arm32v7 and arm64v8.
+Fluent Bit 1.1.x and later fully supports `x86_64`, `x86`, `arm32v7`, and `arm64v8`.
diff --git a/local-testing/logging-pipeline.md b/local-testing/logging-pipeline.md
index 5f3202909..8fdc17977 100644
--- a/local-testing/logging-pipeline.md
+++ b/local-testing/logging-pipeline.md
@@ -1,12 +1,29 @@
-# Running a Logging Pipeline Locally
+# Run a logging pipeline locally
 
-You may wish to test a logging pipeline locally to observe how it deals with log messages. The following is a walk-through for running Fluent Bit and Elasticsearch locally with [Docker Compose](https://docs.docker.com/compose/) which can serve as an example for testing other plugins locally.
+You can test logging pipelines locally to observe how they handles log messages. This guide explains how to use [Docker Compose](https://docs.docker.com/compose/) to run Fluent Bit and Elasticsearch locally, but you can use the same principles to test other plugins.
 
-## Create a Configuration File
+## Create a configuration file
 
-Refer to the [Configuration File section](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/configuration-file) to create a configuration to test.
+Start by creating one of the corresponding Fluent Bit configuration files to start testing.
 
-`fluent-bit.conf`:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"top": {".dotted": "value"}}'
+      
+  outputs:       
+    - name: es
+      host: elasticsearch
+      replace_dots: on
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
@@ -19,11 +36,14 @@ Refer to the [Configuration File section](https://docs.fluentbit.io/manual/admin
   Replace_Dots On
 ```
 
-## Docker Compose
+{% endtab %}
+{% endtabs %}
 
-Use [Docker Compose](https://docs.docker.com/compose/) to run Fluent Bit \(with the configuration file mounted\) and Elasticsearch.
+## Use Docker Compose
 
-`docker-compose.yaml`:
+Use [Docker Compose](https://docs.docker.com/compose/) to run Fluent Bit (with the configuration file mounted) and Elasticsearch.
+
+{% code title="docker-compose.yaml" %}
 
 ```yaml
 version: "3.7"
@@ -43,19 +63,22 @@ services:
       - discovery.type=single-node
 ```
 
+{% endcode %}
+
 ## View indexed logs
 
-To view indexed logs run:
+To view indexed logs, run the following command:
 
-```bash
+```shell
 curl "localhost:9200/_search?pretty" \
   -H 'Content-Type: application/json' \
   -d'{ "query": { "match_all": {} }}'
 ```
 
-To "start fresh", delete the index by running:
+## Reset index
 
-```bash
-curl -X DELETE "localhost:9200/fluent-bit?pretty"
-```
+To reset your index, run the following command:
 
+```shell
+curl -X DELETE "localhost:9200/fluent-bit?pretty"
+```
\ No newline at end of file
diff --git a/local-testing/validating-your-data-and-structure.md b/local-testing/validating-your-data-and-structure.md
index 81e3d2e63..0b9b64046 100644
--- a/local-testing/validating-your-data-and-structure.md
+++ b/local-testing/validating-your-data-and-structure.md
@@ -1,57 +1,130 @@
-# Validating your Data and Structure
+# Validate your data and structure
 
-Fluent Bit is a powerful log processing tool that can deal with different sources and formats, in addition it provides several filters that can be used to perform custom modifications. This flexibility is really good but while your pipeline grows, it's strongly recommended to validate your data and structure.
+Fluent Bit supports multiple sources and formats. In addition, it provides filters that you can use to perform custom modifications. As your pipeline grows, it's important to validate your data and structure.
 
-> We encourage Fluent Bit users to integrate data validation in their CI systems
+Fluent Bit users are encouraged to integrate data validation in their continuous integration (CI) systems.
 
-A simplified view of our data processing pipeline is as follows:
+In a normal production environment, inputs, filters, and outputs are defined in configuration files. Fluent Bit provides the [Expect](../pipeline/filters/expect.md) filter, which you can use to validate keys and values from your records and take action when an exception is found.
 
-![](../.gitbook/assets/flb_pipeline_simplified.png)
+A simplified view of the data processing pipeline is as follows:
 
-In a normal production environment, many Inputs, Filters, and Outputs are defined in the configuration, so integrating a continuous validation of your configuration against expected results is a must. For this requirement, Fluent Bit provides a specific Filter called **Expect** which can be used to validate expected Keys and Values from your records and takes some action when an exception is found.
+```mermaid
+flowchart LR
+IS[Inputs / Sources]
+Fil[Filters]
+OD[Outputs / Destination]
+IS --> Fil --> OD
+```
 
-## How it Works
+## Understand structure and configuration
 
-As an example, consider the following pipeline where your source of data is a normal file with JSON content on it and then two filters: [grep](../pipeline/filters/grep.md) to exclude certain records and [record\_modifier](../pipeline/filters/record-modifier.md) to alter the record content adding and removing specific keys.
+Consider the following pipeline, which uses a JSON file as its data source and has two filters:
 
-![](../.gitbook/assets/flb_pipeline_simplified_example_01.png)
+- [Grep](../pipeline/filters/grep.md) to exclude certain records.
+- [Record Modifier](../pipeline/filters/record-modifier.md) to alter records' content by adding and removing specific keys.
 
-Ideally you want to add checkpoints of validation of your data between each step so you can know if your data structure is correct, we do this by using **expect** filter.
+```mermaid
+flowchart LR
+tail["Tail (input)"]
+grep["Grep (filter)"]
+record["Record Modifier (filter)"]
+stdout["Stdout (output)"]
 
-![](../.gitbook/assets/flb_pipeline_simplified_expect.png)
+tail --> grep
+grep --> record
+record --> stdout
+```
 
-Expect filter sets rules that aims to validate certain criteria like:
+Add data validation between each step to ensure your data structure is correct.
+
+This example uses the [Expect](../pipeline/filters/expect.md) filter.
+
+```mermaid
+flowchart LR
+tail["tail (input)"]
+grep["grep (filter)"]
+record["record_modifier (filter)"]
+stdout["stdout  (output)"]
+E1["expect (filter)"]
+E2["expect (filter)"]
+E3["expect (filter)"]
+tail --> E1 --> grep
+grep --> E2 --> record --> E3 --> stdout
+```
 
-* does the record contain a key A ?
-* does the record not contains key A?
-* does the record key A value equals NULL ?
-* does the record key A value a different value than NULL ?
-* does the record key A value equals B ?
+Expect filters set rules aiming to validate criteria like:
 
-Every expect filter configuration can expose specific rules to validate the content of your records, it supports the following configuration properties:
+- Does the record contain key `A`?
+- Does the record not contain key `A`?
+- Does the key `A` value equal `NULL`?
+- Is the key `A` value not `NULL`?
+- Does the key `A` value equal `B`?
 
-| Property | Description |
-| :--- | :--- |
-| key\_exists | Check if a key with a given name exists in the record. |
-| key\_not\_exists | Check if a key does not exist in the record. |
-| key\_val\_is\_null | check that the value of the key is NULL. |
-| key\_val\_is\_not\_null | check that the value of the key is NOT NULL. |
-| key\_val\_eq | check that the value of the key equals the given value in the configuration. |
-| action | action to take when a rule does not match. The available options are  `warn` or `exit`. On `warn`, a warning message is sent to the logging layer when a mismatch of the rules above is found; using `exit` makes Fluent Bit abort with status code `255`. |
+Every Expect filter configuration exposes rules to validate the content of your records using [configuration parameters](../pipeline/filters/expect.md#configuration-parameters).
 
-## Start Testing
+## Test the configuration
 
-Consider the following JSON file called `data.log` with the following content:
+Consider a JSON file `data.log` with the following content:
 
-```javascript
+```text
 {"color": "blue", "label": {"name": null}}
 {"color": "red", "label": {"name": "abc"}, "meta": "data"}
 {"color": "green", "label": {"name": "abc"}, "meta": null}
 ```
 
-The following Fluent Bit configuration file will configure a pipeline to consume the log above apply an expect filter to validate that keys `color` and `label` exists:
+The following files configure a pipeline to consume the log, while applying an Expect filter to validate that the  keys `color` and `label` exist.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+The following is the Fluent Bit YAML configuration file:
+
+```yaml
+service:
+    flush: 1
+    log_level: info
+    parsers_file: parsers.yaml
+
+pipeline:
+    inputs:
+        - name: tail
+          path: data.log
+          parser: json
+          exit_on_eof: on
+
+    # First 'expect' filter to validate that our data was structured properly
+    filters:
+        - name: expect
+          match: '*'
+          key_exists:
+            - color
+            - $label['name']
+          action: exit
+
+    outputs:
+        - name: stdout
+          match: '*'
+```
+
+{% endtab %}
+
+{% tab title="parsers.yaml" %}
+
+The following is the Fluent Bit YAML parsers file:
+
+```yaml
+parsers:
+    - name: json
+      format: json
+```
+
+{% endtab %}
 
-```python
+{% tab title="fluent-bit.conf" %}
+
+The following is the Fluent Bit classic configuration file:
+
+```text
 [SERVICE]
     flush        1
     log_level    info
@@ -76,11 +149,84 @@ The following Fluent Bit configuration file will configure a pipeline to consume
     match       *
 ```
 
-note that if for some reason the JSON parser failed or is missing in the `tail` input \(line 9\), the `expect` filter will trigger the `exit` action. As a test, go ahead and comment out or remove line 9.
+{% endtab %}
+
+{% tab title="parsers.conf" %}
+
+The following is the Fluent Bit classic parsers file:
+
+```text
+[PARSER]
+    Name json
+    Format json
+```
+
+{% endtab %}
+{% endtabs %}
+
+If the JSON parser fails or is missing in the [Tail](../pipeline/inputs/tail.md) input (`parser json`), the Expect filter triggers the `exit` action.
+
+To extend the pipeline, add a Grep filter to match records that map `label` containing a key called `name` with value the `abc`, and add an Expect filter to re-validate that condition:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+The following is the Fluent Bit YAML configuration file:
+
+```yaml
+service:
+    flush: 1
+    log_level: info
+    parsers_file: parsers.yaml
+
+pipeline:
+    inputs:
+        - name: tail
+          path: data.log
+          parser: json
+          exit_on_eof: on
+
+    # First 'expect' filter to validate that our data was structured properly
+    filters:
+        - name: expect
+          match: '*'
+          key_exists:
+            - color
+            - $label['name']
+          action: exit
+
+        # Match records that only contains map 'label' with key 'name' = 'abc'
+        - name: grep
+          match: '*'
+          regex: "$label['name'] ^abc$"
+
+        # Check that every record contains 'label' with a non-null value
+        - name: expect
+          match: '*'
+          key_val_eq: $label['name'] abc
+          action: exit
+
+        # Append a new key to the record using an environment variable
+        - name: record_modifier
+          match: '*'
+          record: hostname ${HOSTNAME}
+
+        # Check that every record contains 'hostname' key
+        - name: expect
+          match: '*'
+          key_exists: hostname
+          action: exit
+
+    outputs:
+        - name: stdout
+          match: '*'
+```
+
+{% endtab %}
 
-As a second step, we will extend our pipeline and we will add a grep filter to match records that map `label` contains a key called `name` with value `abc`, then an expect filter to re-validate that condition:
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [SERVICE]
     flush        1
     log_level    info
@@ -131,7 +277,9 @@ As a second step, we will extend our pipeline and we will add a grep filter to m
     match      *
 ```
 
-## Deploying in Production
+{% endtab %}
+{% endtabs %}
 
-When deploying your configuration in production, you might want to remove the expect filters from your configuration since it's an unnecessary _extra work_ unless you want to have a 100% coverage of checks at runtime.
+## Production deployment
 
+When deploying in production, consider removing any `Expect` filters from your configuration file. These filters are unnecessary unless you need 100% coverage of checks at runtime.
diff --git a/markdownlint.rb b/markdownlint.rb
deleted file mode 100644
index 598a9b5b6..000000000
--- a/markdownlint.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/ruby
-
-# Enable all rules by default
-all
-
-# Extend line length, since each sentence should be on a separate line.
-rule 'MD013', :line_length => 99999, :ignore_code_blocks => true
-
-# Allow in-line HTML
-exclude_rule 'MD033'
-
-# Nested lists should be indented with two spaces.
-rule 'MD007', :indent => 2
-
-# Bash defaulting confuses this and now way to ignore code blocks
-exclude_rule 'MD029'
diff --git a/monitoring/dashboard.json b/monitoring/dashboard.json
index a651d2815..a7ddee797 100644
--- a/monitoring/dashboard.json
+++ b/monitoring/dashboard.json
@@ -542,7 +542,7 @@
       "tableColumn": "",
       "targets": [
         {
-          "expr": "sum(kube_pod_container_resource_requests_cpu_cores) / sum(kube_node_status_allocatable_cpu_cores)",
+          "expr": "sum(kube_pod_container_resource_requests{unit=\"core\",resource=\"cpu\"}) / sum(kube_node_status_allocatable{unit=\"core\",resource=\"cpu\"})",
           "instant": false,
           "refId": "A"
         }
@@ -712,7 +712,7 @@
       "tableColumn": "",
       "targets": [
         {
-          "expr": "sum(kube_pod_container_resource_limits_cpu_cores) / sum(kube_node_status_allocatable_cpu_cores)",
+          "expr": "sum(kube_pod_container_resource_limits{unit=\"core\",resource=\"cpu\"}) / sum(kube_node_status_allocatable{unit=\"core\",resource=\"cpu\"})",
           "instant": false,
           "refId": "A"
         }
diff --git a/pipeline/filters/aws-metadata.md b/pipeline/filters/aws-metadata.md
index 0172d5af0..9be8488a3 100644
--- a/pipeline/filters/aws-metadata.md
+++ b/pipeline/filters/aws-metadata.md
@@ -1,40 +1,79 @@
-# AWS Metadata
+# AWS metadata
 
-The _AWS Filter_ Enriches logs with AWS Metadata. Currently the plugin adds the EC2 instance ID and availability zone to log records. To use this plugin, you must be running in EC2 and have the [instance metadata service enabled](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html).
+The _AWS Filter_ enriches logs with AWS Metadata. The plugin adds the EC2 instance ID and availability zone to log records. To use this plugin, you must be running in EC2 and have the [instance metadata service enabled](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html).
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
 | Key | Description | Default |
 | :--- | :--- | :--- |
-| imds\_version | Specify which version of the instance metadata service to use. Valid values are 'v1' or 'v2'. | v2 |
-| az | The [availability zone](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html); for example, "us-east-1a". | true |
-| ec2\_instance\_id | The EC2 instance ID. | true |
-| ec2\_instance\_type | The EC2 instance type. | false |
-| private\_ip | The EC2 instance private ip. | false |
-| ami\_id | The EC2 instance image id. | false |
-| account\_id | The account ID for current EC2 instance. | false |
-| hostname | The hostname for current EC2 instance. | false |
-| vpc\_id | The VPC ID for current EC2 instance. | false |
-| tags\_enabled | Specifies if should attach EC2 instance tags. EC2 instance must have the [instance-metadata-tags](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) option enabled (which is disabled by default). | false |
-| tags\_include | Defines list of specific EC2 tag keys to inject into the logs. Tag keys must be separated by "," character. Tags which are not present in this list will be ignored. Example: `Name,tag1,tag2`. | |
-| tags\_exclude | Defines list of specific EC2 tag keys not to inject into the logs. Tag keys must be separated by "," character. Tags which are not present in this list will be injected into the logs. If both `tags_include` and `tags_exclude` are specified, configuration is invalid and plugin fails. Example: `Name,tag1,tag2` | |
-| retry\_interval\_s |Defines minimum duration between retries for fetching EC2 instance tags. | 300 |
-
-Note: _If you run Fluent Bit in a container, you may have to use instance metadata v1._ The plugin behaves the same regardless of which version is used.
-
-### Command Line
+| `imds_version` | Specify which version of the instance metadata service to use. Valid values are `v1` and `v2`. | `v2` |
+| `az` | The [availability zone](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html), such as `us-east-1a`. | `true` |
+| `ec2_instance_id` | The EC2 instance ID. | `true` |
+| `ec2_instance_type` | The EC2 instance type. | `false` |
+| `private_ip` | The EC2 instance private IP. | `false` |
+| `ami_id` | The EC2 instance image ID. | `false` |
+| `account_id` | The account ID for the current EC2 instance. | `false` |
+| `hostname` | The hostname for the current EC2 instance. | `false` |
+| `vpc_id` | The VPC ID for the current EC2 instance. | `false` |
+| `tags_enabled` | Specifies whether to attach EC2 instance tags. The EC2 instance must have the [`instance-metadata-tags`](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) option enabled, which is disabled by default. | `false` |
+| `tags_include` | Defines a list of specific EC2 tag keys to inject into the logs. Tag keys must be comma-separated (`,`). Tags not included in this list will be ignored. Example: `Name,tag1,tag2`. | _none_ |
+| `tags_exclude` | Defines a list of specific EC2 tag keys not to inject into the logs. Tag keys must be comma-separated (`,`). Tags not included in this list will be injected into the logs. If both `tags_include` and `tags_exclude` are specified, the configuration is invalid and the plugin fails. Example: `Name,tag1,tag2` | _none_ |
+| `retry_interval_s` |Defines minimum duration between retries for fetching EC2 instance tags. | `300` |
+
+If you run Fluent Bit in a container, you might need to use instance metadata v1. The plugin behaves the same regardless of which version is used.
+
+### Command line
+
+Run Fluent Bit from the command line:
+
+```shell
+./fluent-bit -c /PATH_TO_CONF_FILE/fluent-bit.conf
+```
 
-```text
-$ bin/fluent-bit -c /PATH_TO_CONF_FILE/fluent-bit.conf
+You should see results like this:
 
+```text
 [2020/01/17 07:57:17] [ info] [engine] started (pid=32744)
 [0] dummy: [1579247838.000171227, {"message"=>"dummy", "az"=>"us-west-2c", "ec2_instance_id"=>"i-0c862eca9038f5aae", "ec2_instance_type"=>"t2.medium", "private_ip"=>"172.31.6.59", "vpc_id"=>"vpc-7ea11c06", "ami_id"=>"ami-0841edc20334f9287", "account_id"=>"YOUR_ACCOUNT_ID", "hostname"=>"ip-172-31-6-59.us-west-2.compute.internal"}]
 [0] dummy: [1601274509.970235760, {"message"=>"dummy", "az"=>"us-west-2c", "ec2_instance_id"=>"i-0c862eca9038f5aae", "ec2_instance_type"=>"t2.medium", "private_ip"=>"172.31.6.59", "vpc_id"=>"vpc-7ea11c06", "ami_id"=>"ami-0841edc20334f9287", "account_id"=>"YOUR_ACCOUNT_ID", "hostname"=>"ip-172-31-6-59.us-west-2.compute.internal"}]
 ```
 
-### Configuration File
+### Configuration file
+
+The following is an example of a configuration file:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+    inputs:
+        - name: dummy
+          tag: dummy
+
+    filters:
+        - name: aws
+          match: '*'
+          imds_version: v1
+          az: true
+          ec2_instance_id: true
+          ec2_instance_type: true
+          private_ip: true
+          ami_id: true
+          account_id: true
+          hostname: true
+          vpc_id: true
+          tags_enabled: true
+
+    outputs:
+        - name: stdout
+          match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
@@ -60,23 +99,42 @@ $ bin/fluent-bit -c /PATH_TO_CONF_FILE/fluent-bit.conf
     Match *
 ```
 
-## EC2 Tags
+{% endtab %}
+{% endtabs %}
+
+## EC2 tags
 
-EC2 Tags are a useful feature that enables you to label and organize your EC2 instances by creating custom-defined key-value pairs. These tags are commonly utilized for resource management, cost allocation, and automation. Consequently, including them in the Fluent Bit generated logs is almost essential.
+EC2 Tags let you label and organize your EC2 instances by creating custom-defined key-value pairs. These tags are commonly used for resource management, cost allocation, and automation. Including them in the Fluent Bit-generated logs is almost essential.
 
-To achieve this, AWS Filter can be configured with `tags_enabled true` to enable the _tagging_ of logs with the relevant EC2 instance tags. This setup ensures that logs are appropriately tagged, making it easier to manage and analyze them based on specific criteria.
+To achieve this, AWS Filter can be configured with `tags_enabled true` to enable the tagging of logs with the relevant EC2 instance tags. This setup ensures that logs are appropriately tagged, making it easier to manage and analyze them based on specific criteria.
 
 ### Requirements
 
-To use the `tags_enabled true` functionality in Fluent Bit, the [instance-metadata-tags](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) option must be enabled on the EC2 instance where Fluent Bit is running. Without this option enabled, Fluent Bit will not be able to retrieve the tags associated with the EC2 instance. However, this does not mean that Fluent Bit will fail or stop working altogether. Instead, if [instance-metadata-tags](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) option is not enabled, Fluent Bit will continue to operate normally and capture other values, such as the EC2 instance ID or availability zone, based on its configuration.
+To use the `tags_enabled true` feature in Fluent Bit, the [instance-metadata-tags](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) option must be enabled on the EC2 instance where Fluent Bit is running. Without this option enabled, Fluent Bit won't be able to retrieve the tags associated with the EC2 instance. However, this doesn't mean that Fluent Bit will fail or stop working altogether. Instead, if [instance-metadata-tags](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) option isn't enabled, Fluent Bit will continue to operate normally and capture other values, such as the EC2 instance ID or availability zone, based on its configuration.
 
 ### Example
 
-#### tags_include
+#### `tags_include`
+
+Assume the EC2 instance has many tags, some of which have lengthy values that are irrelevant to the logs you want to collect. Only two tags, `department` and `project`, are valuable for your purpose. The following configuration reflects this requirement:
 
-Assume that our EC2 instance has many tags, some of which have lengthy values that are irrelevant to the logs we want to collect. Only two tags, `department` and `project`, seem to be valuable for our purpose. Here is a configuration which reflects this requirement:
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
+```yaml
+pipeline:
+
+    filters:
+        - name: aws
+          match: '*'
+          tags_enabled: true
+          tags_include: department,project
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [FILTER]
     Name aws
     Match *
@@ -84,27 +142,50 @@ Assume that our EC2 instance has many tags, some of which have lengthy values th
     tags_include department,project
 ```
 
-If we run Fluent Bit, what will the logs look like? Here is an example of what the logs might contain:
-```
+{% endtab %}
+{% endtabs %}
+
+If you run Fluent Bit logs might look like the following:
+
+```text
 {"log"=>"fluentbit is awesome", "az"=>"us-east-1a", "ec2_instance_id"=>"i-0e66fc7f9809d7168", "department"=>"it", "project"=>"fluentbit"}
 ```
 
-#### tags_exclude
+#### `tags_exclude`
 
-Suppose our EC2 instance has three tags: `Name:fluent-bit-docs-example`, `project:fluentbit`, and `department:it`. In this example, we want to exclude the `department` tag since we consider it redundant. This is because all of our projects belong to the `it` department, and we do not need to waste storage space on redundant labels.
+Suppose the EC2 instance has three tags: `Name:fluent-bit-docs-example`, `project:fluentbit`, and `department:it`. In this example, the `department` tag is redundant and will be excluded. All the projects belong to the `it` department, and you don't want to waste storage space on redundant labels.
 
 Here is an example configuration that achieves this:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  filters:
+    - name: aws
+      match: '*'
+      tags_enabled: true
+      tags_exclude: department
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [FILTER]
-    Name aws
-    Match *
-    tags_enabled true
-    tags_exclude department
+  Name aws
+  Match *
+  tags_enabled true
+  tags_exclude department
 ```
 
+{% endtab %}
+{% endtabs %}
+
 The resulting logs might look like this:
 
-```
+```text
 {"log"=>"aws is awesome", "az"=>"us-east-1a", "ec2_instance_id"=>"i-0e66fc7f9809d7168", "Name"=>"fluent-bit-docs-example", "project"=>"fluentbit"}
 ```
diff --git a/pipeline/filters/checklist.md b/pipeline/filters/checklist.md
index 61a320e59..13af8471f 100644
--- a/pipeline/filters/checklist.md
+++ b/pipeline/filters/checklist.md
@@ -1,50 +1,78 @@
----
-description: >-
-  The following plugin looks up if a value in a specified list exists and then
-  allows the addition of a record to indicate if found. Introduced in version
-  1.8.4
----
-
 # CheckList
 
-## Configuration Parameters
+The _CheckList_ plugin (introduced in version 1.8.4) looks up a value in a specified list to see if it exists. The plugin then allows the addition of a record to indicate if the value was found.
+
+## Configuration parameters
 
 The plugin supports the following configuration parameters
 
-| Key | Description |
-| :--- | :--- |
-| file | The single value file that Fluent Bit will use as a lookup table to determine if the specified `lookup_key` exists |
-| lookup\_key | The specific key to look up and determine if it exists, supports record accessor |
-| record | The record to add if the `lookup_key` is found in the specified `file`. Note you may add multiple record parameters. |
-| mode | Set the check mode. `exact` and `partial` are supported. Default : `exact`.|
-| print_query_time | Print to stdout the elapseed query time for every matched record. Default: false|
-| ignore_case | Compare strings by ignoring case. Default: false |
+| Key | Description | Default |
+| :-- | :---------- | :------ |
+| `file` | The single value file that Fluent Bit will use as a lookup table to determine if the specified `lookup_key` exists. | _none_ |
+| `lookup_key` | The specific key to look up and determine if it exists. Supports [record accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md). | _none_ |
+| `record` | The record to add if the `lookup_key` is found in the specified `file`. You can add multiple record parameters. | _none_ |
+| `mode` | Set the check mode. `exact` and `partial` are supported. | `exact`|
+| `print_query_time` | Print to stdout the elapsed query time for every matched record. | `false` |
+| `ignore_case` | Compare strings by ignoring case. | `false` |
+
+## Example configuration
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: tail
+      tag: test1
+      path: test1.log
+      read_from_head: true
+      parser: json
+
+  filters:
+    - name: checklist
+      match: test1
+      file: ip_list.txt
+      lookup_key: $remote_addr
+      record:
+        - ioc abc
+        - badurl null
+      log_level: debug
+
+  outputs:
+    - name: stdout
+      match: test1
+```
 
-## Example Configuration
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    name           tail
-    tag            test1
-    path           test1.log
-    read_from_head true
-    parser         json
+  name           tail
+  tag            test1
+  path           test1.log
+  read_from_head true
+  parser         json
 
 [FILTER]
-    name       checklist
-    match      test1
-    file       ip_list.txt
-    lookup_key $remote_addr
-    record     ioc    abc
-    record     badurl null
-    log_level  debug
+  name       checklist
+  match      test1
+  file       ip_list.txt
+  lookup_key $remote_addr
+  record     ioc    abc
+  record     badurl null
+  log_level  debug
 
 [OUTPUT]
-    name       stdout
-    match      test1
+  name       stdout
+  match      test1
 ```
 
-In the following configuration we will read a file `test1.log` that includes the following values 
+{% endtab %}
+{% endtabs %}
+
+The following configuration reads a file `test1.log` that includes the following values:
 
 ```text
 {"remote_addr": true, "ioc":"false", "url":"https://badurl.com/payload.htm","badurl":"no"}
@@ -57,7 +85,7 @@ In the following configuration we will read a file `test1.log` that includes the
 
 ```
 
-Additionally, we will use the following lookup file which contains a list of malicious IPs \(`ip_list.txt`\)
+Additionally, it uses  the following lookup file which contains a list of malicious IP addresses (`ip_list.txt`).
 
 ```text
 1.2.3.4
@@ -65,9 +93,8 @@ Additionally, we will use the following lookup file which contains a list of mal
 7.7.7.7
 ```
 
-In the configuration we are using $remote\_addr as the lookup key and 7.7.7.7 is malicious. This means the record we would output for the last record would look like the following
+The configuration uses `$remote_addr` as the lookup key, and `7.7.7.7` is malicious. The record output for the last record would look like the following:
 
 ```text
 {"remote_addr": "7.7.7.7", "ioc":"abc", "url":"https://badurl.com/payload.htm","badurl":"null"}
 ```
-
diff --git a/pipeline/filters/ecs-metadata.md b/pipeline/filters/ecs-metadata.md
index e2d6f567b..3d10e1903 100644
--- a/pipeline/filters/ecs-metadata.md
+++ b/pipeline/filters/ecs-metadata.md
@@ -1,151 +1,272 @@
-# ECS Metadata
+# ECS metadata
 
-The _ECS Filter_ Enriches logs with AWS Elastic Container Service Metadata. The plugin can enrich logs with task, cluster and container metadata. The plugin uses the [ECS Agent introspection API](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-introspection.html) to obtain metadata. This filter only works with the ECS EC2 launch type. The filter only works when Fluent Bit is running on an ECS EC2 Container Instance and has access to the ECS Agent introspection API. The filter is not supported on ECS Fargate. To obtain metadata on ECS Fargate, use the [built-in FireLens metadata](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_firelens.html) or the [AWS for Fluent Bit init](https://github.com/aws/aws-for-fluent-bit/blob/mainline/use_cases/init-process-for-fluent-bit/README.md) project.
+The _ECS Filter_ enriches logs with AWS Elastic Container Service metadata. The plugin can enrich logs with task, cluster, and container metadata. The plugin uses the [ECS Agent introspection API](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-introspection.html) to obtain metadata. This filter only works with the ECS EC2 launch type. The filter only works when Fluent Bit is running on an ECS EC2 Container Instance and has access to the ECS Agent introspection API.
 
-## Configuration Parameters
+The filter isn't supported on ECS Fargate. To obtain metadata on ECS Fargate, use the [built-in FireLens metadata](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_firelens.html) or the [AWS for Fluent Bit init](https://github.com/aws/aws-for-fluent-bit/blob/mainline/use_cases/init-process-for-fluent-bit/README.md) project.
+
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
 | Key | Description | Default |
 | :--- | :--- | :--- |
-| Add | This parameter is similar to the ADD option in the [modify filter](https://docs.fluentbit.io/manual/pipeline/filters/modify).  You can specify it any number of times and it takes two arguments, a KEY name and VALUE. The value uses Fluent Bit [record_accessor](https://docs.fluentbit.io/manual/v/1.5/administration/configuring-fluent-bit/record-accessor) syntax to create a template that uses ECS Metadata values. See the list below for supported metadata templating keys. This option is designed to give you full power to control both the key names for metadata as well as the format for metadata values. See the examples below for more.  | No default |
-| ECS\_Tag\_Prefix | This parameter is similar to the Kube_Tag_Prefix option in the [Kubernetes filter](https://docs.fluentbit.io/manual/pipeline/filters/kubernetes) and performs the same function. The full log tag should be prefixed with this string and after the prefix the filter must find the next characters in the tag to be the Docker Container Short ID (the first 12 characters of the full container ID). The filter uses this to identify which container the log came from so it can find which task it is a part of. See the design section below for more information. If not specified, it defaults to empty string, meaning that the tag must be prefixed with the 12 character container short ID. If you just want to attach cluster metadata to system/OS logs from processes that do not run as part of containers or ECS Tasks, then do not set this parameter and enable the Cluster\_Metadata\_Only option | emptry string |
-| Cluster\_Metadata\_Only | When enabled, the plugin will only attempt to attach cluster metadata values. This is useful if you want to attach cluster metadata to system/OS logs from processes that do not run as part of containers or ECS Tasks. | Off |
-| ECS\_Meta\_Cache\_TTL | The filter builds a hash table in memory mapping each unique container short ID to its metadata. This option sets a max TTL for objects in the hash table. You should set this if you have frequent container/task restarts. For example, your cluster runs short running batch jobs that complete in less than 10 minutes, there is no reason to keep any stored metadata longer than 10 minutes. So you would set this parameter to "10m". | 1h (1 hour) |
+| `Add` | Similar to the `ADD` option in the [modify filter](https://docs.fluentbit.io/manual/pipeline/filters/modify). You can specify it multiple times. It takes two arguments: a `KEY` name and `VALUE`. The value uses Fluent Bit [`record_accessor`](https://docs.fluentbit.io/manual/v/1.5/administration/configuring-fluent-bit/record-accessor) syntax to create a template that uses ECS Metadata values. See the list of supported metadata templating keys. This option lets you control both the key names for metadata and the format for metadata values. | _none_ |
+| `ECS_Tag_Prefix` | Similar to the `Kube_Tag_Prefix` option in the [Kubernetes filter](https://docs.fluentbit.io/manual/pipeline/filters/kubernetes) and performs the same function. The full log tag should be prefixed with this string and after the prefix the filter must find the next characters in the tag to be the Docker Container Short ID (the first 12 characters of the full container ID). The filter uses this to identify which container the log came from so it can find which task it's a part of. See the design section for more information. If not specified, it defaults to empty string, meaning that the tag must be prefixed with the 12 character container short ID. If you want to attach cluster metadata to system or OS logs from processes that don't run as part of containers or ECS Tasks, don't set this parameter and enable the `Cluster_Metadata_Only` option | empty string |
+| `Cluster_Metadata_Only` | When enabled, the plugin will only attempt to attach cluster metadata values. Use to attach cluster metadata to system or OS logs from processes that don't run as part of containers or ECS Tasks. | `Off` |
+| `ECS_Meta_Cache_TTL` | The filter builds a hash table in memory mapping each unique container short ID to its metadata. This option sets a max `TTL` for objects in the hash table. You should set this if you have frequent container or task restarts. For example, if your cluster runs short running batch jobs that complete in less than 10 minutes, there is no reason to keep any stored metadata longer than 10 minutes. You would therefore set this parameter to `10m`. | `1h` |
 
-### Supported Templating Variables for the ADD option
+### Supported templating variables for the `ADD` option
 
-The following template variables can be used for values with the `Add` option. See the tutorial below for examples.
+The following template variables can be used for values with the `ADD` option. See the tutorial in the sections following for examples.
 
-| Variable | Description | Supported with Cluster\_Metadata\_Only On |
+| Variable | Description | Supported with `Cluster_Metadata_Only` on |
 | :--- | :--- | :--- |
-| `$ClusterName` | The ECS cluster name. Fluent Bit is running on EC2 instance(s) that are part of this cluster. | Yes |
-| `$ContainerInstanceARN` | The full ARN of the ECS EC2 Container Instance. This is the instance that Fluent Bit is running on. | Yes |
-| `$ContainerInstanceID` | The ID of the ECS EC2 Container Instance. | Yes |
-| `$ECSAgentVersion` | The Version string of the ECS Agent that is running on the container instance. | Yes |
-| `$ECSContainerName` | The name of the container from which the log originated. This is the name in your ECS Task Definition. | No |
-| `$DockerContainerName` | The name of the container from which the log originated. This is the name obtained from Docker and is the name shown if you run `docker ps` on the instance.  | No |
-| `$ContainerID` | The ID of the container from which the log originated. This is the full 64 character long container ID. | No |
-| `$TaskDefinitionFamily` | The family name of the task definition for the task from which the log originated. | No |
-| `$TaskDefinitionVersion` | The version/revision of the task definition for the task from which the log originated. | No |
-| `$TaskID` | The ID of the ECS Task from which the log originated. | No |
-| `$TaskARN` | The full ARN of the ECS Task from which the log originated. | No |
+| `$ClusterName` | The ECS cluster name. Fluent Bit is running on EC2 instances that are part of this cluster. | `Yes` |
+| `$ContainerInstanceArn` | The full ARN of the ECS EC2 Container Instance. This is the instance that Fluent Bit is running on. | `Yes` |
+| `$ContainerInstanceID` | The ID of the ECS EC2 Container Instance. | `Yes` |
+| `$ECSAgentVersion` | The version string of the ECS Agent running on the container instance. | `Yes` |
+| `$ECSContainerName` | The name of the container from which the log originated. This is the name in your ECS Task Definition. | `No` |
+| `$DockerContainerName` | The name of the container from which the log originated. This is the name obtained from Docker and is the name shown if you run `docker ps` on the instance.  | `No` |
+| `$ContainerID` | The ID of the container from which the log originated. This is the full 64-character-long container ID. | `No` |
+| `$TaskDefinitionFamily` | The family name of the task definition for the task from which the log originated. | `No` |
+| `$TaskDefinitionVersion` | The version or revision of the task definition for the task from which the log originated. | `No` |
+| `$TaskID` | The ID of the ECS Task from which the log originated. | `No` |
+| `$TaskARN` | The full ARN of the ECS Task from which the log originated. | `No` |
 
+### Configuration file
 
-### Configuration File
+The following configurations assume a properly configured parsers file and 'storage.path' variable defined in the services
+section of the Fluent Bit configuration (not shown).
 
 #### Example 1: Attach Task ID and cluster name to container logs
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: tail
+      tag: ecs.*
+      path: /var/lib/docker/containers/*/*.log
+      docker_mode: on
+      docker_mode_flush: 5
+      docker_mode_parser: container_firstline
+      parser: docker
+      db: /var/fluent-bit/state/flb_container.db
+      mem_buf_limit: 50MB
+      skip_long_lines: on
+      refresh_interval: 10
+      rotate_wait: 30
+      storage.type: filesystem
+      read_from_head: off
+
+  filters:
+    - name: ecs
+      match: '*'
+      ecs_tag_prefix: ecs.var.lib.docker.containers.
+      add:
+        - ecs_task_id $TaskID
+        - cluster $ClusterName
+
+  outputs:
+    - name: stdout
+      match: '*'
+      format: json_lines
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
 ```text
 [INPUT]
-    Name                tail
-    Tag                 ecs.*
-    Path                /var/lib/docker/containers/*/*.log
-    Docker_Mode         On
-    Docker_Mode_Flush   5
-    Docker_Mode_Parser  container_firstline
-    Parser              docker
-    DB                  /var/fluent-bit/state/flb_container.db
-    Mem_Buf_Limit       50MB
-    Skip_Long_Lines     On
-    Refresh_Interval    10
-    Rotate_Wait         30
-    storage.type        filesystem
-    Read_From_Head      Off
+  Name                tail
+  Tag                 ecs.*
+  Path                /var/lib/docker/containers/*/*.log
+  Docker_Mode         On
+  Docker_Mode_Flush   5
+  Docker_Mode_Parser  container_firstline
+  Parser              docker
+  DB                  /var/fluent-bit/state/flb_container.db
+  Mem_Buf_Limit       50MB
+  Skip_Long_Lines     On
+  Refresh_Interval    10
+  Rotate_Wait         30
+  storage.type        filesystem
+  Read_From_Head      Off
 
 [FILTER]
-    Name ecs
-    Match *
-    ECS_Tag_Prefix ecs.var.lib.docker.containers.
-    ADD ecs_task_id $TaskID
-    ADD cluster $ClusterName
+  Name ecs
+  Match *
+  ECS_Tag_Prefix ecs.var.lib.docker.containers.
+  ADD ecs_task_id $TaskID
+  ADD cluster $ClusterName
 
 [OUTPUT]
-    Name stdout
-    Match *
-    Format json_lines
+  Name stdout
+  Match *
+  Format json_lines
 ```
 
+{% endtab %}
+{% endtabs %}
+
 The output log should be similar to:
+
 ```text
 {
-    "date":1665003546.0,
-    "log":"some message from your container",
-    "ecs_task_id" "1234567890abcdefghijklmnop",
-    "cluster": "your_cluster_name",
+  "date":1665003546.0,
+  "log":"some message from your container",
+  "ecs_task_id" "1234567890abcdefghijklmnop",
+  "cluster": "your_cluster_name",
 }
 ```
 
 #### Example 2: Attach customized resource name to container logs
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: tail
+      tag: ecs.*
+      path: /var/lib/docker/containers/*/*.log
+      docker_mode: on
+      docker_mode_flush: 5
+      docker_mode_parser: container_firstline
+      parser: docker
+      db: /var/fluent-bit/state/flb_container.db
+      mem_buf_limit: 50MB
+      skip_long_lines: on
+      refresh_interval: 10
+      rotate_wait: 30
+      storage.type: filesystem
+      read_from_head: off
+
+  filters:
+    - name: ecs
+      match: '*'
+      ecs_tag_prefix: ecs.var.lib.docker.containers.
+      add: resource $ClusterName.$TaskDefinitionFamily.$TaskID.$ECSContainerName
+
+  outputs:
+    - name: stdout
+      match: '*'
+      format: json_lines
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
 ```text
 [INPUT]
-    Name                tail
-    Tag                 ecs.*
-    Path                /var/lib/docker/containers/*/*.log
-    Docker_Mode         On
-    Docker_Mode_Flush   5
-    Docker_Mode_Parser  container_firstline
-    Parser              docker
-    DB                  /var/fluent-bit/state/flb_container.db
-    Mem_Buf_Limit       50MB
-    Skip_Long_Lines     On
-    Refresh_Interval    10
-    Rotate_Wait         30
-    storage.type        filesystem
-    Read_From_Head      Off
+  Name                tail
+  Tag                 ecs.*
+  Path                /var/lib/docker/containers/*/*.log
+  Docker_Mode         On
+  Docker_Mode_Flush   5
+  Docker_Mode_Parser  container_firstline
+  Parser              docker
+  DB                  /var/fluent-bit/state/flb_container.db
+  Mem_Buf_Limit       50MB
+  Skip_Long_Lines     On
+  Refresh_Interval    10
+  Rotate_Wait         30
+  storage.type        filesystem
+  Read_From_Head      Off
 
 [FILTER]
-    Name ecs
-    Match *
-    ECS_Tag_Prefix ecs.var.lib.docker.containers.
-    ADD resource $ClusterName.$TaskDefinitionFamily.$TaskID.$ECSContainerName
+  Name ecs
+  Match *
+  ECS_Tag_Prefix ecs.var.lib.docker.containers.
+  ADD resource $ClusterName.$TaskDefinitionFamily.$TaskID.$ECSContainerName
 
 [OUTPUT]
-    Name stdout
-    Match *
-    Format json_lines
+  Name stdout
+  Match *
+  Format json_lines
 ```
 
+{% endtab %}
+{% endtabs %}
+
 The output log would be similar to:
+
 ```text
 {
-    "date":1665003546.0,
-    "log":"some message from your container",
-    "resource" "cluster.family.1234567890abcdefghijklmnop.app",
+  "date":1665003546.0,
+  "log":"some message from your container",
+  "resource" "cluster.family.1234567890abcdefghijklmnop.app",
 }
 ```
 
-Notice that the template variables in the value for the `resource` key are separated by dot characters, only dots and commas
- (`.` and `,`) can come after a template variable. For more information, please check the [Record accessor limitation's section](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md#limitations-of-record_accessor-templating).
+The template variables in the value for the `resource` key are separated by dot characters. Only dots and commas
+ (`.` and `,`) can come after a template variable. For more information, see the [Record accessor limitation's section](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md#limitations-of-record_accessor-templating).
 
 #### Example 3: Attach cluster metadata to non-container logs
 
-This examples shows a use case for the `Cluster_Metadata_Only` option- attaching cluster metadata to ECS Agent logs. 
+This example shows a use case for the `Cluster_Metadata_Only` option attaching cluster metadata to ECS Agent logs.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: tail
+      tag: ecsagent.*
+      path: /var/log/ecs/*
+      db: /var/fluent-bit/state/flb_ecs.db
+      mem_buf_limit: 50MB
+      skip_long_lines: on
+      refresh_interval: 10
+      rotate_wait: 30
+      storage.type: filesystem
+      # Collect all logs on instance
+      read_from_head: on
+
+  filters:
+    - name: ecs
+      match: '*'
+      cluster_metadata_only: on
+      add: cluster $ClusterName
+
+  outputs:
+    - name: stdout
+      match: '*'
+      format: json_lines
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name                tail
-    Tag                 ecsagent.*
-    Path                /var/log/ecs/*
-    DB                  /var/fluent-bit/state/flb_ecs.db
-    Mem_Buf_Limit       50MB
-    Skip_Long_Lines     On
-    Refresh_Interval    10
-    Rotate_Wait         30
-    storage.type        filesystem
-    # Collect all logs on instance
-    Read_From_Head      On
+  Name                tail
+  Tag                 ecsagent.*
+  Path                /var/log/ecs/*
+  DB                  /var/fluent-bit/state/flb_ecs.db
+  Mem_Buf_Limit       50MB
+  Skip_Long_Lines     On
+  Refresh_Interval    10
+  Rotate_Wait         30
+  storage.type        filesystem
+  # Collect all logs on instance
+  Read_From_Head      On
 
 [FILTER]
-    Name ecs
-    Match *
-    Cluster_Metadata_Only On
-    ADD cluster $ClusterName
+  Name ecs
+  Match *
+  Cluster_Metadata_Only On
+  ADD cluster $ClusterName
 
 [OUTPUT]
-    Name stdout
-    Match *
-    Format json_lines
+  Name stdout
+  Match *
+  Format json_lines
 ```
 
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/filters/expect.md b/pipeline/filters/expect.md
index 3af5d8f2a..80b36ecaa 100644
--- a/pipeline/filters/expect.md
+++ b/pipeline/filters/expect.md
@@ -1,34 +1,23 @@
 ---
-description: >-
-  Made for testing: make sure that your records contain the expected key and
-  values
+description: Testing records to ensure they contain an expected key and values
 ---
 
 # Expect
 
-The _expect_ filter plugin allows you to validate that records match certain criteria in their structure, like validating that a key exists or it has a specific value.
+The _expect_ filter plugin lets you validate that records match certain criteria in their structure, like validating that a key exists or it has a specific value.
 
-The following page just describes the configuration properties available, for a detailed explanation of its usage and use cases, please refer the following page:
+For a detailed explanation of its usage and use cases, see [Validating and your Data and Structure](../../local-testing/validating-your-data-and-structure.md).
 
-* [Validating and your Data and Structure](../../local-testing/validating-your-data-and-structure.md)
-
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
 | Property | Description |
 | :--- | :--- |
-| key\_exists | Check if a key with a given name exists in the record. |
-| key\_not\_exists | Check if a key does not exist in the record. |
-| key\_val\_is\_null | check that the value of the key is NULL. |
-| key\_val\_is\_not\_null | check that the value of the key is NOT NULL. |
-| key\_val\_eq | check that the value of the key equals the given value in the configuration. |
-| action | action to take when a rule does not match. The available options are  `warn` , `exit` or "result_key". On `warn`, a warning message is sent to the logging layer when a mismatch of the rules above is found; using `exit` makes Fluent Bit abort with status code `255`; `result_key` is to add a matching result to each record. |
-| result\_key | specify a key name of matching result. This key is to be used only when 'action' is 'result_key'.|
-
-## Getting Started
-
-As mentioned on top, refer to the following page for specific details of usage of this filter:
-
-* [Validating and your Data and Structure](../../local-testing/validating-your-data-and-structure.md)
-
+| `key_exists` | Check if a key with a given name exists in the record. |
+| `key_not_exists` | Check if a key doesn't exist in the record. |
+| `key_val_is_null` | Check that the value of the key is `NULL`. |
+| `key_val_is_not_null` | Check that the value of the key is `NOT NULL`. |
+| `key_val_eq` | Check that the value of the key equals the given value in the configuration. |
+| `action` | Action to take when a rule doesn't match. Available options are `warn` , `exit` or `result_key`. On `warn`, a warning message is sent to the logging layer when a mismatch of the `key*` rules is found. Using `exit` makes Fluent Bit exit with status code `255`. `result_key` adds a matching result to each record. |
+| `result_key` | Specify a key name for the matching result added when `action` is set to `result_key`. |
diff --git a/pipeline/filters/geoip2-filter.md b/pipeline/filters/geoip2-filter.md
index f6a94b267..7ad7cca78 100644
--- a/pipeline/filters/geoip2-filter.md
+++ b/pipeline/filters/geoip2-filter.md
@@ -1,54 +1,82 @@
 ---
-description: Look up Geo data from IP
+description: Look up Geo data from IP.
 ---
 
-# GeoIP2 Filter
+# GeoIP2 filter
 
-GeoIP2 Filter allows you to enrich the incoming data stream using location data from GeoIP2 database.
+The GeoIP2 filter lets you enrich the incoming data stream with location data from the GeoIP2 database.
 
-## Configuration Parameters <a id="config"></a>
+The `GeoLite2-City.mmdb` database is available from [MaxMind's official site](https://dev.maxmind.com/geoip/geoip2/geolite2/).
+
+## Configuration parameters
 
 This plugin supports the following configuration parameters:
 
 | Key | Description |
 | :--- | :--- |
-| database | Path to the GeoIP2 database. |
-| lookup\_key | Field name to process |
-| record | Defines the `KEY LOOKUP_KEY VALUE` triplet. See below for how to set up this option. |
-
-## Getting Started <a id="getting_started"></a>
+| `database` | Path to the GeoIP2 database. |
+| `lookup_key` | Field name to process. |
+| `record` | Defines the `KEY LOOKUP_KEY VALUE` triplet. |
+
+## Get started
+
+The following configuration processes the incoming `remote_addr` and appends country information retrieved from the GeoLite2 database.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: {"remote_addr": "8.8.8.8"}
+
+  filters:
+    - name: gioip2
+      match: '*'
+      database: GioLite2-City.mmdb
+      lookup_key: remote_addr
+      record:
+        - country remote_addr %{country.names.en}
+        - isocode remote_addr %{country.iso_code}
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
 
-The following configuration will process incoming `remote_addr`, and append country information retrieved from GeoLite2 database.
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name   dummy
-    Dummy  {"remote_addr": "8.8.8.8"}
+  Name   dummy
+  Dummy  {"remote_addr": "8.8.8.8"}
 
 [FILTER]
-    Name geoip2
-    Match *
-    Database GeoLite2-City.mmdb
-    Lookup_key remote_addr
-    Record country remote_addr %{country.names.en}
-    Record isocode remote_addr %{country.iso_code}
+  Name geoip2
+  Match *
+  Database GeoLite2-City.mmdb
+  Lookup_key remote_addr
+  Record country remote_addr %{country.names.en}
+  Record isocode remote_addr %{country.iso_code}
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
 
-Each `Record` parameter above specifies the following triplet:
-
-1. The field name to be added to records \(`country`\)
-2. The lookup key to process \(`remote_addr`\)
-3. The query for GeoIP2 database \(`%{country.names.en}`\)
+{% endtab %}
+{% endtabs %}
 
-By running Fluent Bit with the configuration above, you will see the following output:
+Each `Record` parameter specifies the following triplet:
 
-```javascript
-{"remote_addr": "8.8.8.8", "country": "United States", "isocode": "US"}
-```
+- `country`: The field name to be added to records.
+- `remote_addr`: The lookup key to process.
+- `%{country.names.en}`: The GeoIP2 database query.
 
-Note that the `GeoLite2-City.mmdb` database is available from [MaxMind's official site](https://dev.maxmind.com/geoip/geoip2/geolite2/).
+By running Fluent Bit with this configuration, you will see the following output:
 
+```text
+{"remote_addr": "8.8.8.8", "country": "United States", "isocode": "US"}
+```
\ No newline at end of file
diff --git a/pipeline/filters/grep.md b/pipeline/filters/grep.md
index c3aeb609d..a8d48fb83 100644
--- a/pipeline/filters/grep.md
+++ b/pipeline/filters/grep.md
@@ -1,28 +1,28 @@
 ---
-description: Select or exclude records per patterns
+description: Select or exclude records using regular expressions.
 ---
 
 # Grep
 
-The _Grep Filter_ plugin allows you to match or exclude specific records based on regular expression patterns for values or nested values.
+The _Grep_ filter plugin lets you match or exclude specific records based on regular expression patterns for values or nested values.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Value Format | Description |
-| :--- | :--- | :--- |
-| Regex | KEY  REGEX | Keep records in which the content of KEY matches the regular expression. |
-| Exclude | KEY REGEX | Exclude records in which the content of KEY matches the regular expression. |
-| Logical_Op| Operation | Specify which logical operator to use. `AND` , `OR` and `legacy` are allowed as an Operation. Default is `legacy` for backward compatibility. In `legacy` mode the behaviour is either AND or OR depending whether the `grep` is including (uses AND) or excluding (uses OR). Only available from 2.1+. |
+| Key          | Value Format | Description |
+| ------------ | ------------ | ----------- |
+| `Regex`      | `KEY REGEX` | Keep records where the content of `KEY` matches the regular expression. |
+| `Exclude`    | `KEY REGEX` | Exclude records where the content of `KEY` matches the regular expression. |
+| `Logical_Op` | `Operation` | Specify a logical operator:  `AND`, `OR` or `legacy` (default). In `legacy` mode the behaviour is either `AND` or `OR` depending on whether the `grep` is including (uses `AND`) or excluding (uses OR). Available from 2.1 or higher. |
 
-#### Record Accessor Enabled
+### Record accessor enabled
 
-This plugin enables the [Record Accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md) feature to specify the KEY. Using the _record accessor_ is suggested if you want to match values against nested values.
+Enable the [record accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md) feature to specify the `KEY`. Use the record accessor to match values against nested values.
 
-## Getting Started
+## Filter records
 
-In order to start filtering records, you can run the filter from the command line or through the configuration file. The following example assumes that you have a file called `lines.txt` with the following content:
+To start filtering records, run the filter from the command line or through the configuration file. The following example assumes that you have a file named `lines.txt` with the following content:
 
 ```text
 {"log": "aaa"}
@@ -35,205 +35,225 @@ In order to start filtering records, you can run the filter from the command lin
 {"log": "ggg"}
 ```
 
-### Command Line
+### Command line
 
-> Note: using the command line mode need special attention to quote the regular expressions properly. It's suggested to use a configuration file.
+When using the command line, pay close attention to quote the regular expressions. Using a configuration file might be easier.
 
-The following command will load the _tail_ plugin and read the content of `lines.txt` file. Then the _grep_ filter will apply a regular expression rule over the _log_ field \(created by tail plugin\) and only _pass_ the records which field value starts with _aa_:
+The following command loads the [tail](../../pipeline/inputs/tail.md) plugin and reads the content of `lines.txt`. Then the `grep` filter applies a regular expression rule over the `log` field created by the `tail` plugin and only passes records with a field value starting with `aa`:
 
-```text
-$ bin/fluent-bit -i tail -p 'path=lines.txt' -F grep -p 'regex=log aa' -m '*' -o stdout
+```shell
+fluent-bit -i tail -p 'path=lines.txt' -F grep -p 'regex=log aa' -m '*' -o stdout
 ```
 
-### Configuration File
+### Configuration file
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  parsers_file: /path/to/parsers.conf
+
+pipeline:
+  inputs:
+    - name: tail
+      path: lines.txt
+      parser: json
+
+  filters:
+    - name: grep
+      match: '*'
+      regex: log aa
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [SERVICE]
-    parsers_file /path/to/parsers.conf
+  parsers_file /path/to/parsers.conf
 
 [INPUT]
-    name   tail
-    path   lines.txt
-    parser json
+  name   tail
+  path   lines.txt
+  parser json
 
 [FILTER]
-    name   grep
-    match  *
-    regex  log aa
+  name   grep
+  match  *
+  regex  log aa
 
 [OUTPUT]
-    name   stdout
-    match  *
+  name   stdout
+  match  *
 ```
-{% endtab %}
-
-{% tab title="fluent-bit.yaml" %}
-```yaml
-service:
-    parsers_file: /path/to/parsers.conf
-pipeline:
-    inputs:
-        - name: tail
-          path: lines.txt
-          parser: json
-    filters:
-        - name: grep
-          match: '*'
-          regex: log aa
-    outputs:
-        - name: stdout
-          match: '*'
 
-```
 {% endtab %}
 {% endtabs %}
 
-The filter allows to use multiple rules which are applied in order, you can have many _Regex_ and _Exclude_ entries as required.
+The filter lets you use multiple rules which are applied in order, you can have many `Regex` and `Exclude` entries as required ([more information](#multiple-conditions)).
 
 ### Nested fields example
 
-If you want to match or exclude records based on nested values, you can use a [Record Accessor ](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md)format as the KEY name. Consider the following record example:
+To match or exclude records based on nested values, you can use [Record Accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md) format as the `KEY` name.
+
+Consider the following record example:
 
-```javascript
+```json
 {
-    "log": "something",
-    "kubernetes": {
-        "pod_name": "myapp-0",
-        "namespace_name": "default",
-        "pod_id": "216cd7ae-1c7e-11e8-bb40-000c298df552",
-        "labels": {
-            "app": "myapp"
-        },
-        "host": "minikube",
-        "container_name": "myapp",
-        "docker_id": "370face382c7603fdd309d8c6aaaf434fd98b92421ce"
-    }
+  "log": "something",
+  "kubernetes": {
+    "pod_name": "myapp-0",
+    "namespace_name": "default",
+    "pod_id": "216cd7ae-1c7e-11e8-bb40-000c298df552",
+    "labels": {
+      "app": "myapp"
+    },
+    "host": "minikube",
+    "container_name": "myapp",
+    "docker_id": "370face382c7603fdd309d8c6aaaf434fd98b92421ce"
+  }
 }
 ```
 
-if you want to exclude records that match given nested field \(for example `kubernetes.labels.app`\), you can use the following rule:
+For example, to exclude records that match the nested field `kubernetes.labels.app`, use the following rule:
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```python
-[FILTER]
-    Name    grep
-    Match   *
-    Exclude $kubernetes['labels']['app'] myapp
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  filters:
+    - name: grep
+      match: '*'
+      exclude: $kubernetes['labels']['app'] myapp
 ```
+
 {% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-    filters:
-        - name: grep
-          match: '*'
-          exclude: $kubernetes['labels']['app'] myapp
+```text
+[FILTER]
+  Name    grep
+  Match   *
+  Exclude $kubernetes['labels']['app'] myapp
 ```
+
 {% endtab %}
 {% endtabs %}
 
-### Excluding records missing/invalid fields
-
-It may be that in your processing pipeline you want to drop records that are missing certain keys.
+### Excluding records with missing or invalid fields
 
-A simple way to do this is just to `exclude` with a regex that matches anything, a missing key will fail this check.
+You might want to drop records that are missing certain keys.
 
-Here is an example that checks for a specific valid value for the key as well:
+One way to do this is to `exclude` with a regular expression that matches anything. A missing
+key fails this check.
 
+The following example checks for a specific valid value for the key:
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  filters:
+    # Use Grep to verify the contents of the iot_timestamp value.
+    # If the iot_timestamp key does not exist, this will fail
+    # and exclude the row.
+    - name: grep
+      alias: filter-iots-grep
+      match: iots_thread.*
+      regex: iot_timestamp ^\d{4}-\d{2}-\d{2}
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 # Use Grep to verify the contents of the iot_timestamp value.
 # If the iot_timestamp key does not exist, this will fail
 # and exclude the row.
 [FILTER]
-    Name                     grep
-    Alias                    filter-iots-grep
-    Match                    iots_thread.*
-    Regex                    iot_timestamp ^\d{4}-\d{2}-\d{2}
+  Name                     grep
+  Alias                    filter-iots-grep
+  Match                    iots_thread.*
+  Regex                    iot_timestamp ^\d{4}-\d{2}-\d{2}
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-    filters:
-        - name: grep
-          alias: filter-iots-grep
-          match: iots_thread.*
-          regex: iot_timestamp ^\d{4}-\d{2}-\d{2}
-```
 {% endtab %}
 {% endtabs %}
 
-The specified key `iot_timestamp` must match the expected expression - if it does not or is missing/empty then it will be excluded.
+The specified key `iot_timestamp` must match the expected expression. If it doesn't,
+or is missing or empty, then it will be excluded.
 
 ### Multiple conditions
 
-If you want to set multiple `Regex` or `Exclude`, you can use `Logical_Op` property to use logical conjuction or disjunction.
+If you want to set multiple `Regex` or `Exclude`, you must use the `legacy` mode. In this case, the `Exclude` must be first and you can have only one `Regex`.
+If `Exclude` match, the string is blocked. You can have multiple `Exclude` entry.
+After, if there is no `Regex`, the line is sent to the output.
 
-Note: If `Logical_Op` is set, setting both 'Regex' and `Exclude` results in an error.
+If there is a `Regex` and it matches, the line is sent to the output, else, it's blocked.
 
+If you want to set multiple `Regex` or `Exclude`, you can use `Logical_Op` property to use logical conjunction or disjunction.
+
+If `Logical_Op` is set, setting both `Regex` and `Exclude` results in an error.
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"endpoint":"localhost", "value":"something"}'
+      tag: dummy
+
+  filters:
+    - name: grep
+      match: '*'
+      logical_op: or
+      regex:
+        - value something
+        - value error
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name dummy
-    Dummy {"endpoint":"localhost", "value":"something"}
-    Tag dummy
+  Name dummy
+  Dummy {"endpoint":"localhost", "value":"something"}
+  Tag dummy
 
 [FILTER]
-    Name grep
-    Match *
-    Logical_Op or
-    Regex value something
-    Regex value error
+  Name grep
+  Match *
+  Logical_Op or
+  Regex value something
+  Regex value error
 
 [OUTPUT]
-    Name stdout
+  Name stdout
+  Match *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: dummy
-          dummy: '{"endpoint":"localhost", "value":"something"}'
-          tag: dummy
-    filters:
-        - name: grep
-          match: '*'
-          logical_op: or
-          regex:
-            - value something
-            - value error
-    outputs:
-        - name: stdout
-```
 {% endtab %}
 {% endtabs %}
 
-Output will be
-```
-Fluent Bit v2.0.9
-* Copyright (C) 2015-2022 The Fluent Bit Authors
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
-
-[2023/01/22 09:46:49] [ info] [fluent bit] version=2.0.9, commit=16eae10786, pid=33268
-[2023/01/22 09:46:49] [ info] [storage] ver=1.2.0, type=memory, sync=normal, checksum=off, max_chunks_up=128
-[2023/01/22 09:46:49] [ info] [cmetrics] version=0.5.8
-[2023/01/22 09:46:49] [ info] [ctraces ] version=0.2.7
-[2023/01/22 09:46:49] [ info] [input:dummy:dummy.0] initializing
-[2023/01/22 09:46:49] [ info] [input:dummy:dummy.0] storage_strategy='memory' (memory only)
-[2023/01/22 09:46:49] [ info] [filter:grep:grep.0] OR mode
-[2023/01/22 09:46:49] [ info] [sp] stream processor started
-[2023/01/22 09:46:49] [ info] [output:stdout:stdout.0] worker #0 started
+The output looks similar to:
+
+```text
 [0] dummy: [1674348410.558341857, {"endpoint"=>"localhost", "value"=>"something"}]
 [0] dummy: [1674348411.546425499, {"endpoint"=>"localhost", "value"=>"something"}]
-```
\ No newline at end of file
+```
diff --git a/pipeline/filters/kubernetes.md b/pipeline/filters/kubernetes.md
index 3a352eadb..9908dfca6 100644
--- a/pipeline/filters/kubernetes.md
+++ b/pipeline/filters/kubernetes.md
@@ -1,123 +1,145 @@
 # Kubernetes
 
-Fluent Bit _Kubernetes Filter_ allows to enrich your log files with Kubernetes metadata.
-
-When Fluent Bit is deployed in Kubernetes as a DaemonSet and configured to read the log files from the containers \(using tail or systemd input plugins\), this filter aims to perform the following operations:
-
-* Analyze the Tag and extract the following metadata:
-  * Pod Name
-  * Namespace
-  * Container Name
-  * Container ID
-* Query Kubernetes API Server to obtain extra metadata for the POD in question:
-  * Pod ID
-  * Labels
-  * Annotations
-  * Namespace Labels
-  * Namespace Annotations
+Fluent Bit _Kubernetes_ filter enriches your log files with Kubernetes metadata.
+
+When Fluent Bit is deployed in Kubernetes as a DaemonSet and configured to read the log files from the containers (using `tail` or `systemd` input plugins), this filter can perform the following operations:
+
+- Analyze the Tag and extract the following metadata:
+  - Pod Name
+  - Namespace
+  - Container Name
+  - Container ID
+- Query Kubernetes API Server or Kubelet to obtain extra metadata for the pod in question:
+  - Pod ID
+  - Labels
+  - Owner References
+  - Annotations
+  - Namespace Labels
+  - Namespace Annotations
 
 The data is cached locally in memory and appended to each record.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
 | Key | Description | Default |
 | :--- | :--- | :--- |
-| Buffer\_Size | Set the buffer size for HTTP client when reading responses from Kubernetes API server. The value must be according to the [Unit Size](../../administration/configuring-fluent-bit/unit-sizes.md) specification. A value of `0` results in no limit, and the buffer will expand as-needed. Note that if pod specifications exceed the buffer limit, the API response will be discarded when retrieving metadata, and some kubernetes metadata will fail to be injected to the logs. | 32k |
-| Kube\_URL | API Server end-point | [https://kubernetes.default.svc:443](https://kubernetes.default.svc:443) |
-| Kube\_CA\_File | CA certificate file | /var/run/secrets/kubernetes.io/serviceaccount/ca.crt |
-| Kube\_CA\_Path | Absolute path to scan for certificate files |  |
-| Kube\_Token\_File | Token file | /var/run/secrets/kubernetes.io/serviceaccount/token |
-| Kube\_Tag\_Prefix | When the source records comes from Tail input plugin, this option allows to specify what's the prefix used in Tail configuration. | kube.var.log.containers. |
-| Merge\_Log | When enabled, it checks if the `log` field content is a JSON string map, if so, it append the map fields as part of the log structure. | Off |
-| Merge\_Log\_Key | When `Merge_Log` is enabled, the filter tries to assume the `log` field from the incoming message is a JSON string message and make a structured representation of it at the same level of the `log` field in the map. Now if `Merge_Log_Key` is set \(a string name\), all the new structured fields taken from the original `log` content are inserted under the new key. |  |
-| Merge\_Log\_Trim | When `Merge_Log` is enabled, trim \(remove possible \n or \r\) field values. | On |
-| Merge\_Parser | Optional parser name to specify how to parse the data contained in the _log_ key. Recommended use is for developers or testing only. |  |
-| Keep\_Log | When `Keep_Log` is disabled, the `log` field is removed from the incoming message once it has been successfully merged \(`Merge_Log` must be enabled as well\). | On |
-| tls.debug | Debug level between 0 \(nothing\) and 4 \(every detail\). | -1 |
-| tls.verify | When enabled, turns on certificate validation when connecting to the Kubernetes API server. | On |
-| Use\_Journal | When enabled, the filter reads logs coming in Journald format. | Off |
-| Cache\_Use\_Docker\_Id | When enabled, metadata will be fetched from K8s when docker\_id is changed. | Off |
-| Regex\_Parser | Set an alternative Parser to process record Tag and extract pod\_name, namespace\_name, container\_name and docker\_id. The parser must be registered in a [parsers file](https://github.com/fluent/fluent-bit/blob/master/conf/parsers.conf) \(refer to parser _filter-kube-test_ as an example\). |  |
-| K8S-Logging.Parser | Allow Kubernetes Pods to suggest a pre-defined Parser \(read more about it in Kubernetes Annotations section\) | Off |
-| K8S-Logging.Exclude | Allow Kubernetes Pods to exclude their logs from the log processor \(read more about it in Kubernetes Annotations section\). | Off |
-| Labels | Include Kubernetes pod resource labels in the extra metadata. | On |
-| Annotations | Include Kubernetes pod resource annotations in the extra metadata. | On |
-| Kube\_meta\_preload\_cache\_dir | If set, Kubernetes meta-data can be cached/pre-loaded from files in JSON format in this directory, named as namespace-pod.meta |  |
-| Dummy\_Meta | If set, use dummy-meta data \(for test/dev purposes\) | Off |
-| DNS\_Retries | DNS lookup retries N times until the network start working | 6 |
-| DNS\_Wait\_Time | DNS lookup interval between network status checks | 30 |
-| Use\_Kubelet | this is an optional feature flag to get metadata information from kubelet instead of calling Kube Server API to enhance the log. This could mitigate the [Kube API heavy traffic issue for large cluster](kubernetes.md#optional-feature-using-kubelet-to-get-metadata). If used when any [Kubernetes Namespace Meta](#kubernetes-namespace-meta) fields are enabled, Kubelet will be used to fetch pod data, but namespace meta will still be fetched using the `Kube_URL` settings.| Off |
-| Kubelet\_Port | kubelet port using for HTTP request, this only works when `Use_Kubelet`  set to On. | 10250 |
-| Kubelet\_Host | kubelet host using for HTTP request, this only works when `Use_Kubelet`  set to On. | 127.0.0.1 |
-| Kube\_Meta\_Cache\_TTL | configurable TTL for K8s cached pod metadata. By default, it is set to 0 which means TTL for cache entries is disabled and cache entries are evicted at random when capacity is reached. In order to enable this option, you should set the number to a time interval. For example, set this value to 60 or 60s and cache entries which have been created more than 60s will be evicted. | 0 |
-| Kube\_Token\_TTL | configurable 'time to live' for the K8s token. By default, it is set to 600 seconds. After this time, the token is reloaded from Kube_Token_File or the Kube_Token_Command.| 600 |
-| Kube\_Token\_Command | Command to get Kubernetes authorization token. By default, it will be `NULL` and we will use token file to get token. If you want to manually choose a command to get it, you can set the command here. For example, run `aws-iam-authenticator -i your-cluster-name token --token-only` to set token. This option is currently Linux-only. |  |
-| Kube\_Meta\_Namespace\_Cache\_TTL | configurable TTL for K8s cached namespace metadata. By default, it is set to 900 which means a 15min TTL for namespace cache entries. Setting this to 0 will mean entries are evicted at random once the cache is full. | 900 |
-| Namespace\_Labels | Include Kubernetes namespace resource labels in the extra metadata. See [Kubernetes Namespace Meta](#kubernetes-namespace-meta)| Off |
-| Namespace\_Annotations | Include Kubernetes namespace resource annotations in the extra metadata. See [Kubernetes Namespace Meta](#kubernetes-namespace-meta)| Off |
-| Namespace\_Metadata\_Only | Include Kubernetes namespace metadata only and no pod metadata. If this is set, the values of `Labels` and `Annotations` are ignored. See [Kubernetes Namespace Meta](#kubernetes-namespace-meta)| Off |
-
-## Processing the 'log' value
-
-Kubernetes Filter aims to provide several ways to process the data contained in the _log_ key. The following explanation of the workflow assumes that your original Docker parser defined in _parsers.conf_ is as follows:
+| `Buffer_Size` | Set the buffer size for HTTP client when reading responses from Kubernetes API server. The value must conform to the [unit size](../../administration/configuring-fluent-bit/unit-sizes.md) specification. A value of `0` results in no limit, and the buffer will expand as-needed. If pod specifications exceed the buffer limit, the API response is discarded when retrieving metadata, and some Kubernetes metadata will fail to be injected to the logs. | `32k` |
+| `Kube_URL` | API Server end-point | `https://kubernetes.default.svc:443` |
+| `Kube_CA_File` | CA certificate file | `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt` |
+| `Kube_CA_Path` | Absolute path to scan for certificate files | _none_ |
+| `Kube_Token_File` | Token file | `/var/run/secrets/kubernetes.io/serviceaccount/token` |
+| `Kube_Tag_Prefix` | When the source records come from the `tail` input plugin, this option specifies the prefix used in `tail` configuration. | `kube.var.log.containers.` |
+| `Merge_Log` | When enabled, check if the `log` field content is a JSON string map. If it is, append the map fields as part of the log structure. | `Off` |
+| `Merge_Log_Key` | When `Merge_Log` is enabled, the filter assumes the `log` field from the incoming message is a JSON string message and attempts to create a structured representation of it at the same level of the `log` field in the map. If `Merge_Log_Key` is set (a string name), all the new structured fields taken from the original `log` content are inserted under the new key. | _none_ |
+| `Merge_Log_Trim` | When `Merge_Log` is enabled, trim (remove possible `\n` or `\r\`) field values. | `On` |
+| `Merge_Parser` | Optional parser name to specify how to parse the data contained in the `log` key. Recommended for developers or testing only. | _none_ |
+| `Keep_Log` | When `Keep_Log` is disabled and `Merge_Log` enabled, the `log` field is removed from the incoming message once it has been successfully merged. | `On` |
+| `tls.debug` | Debug level between `0` (no information) and `4` (all details). | `-1` |
+| `tls.verify` | When enabled, turns on certificate validation when connecting to the Kubernetes API server. | `On` |
+| `tls.verify_hostname` | When enabled, turns on hostname validation for certificates. | `Off` |
+| `Use_Journal` | When enabled, the filter reads logs in `Journald` format. | `Off` |
+| `Cache_Use_Docker_Id` | When enabled, metadata will be fetched from Kubernetes when `docker_id` is changed. | `Off` |
+| `Regex_Parser` | Set an alternative Parser to process record tags and extract `pod_name`, `namespace_name`, `container_name`, and `docker_id`. The parser must be registered in a [parsers file](https://github.com/fluent/fluent-bit/blob/master/conf/parsers.conf) (refer to parser `filter-kube-test` as an example). | _none_ |
+| `K8S-Logging.Parser` | Allow Kubernetes pods to suggest a pre-defined parser. | `Off` |
+| `K8S-Logging.Exclude` | Allow Kubernetes pods to exclude their logs from the log processor. | `Off` |
+| `Labels` | Include Kubernetes pod resource labels in the extra metadata. | `On` |
+| `Annotations` | Include Kubernetes pod resource annotations in the extra metadata. | `On` |
+| `Kube_meta_preload_cache_dir` | If set, Kubernetes metadata can be cached or pre-loaded from files in JSON format in this directory, named `namespace-pod.meta`. | _none_ |
+| `Dummy_Meta` | If set, use dummy-meta data (for test/dev purposes). | `Off` |
+| `DNS_Retries` | Number of DNS lookup retries until the network starts working. | `6` |
+| `DNS_Wait_Time` | DNS lookup interval between network status checks. | `30` |
+| `Use_Kubelet` | Optional feature flag to get metadata information from Kubelet instead of calling Kube Server API to enhance the log. This could mitigate the [Kube API heavy traffic issue for large cluster](kubernetes.md#optional-feature-using-kubelet-to-get-metadata). If used when any [Kubernetes Namespace Meta](#kubernetes-namespace-meta) fields are enabled, Kubelet will be used to fetch pod data, but namespace meta will still be fetched using the `Kube_URL` settings.| `Off` |
+| `Use_Tag_For_Meta` | When enabled, Kubernetes metadata (for example, `pod_name`, `container_name`, and `namespace_name`) will be extracted from the tag itself. Connection to Kubernetes API Server won't get established and API calls for metadata won't be made. See [Workflow of Tail + Kubernetes Filter](#workflow-of-tail-and-kubernetes-filter) and [Custom tag For enhanced filtering](#custom-tags-for-enhanced-filtering) to better understand metadata extraction from tags. | `Off` |
+| `Kubelet_Port` | Kubelet port to use for HTTP requests. This only works when `Use_Kubelet` is set to `On`. | `10250` |
+| `Kubelet_Host` | Kubelet host to use for HTTP requests. This only works when `Use_Kubelet` is set to `On`. | `127.0.0.1` |
+| `Kube_Meta_Cache_TTL` | Configurable time-to-live for Kubernetes cached pod metadata. By default, it's set to `0` which means `TTL` for cache entries is disabled and cache entries are evicted at random when capacity is reached. To enable this option, set the number to a time interval. For example, set the value to `60` or `60s` and cache entries which have been created more than 60 seconds ago will be evicted. | `0` |
+| `Kube_Token_TTL` | Configurable time-to-live for the Kubernetes token. After this time, the token is reloaded from `Kube_Token_File` or the `Kube_Token_Command`.| `600` |
+| `Kube_Token_Command` | Command to get Kubernetes authorization token. Defaults to `NULL` uses the token file to get the token. To manually choose a command to get it, set the command here. For example, run `aws-iam-authenticator -i your-cluster-name token --token-only` to set token. This option is currently Linux-only. | `NULL` |
+| `Kube_Meta_Namespace_Cache_TTL` | Configurable time-to-live for Kubernetes cached namespace metadata. If set to `0`, entries are evicted at random when capacity is reached. | `900` (seconds) |
+| `Namespace_Labels` | Include Kubernetes namespace resource labels in the extra metadata. See [Kubernetes Namespace Meta](#kubernetes-namespace-meta)| `Off` |
+| `Namespace_Annotations` | Include Kubernetes namespace resource annotations in the extra metadata. See [Kubernetes Namespace Meta](#kubernetes-namespace-meta)| `Off` |
+| `Namespace_Metadata_Only` | Include Kubernetes namespace metadata only and no pod metadata. When set, the values of `Labels` and `Annotations` are ignored. See [Kubernetes Namespace Meta](#kubernetes-namespace-meta)| `Off` |
+| `Owner_References` | Include Kubernetes owner references in the extra metadata. | `Off` |
+
+## Processing the `log` value
+
+Kubernetes filter provides several ways to process the data contained in the `log` key. The following explanation of the workflow assumes that your original Docker parser defined in a `parsers` file is as follows:
+
+{% tabs %}
+{% tab title="parsers.yaml" %}
+
+```yaml
+parsers:
+  - name: docker
+    format: json
+    time_key: time
+    time_format: '%Y-%m-%dT%H:%M:%S.%L'
+    time_keep: on
+```
+
+{% endtab %}
+{% tab title="parsers.conf" %}
 
 ```text
 [PARSER]
-    Name         docker
-    Format       json
-    Time_Key     time
-    Time_Format  %Y-%m-%dT%H:%M:%S.%L
-    Time_Keep    On
+  Name         docker
+  Format       json
+  Time_Key     time
+  Time_Format  %Y-%m-%dT%H:%M:%S.%L
+  Time_Keep    On
 ```
 
-> Since Fluent Bit v1.2 we are not suggesting the use of decoders \(Decode\_Field\_As\) if you are using Elasticsearch database in the output to avoid data type conflicts.
+{% endtab %}
+{% endtabs %}
 
-To perform processing of the _log_ key, it's **mandatory to enable** the _Merge\_Log_ configuration property in this filter, then the following processing order will be done:
+To avoid data-type conflicts in Fluent Bit v1.2 or greater, don't use decoders (`Decode_Field_As`) if you're using Elasticsearch database in the output.
 
-* If a Pod suggest a parser, the filter will use that parser to process the content of _log_.
-* If the option _Merge\_Parser_ was set and the Pod did not suggest a parser, process the _log_ content using the suggested parser in the configuration.
-* If no Pod was suggested and no _Merge\_Parser_ is set, try to handle the content as JSON.
+To perform processing of the `log` key, you must enable the `Merge_Log` configuration property in this filter, then the following processing order will be done:
 
-If _log_ value processing fails, the value is untouched. The order above is not chained, meaning it's exclusive and the filter will try only one of the options above, **not** all of them.
+- If a pod suggests a parser, the filter will use that parser to process the content of `log`.
+- If the `Merge_Parser` option was set and the pod didn't suggest a parser, process the `log` content using the suggested parser in the configuration.
+- If no pod was suggested and `Merge_Parser` isn't set, try to handle the content as JSON.
 
-## Kubernetes Namespace Meta
+If `log` value processing fails, the value is untouched. The order of processing isn't chained, meaning it's exclusive and the filter will try only one of the options, not all of them.
 
-Namespace Meta can be enabled via the following settings:
+## Kubernetes namespace meta
 
-* Namespace\_Labels
-* Namespace\_Annotations
+Enable namespace meta using the following settings:
 
-Using any Namespace Meta requires the use of the Kube API as it can not be fetched directly from Kubelet. If `Use_Kubelet On` has been set, the Kubelet api will only be used to fetch pod metadata, while namespace meta is fetched from the upstream Kubernetes API.
+- `Namespace_Labels`
+- `Namespace_Annotations`
 
-Namespace Meta if collected will be stored within a `kubernetes_namespace` record key.
+Using any namespace meta requires the use of the Kube API. It can't be fetched directly from Kubelet. If `Use_Kubelet On` has been set, the Kubelet API will be used only to fetch pod metadata, while namespace meta is fetched from the upstream Kubernetes API.
 
-> Namespace meta is not be guaranteed to be in sync as namespace labels & annotations can be adjusted after pod creation. Adjust `Kube_Meta_Namespace_Cache_TTL` to lower caching times to fit your use case.
+If collected, namespace meta will be stored in a `kubernetes_namespace` record key.
 
-* Namespace\_Metadata\_Only
-  * Using this feature will instruct fluent-bit to only fetch namespace metadata and to not fetch POD metadata at all.
-    POD basic metadata like container id, host, etc will be NOT be added and the Labels and Annotations configuration options which are used specifically for POD Metadata will be ignored.
+Namespace meta isn't guaranteed to be in sync since namespace labels and annotations can be adjusted after pod creation. Adjust `Kube_Meta_Namespace_Cache_TTL` to reduce caching times to fit your use case.
 
-## Kubernetes Pod Annotations
+- `Namespace_Metadata_Only`
+  - Using this feature will instruct Fluent Bit to only fetch namespace metadata and to not fetch pod metadata at all.
+    Pod basic metadata like `container id` and `host` won't be added, and the labels and annotations configuration options which are used specifically for pod Metadata will be ignored.
 
-A flexible feature of Fluent Bit Kubernetes filter is that allow Kubernetes Pods to suggest certain behaviors for the log processor pipeline when processing the records. At the moment it support:
+## Kubernetes pod annotations
 
-* Suggest a pre-defined parser
-* Request to exclude logs
+Fluent Bit Kubernetes filters allow Kubernetes pods to suggest certain behaviors for the log processor pipeline when processing the records. It can:
+
+- Suggest a pre-defined parser
+- Request to exclude logs
 
 The following annotations are available:
 
 | Annotation | Description | Default |
 | :--- | :--- | :--- |
-| fluentbit.io/parser\[\_stream\]\[-container\] | Suggest a pre-defined parser. The parser must be registered already by Fluent Bit. This option will only be processed if Fluent Bit configuration \(Kubernetes Filter\) have enabled the option _K8S-Logging.Parser_. If present, the stream \(stdout or stderr\) will restrict that specific stream. If present, the container can override a specific container in a Pod. |  |
-| fluentbit.io/exclude\[\_stream\]\[-container\] | Request to Fluent Bit to exclude or not the logs generated by the Pod. This option will only be processed if Fluent Bit configuration \(Kubernetes Filter\) have enabled the option _K8S-Logging.Exclude_. | False |
+| `fluentbit.io/parser[_stream][-container]` | Suggest a pre-defined parser. The parser must be registered already by Fluent Bit. This option will only be processed if Fluent Bit configuration (Kubernetes Filter) has enabled the option `K8S-Logging.Parser`. If present, the stream (stdout or stderr) will restrict that specific stream. If present, the container can override a specific container in a Pod. | _none_ |
+| `fluentbit.io/exclude[_stream][-container]` | Define whether to request that Fluent Bit excludes the logs generated by the pod. This option will be processed only if the Fluent Bit configuration (Kubernetes Filter) has enabled the option `K8S-Logging.Exclude`. | `False` |
 
-### Annotation Examples in Pod definition
+### Annotation examples in pod definition
 
 #### Suggest a parser
 
-The following Pod definition runs a Pod that emits Apache logs to the standard output, in the Annotations it suggest that the data should be processed using the pre-defined parser called _apache_:
+The following pod definition runs a pod that emits Apache logs to the standard output. The Annotations suggest that the data should be processed using the pre-defined parser called `apache`:
 
 ```yaml
 apiVersion: v1
@@ -136,7 +158,7 @@ spec:
 
 #### Request to exclude logs
 
-There are certain situations where the user would like to request that the log processor simply skip the logs from the Pod in question:
+The following example defines a request that the log processor skip the logs from the pod in question:
 
 ```yaml
 apiVersion: v1
@@ -153,53 +175,91 @@ spec:
     image: edsiper/apache_logs
 ```
 
-Note that the annotation value is boolean which can take a _true_ or _false_ and **must** be quoted.
+The annotation value is Boolean which can take a `"true"` or `"false"`. Values must be quoted.
+
+## Kubernetes owner references
 
-## Workflow of Tail + Kubernetes Filter
+An optional feature of Fluent Bit Kubernetes filter includes owner references information under `kubernetes.ownerReferences` field in the record when enabled.
 
-Kubernetes Filter depends on either [Tail](../inputs/tail.md) or [Systemd](../inputs/systemd.md) input plugins to process and enrich records with Kubernetes metadata. Here we will explain the workflow of Tail and how it configuration is correlated with Kubernetes filter. Consider the following configuration example \(just for demo purposes, not production\):
+For example:
+
+```text
+"kubernetes"=>{"pod_name"=>"fluentbit-gke-2p6b5", "namespace_name"=>"kube-system", "pod_id"=>"c759a5f5-xxxx-xxxx-9117-8a1dc0b1f907", "labels"=>{"component"=>"xxxx", "controller-revision-hash"=>"77665fff9", "k8s-app"=>"fluentbit-xxxx"}, "ownerReferences"=>[{"apiVersion"=>"apps/v1", "kind"=>"DaemonSet", "name"=>"fluentbit-gke", "uid"=>"1a12c3e2-d6c4-4a8a-b877-dd3c857d1aea", "controller"=>true, "blockOwnerDeletion"=>true}], "host"=>"xxx-2a9c049c-qgw3", "pod_ip"=>"10.128.0.111", "container_name"=>"fluentbit", "docker_id"=>"2accxxx", "container_hash"=>"xxxx", "container_image"=>"sha256:5163dxxxxea2"}
+```
+
+## Workflow of Tail and Kubernetes filter
+
+Kubernetes Filter depends on either [Tail](../inputs/tail.md) or [Systemd](../inputs/systemd.md) input plugins to process and enrich records with Kubernetes metadata. Consider the following configuration example:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: tail
+      tag: kube.*
+      path: /var/log/containers/*.log
+      multiline.parser: docker,cri
+
+  filters:
+    - name: kubernetes
+      match: 'kube.*'
+      kube_url: https://kubernetes.default.svc:443
+      kube_ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
+      kube_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
+      kube_tag_prefix: kube.var.log.containers.
+      merge_log: on
+      merge_log_key: log_processed
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name    tail
-    Tag     kube.*
-    Path    /var/log/containers/*.log
-    multiline.parser              docker, cri
+  Name    tail
+  Tag     kube.*
+  Path    /var/log/containers/*.log
+  multiline.parser              docker, cri
 
 [FILTER]
-    Name             kubernetes
-    Match            kube.*
-    Kube_URL         https://kubernetes.default.svc:443
-    Kube_CA_File     /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
-    Kube_Token_File  /var/run/secrets/kubernetes.io/serviceaccount/token
-    Kube_Tag_Prefix  kube.var.log.containers.
-    Merge_Log        On
-    Merge_Log_Key    log_processed
+  Name             kubernetes
+  Match            kube.*
+  Kube_URL         https://kubernetes.default.svc:443
+  Kube_CA_File     /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
+  Kube_Token_File  /var/run/secrets/kubernetes.io/serviceaccount/token
+  Kube_Tag_Prefix  kube.var.log.containers.
+  Merge_Log        On
+  Merge_Log_Key    log_processed
 ```
 
-In the input section, the [Tail](../inputs/tail.md) plugin will monitor all files ending in _.log_ in path _/var/log/containers/_. For every file it will read every line and apply the docker parser. Then the records are emitted to the next step with an expanded tag.
+{% endtab %}
+{% endtabs %}
 
-Tail support Tags expansion, which means that if a tag have a star character \(\*\), it will replace the value with the absolute path of the monitored file, so if you file name and path is:
+In the input section, the [Tail](../inputs/tail.md) plugin monitors all files ending in `.log` in the path `/var/log/containers/`. For every file it will read every line and apply the Docker parser. The records are emitted to the next step with an expanded tag.
+
+Tail supports tags expansion. If a tag has a star character (`*`), it will replace the value with the absolute path of the monitored file, so if your filename and path is:
 
 ```text
 /var/log/container/apache-logs-annotated_default_apache-aeeccc7a9f00f6e4e066aeff0434cf80621215071f1b20a51e8340aa7c35eac6.log
 ```
 
-then the Tag for every record of that file becomes:
+then the tag for every record of that file becomes:
 
 ```text
 kube.var.log.containers.apache-logs-annotated_default_apache-aeeccc7a9f00f6e4e066aeff0434cf80621215071f1b20a51e8340aa7c35eac6.log
 ```
 
-> note that slashes are replaced with dots.
+Slashes (`/`) are replaced with dots (`.`).
 
-When [Kubernetes Filter](kubernetes.md) runs, it will try to match all records that starts with _kube._ \(note the ending dot\), so records from the file mentioned above will hit the matching rule and the filter will try to enrich the records
+When Kubernetes filter runs, it tries to match all records that start with `kube.`. Records from the previous file match the rule and the filter will try to enrich the records.
 
-Kubernetes Filter do not care from where the logs comes from, but it cares about the absolute name of the monitored file, because that information contains the pod name and namespace name that are used to retrieve associated metadata to the running Pod from the Kubernetes Master/API Server.
+Kubernetes filter doesn't care from where the logs comes from, but it cares about the absolute name of the monitored file. That information contains the pod name and namespace name that are used to retrieve associated metadata to the running pod from the Kubernetes Master/API Server.
 
-> If you have large pod specifications \(can be caused by large numbers of environment variables, etc.\), be sure to increase the `Buffer_Size` parameter of the kubernetes filter. If object sizes exceed this buffer, some metadata will fail to be injected to the logs.
+If you have large pod specifications, which can be caused by large numbers of environment variables, increase the `Buffer_Size` parameter of the Kubernetes filter. If object sizes exceed this buffer, some metadata will fail to be injected to the logs.
 
-If the configuration property **Kube\_Tag\_Prefix** was configured \(available on Fluent Bit &gt;= 1.1.x\), it will use that value to remove the prefix that was appended to the Tag in the previous Input section. Note that the configuration property defaults to _kube.var.logs.containers._ , so the previous Tag content will be transformed from:
+If the configuration property `Kube_Tag_Prefix` was configured (available on Fluent Bit &gt;= 1.1.x), it will use that value to remove the prefix that was appended to the Tag in the previous `Input` section. The configuration property defaults to `kube.var.logs.containers.` , so the previous tag content will be transformed from:
 
 ```text
 kube.var.log.containers.apache-logs-annotated_default_apache-aeeccc7a9f00f6e4e066aeff0434cf80621215071f1b20a51e8340aa7c35eac6.log
@@ -211,66 +271,94 @@ to:
 apache-logs-annotated_default_apache-aeeccc7a9f00f6e4e066aeff0434cf80621215071f1b20a51e8340aa7c35eac6.log
 ```
 
-> the transformation above do not modify the original Tag, just creates a new representation for the filter to perform metadata lookup.
+Rather than modify the original tag, the transformation creates a new representation for the filter to perform metadata lookup.
 
-that new value is used by the filter to lookup the pod name and namespace, for that purpose it uses an internal Regular expression:
+With this suggested change, the new value is used by the filter to lookup the pod name and namespace. For that purpose, it uses an internal regular expression:
 
 ```text
 (?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$
 ```
 
-> If you want to know more details, check the source code of that definition [here](https://github.com/fluent/fluent-bit/blob/master/plugins/filter_kubernetes/kube_regex.h#L26>).
+For more details, review the [source code of that definition](https://github.com/fluent/fluent-bit/blob/master/plugins/filter_kubernetes/kube_regex.h#L26>).
+
+You can see on the [Rublar.com](https://rubular.com/r/HZz3tYAahj6JCd) website how this operation is performed. See the following demo link:
+
+[https://rubular.com/r/HZz3tYAahj6JCd](https://rubular.com/r/HZz3tYAahj6JCd)
 
-You can see on [Rublar.com](https://rubular.com/r/HZz3tYAahj6JCd) web site how this operation is performed, check the following demo link:
+### Custom regular expressions
 
-* [https://rubular.com/r/HZz3tYAahj6JCd](https://rubular.com/r/HZz3tYAahj6JCd)
+Under some uncommon conditions, a user might want to alter that hard-coded regular expression. Use the `Regex_Parser` option.
 
-### Custom Regex
+#### Custom tags For enhanced filtering
 
-Under certain and not common conditions, a user would want to alter that hard-coded regular expression, for that purpose the option **Regex\_Parser** can be used \(documented on top\).
+One such use case involves splitting logs by namespace, pods, containers or container ID. The tag is restructured within the tail input using match groups. Restructuring can simplify the filtering by those match groups later in the pipeline. Since the tag no longer follows the original filename, a custom `Regex_Parser` that matches the new tag structure is required:
 
-#### Custom Tag For Enhanced Filtering
 
-One such use case involves splitting logs by namespace, pods, containers or container id.
-The tag is restructured within the tail input using match groups, this can simplify the filtering by those match groups later in the pipeline.
-Since the tag no longer follows the original file name, a custom **Regex\_Parser** that matches the new tag structure is required:
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+parsers:
+  - 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})'
+
+pipeline:
+  inputs:
+    - name: tail
+      tag: kube.<namespace_name>.<pod_name>.<container_name>.<container_id>
+      path: /var/log/containers/*.log
+      tag_regex: '(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<container_id>[a-z0-9]{64})\.log$'
+      parser: cri
+
+  filters:
+    - name: kubernetes
+      match: 'kube.*'
+      kube_tag_prefix: kube.
+      regex_parser: custom-tag
+      merge_log: on
+```
+
+{% endtab %}
+{% 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})
+  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
-    Tag               kube.<namespace_name>.<pod_name>.<container_name>.<container_id>
-    Path              /var/log/containers/*.log
-    Tag_Regex         (?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<container_id>[a-z0-9]{64})\.log$
-    Parser            cri
+  Name              tail
+  Tag               kube.<namespace_name>.<pod_name>.<container_name>.<container_id>
+  Path              /var/log/containers/*.log
+  Tag_Regex         (?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<container_id>[a-z0-9]{64})\.log$
+  Parser            cri
 
 [FILTER]
-    Name                kubernetes
-    Match               kube.*
-    Kube_Tag_Prefix     kube.
-    Regex_Parser        custom-tag
-    Merge_Log           On
+  Name                kubernetes
+  Match               kube.*
+  Kube_Tag_Prefix     kube.
+  Regex_Parser        custom-tag
+  Merge_Log           On
 ```
 
-#### Final Comments
+{% endtab %}
+{% endtabs %}
 
-So at this point the filter is able to gather the values of _pod\_name_ and _namespace_, with that information it will check in the local cache \(internal hash table\) if some metadata for that key pair exists, if so, it will enrich the record with the metadata value, otherwise it will connect to the Kubernetes Master/API Server and retrieve that information.
+The filter can now gather the values of `pod_name` and `namespace`. With that information, it will check in the local cache (internal hash table) if some metadata for that key pair exists. If it exists, it will enrich the record with the metadata value. Otherwise, it connects to the Kubernetes Master/API Server and retrieves that information.
 
-## Optional Feature: Using Kubelet to Get Metadata
+## Using Kubelet to get metadata
 
-There is an [issue](https://github.com/fluent/fluent-bit/issues/1948) reported about kube-apiserver fall over and become unresponsive when cluster is too large and too many requests are sent to it. For this feature, fluent bit Kubernetes filter will send the request to kubelet /pods endpoint instead of kube-apiserver to retrieve the pods information and use it to enrich the log. Since Kubelet is running locally in nodes, the request would be responded faster and each node would only get one request one time. This could save kube-apiserver power to handle other requests. When this feature is enabled, you should see no difference in the kubernetes metadata added to logs, but the Kube-apiserver bottleneck should be avoided when cluster is large.
+An [issue](https://github.com/fluent/fluent-bit/issues/1948) about `kube-apiserver` suggests it will fail and become unresponsive when a cluster is too large and receives too many requests. For this feature, the Fluent Bit Kubernetes filter will send the request to the Kubelet `/pods` endpoint instead of `kube-apiserver` to retrieve the pods information and use it to enrich the log. Since Kubelet is running locally in nodes, the request response would be faster and each node would receive a request only one time. This could preserve `kube-apiserver` capacity to handle other requests. When this feature is enabled, you should see no difference in the Kubernetes metadata added to logs, but the `kube-apiserver` bottleneck should be avoided when the cluster is large.
 
-### Configuration Setup
+### Configuration setup
 
 There are some configuration setup needed for this feature.
 
-Role Configuration for Fluent Bit DaemonSet Example:
+The following example demonstrates role configuration for the Fluent Bit DaemonSet:
 
-```text
+```yaml
 ---
 apiVersion: v1
 kind: ServiceAccount
@@ -308,39 +396,74 @@ subjects:
     namespace: fluentbit-system
 ```
 
-The difference is that kubelet need a special permission for resource `nodes/proxy` to get HTTP request in. When creating the `role` or `clusterRole`, you need to add `nodes/proxy` into the rule for resource.
+Kubelet needs special permission for the resource `nodes/proxy` to get HTTP requests. When creating the `role` or `clusterRole`, you need to add `nodes/proxy` into the rule for resource.
 
-Fluent Bit Configuration Example:
+For Fluent Bit configuration, you must set the `Use_Kubelet` to `true` to enable this feature.
 
-```text
-    [INPUT]
-        Name              tail
-        Tag               kube.*
-        Path              /var/log/containers/*.log
-        DB                /var/log/flb_kube.db
-        Parser            docker
-        Docker_Mode       On
-        Mem_Buf_Limit     50MB
-        Skip_Long_Lines   On
-        Refresh_Interval  10
-
-    [FILTER]
-        Name                kubernetes
-        Match               kube.*
-        Kube_URL            https://kubernetes.default.svc.cluster.local:443
-        Kube_CA_File        /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
-        Kube_Token_File     /var/run/secrets/kubernetes.io/serviceaccount/token
-        Merge_Log           On
-        Buffer_Size         0
-        Use_Kubelet         true
-        Kubelet_Port        10250
+Fluent Bit configuration example:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: tail
+      tag: kube.*
+      path: /var/log/containers/*.log
+      db: /var/log/flb_kube.db
+      parser: docker
+      docker_mode: on
+      mem_buf_limit: 50MB
+      skip_login_lines: on
+      refresh_interval: 10
+
+  filters:
+    - name: kubernetes
+      match: 'kube.*'
+      kube_url: https://kubernetes.default.svc.cluster.local:443
+      kube_ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
+      kube_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
+      merge_log: on
+      buffer_size: 0
+      use_kubelet: ture
+      kubelet_port: 10250
 ```
 
-So for fluent bit configuration, you need to set the `Use_Kubelet` to true to enable this feature.
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-DaemonSet config Example:
+```yaml
+[INPUT]
+  Name              tail
+  Tag               kube.*
+  Path              /var/log/containers/*.log
+  DB                /var/log/flb_kube.db
+  Parser            docker
+  Docker_Mode       On
+  Mem_Buf_Limit     50MB
+  Skip_Long_Lines   On
+  Refresh_Interval  10
 
-```text
+[FILTER]
+  Name                kubernetes
+  Match               kube.*
+  Kube_URL            https://kubernetes.default.svc.cluster.local:443
+  Kube_CA_File        /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
+  Kube_Token_File     /var/run/secrets/kubernetes.io/serviceaccount/token
+  Merge_Log           On
+  Buffer_Size         0
+  Use_Kubelet         true
+  Kubelet_Port        10250
+```
+
+{% endtab %}
+{% endtabs %}
+
+
+DaemonSet configuration example:
+
+```yaml
 ---
 apiVersion: apps/v1
 kind: DaemonSet
@@ -391,21 +514,17 @@ spec:
             name: fluentbit-config
 ```
 
-The key point is to set `hostNetwork` to `true` and `dnsPolicy` to `ClusterFirstWithHostNet` that fluent bit DaemonSet could call Kubelet locally. Otherwise it could not resolve the dns for kubelet.
-
-Now you are good to use this new feature!
-
-### Verify that the Use\_Kubelet option is working
+Set `hostNetwork` to `true` and `dnsPolicy` to `ClusterFirstWithHostNet` so the Fluent Bit DaemonSet can call Kubelet locally. Otherwise it can't resolve DNS for kubelet.
 
-Basically you should see no difference about your experience for enriching your log files with Kubernetes metadata.
+### Verify the `Use_Kubelet` option is working
 
-To check if Fluent Bit is using the kubelet, you can check fluent bit logs and there should be a log like this:
+To know if Fluent Bit is using the kubelet, you can review Fluent Bit logs. There should be a log like this:
 
 ```text
 [ info] [filter:kubernetes:kubernetes.0] testing connectivity with Kubelet...
 ```
 
-And if you are in debug mode, you could see more:
+If you are in debug mode, you can see more:
 
 ```text
 [debug] [filter:kubernetes:kubernetes.0] Send out request to Kubelet for pods information.
@@ -417,54 +536,56 @@ And if you are in debug mode, you could see more:
 
 ## Troubleshooting
 
-The following section goes over specific log messages you may run into and how to solve them to ensure that Fluent Bit's Kubernetes filter is operating properly
+Learn how to solve them to ensure that the Fluent Bit Kubernetes filter is operating properly. You might receive log messages like the following:
 
-### I can't see metadata appended to my pod or other Kubernetes objects
+- You can't see metadata appended to your pods or other Kubernetes objects
 
-If you are not seeing metadata added to your kubernetes logs and see the following in your log message, then you may be facing connectivity issues with the Kubernetes API server.
+  If you aren't seeing metadata added to your Kubernetes logs and see the following in your log message, then you might be facing connectivity issues with the Kubernetes API server.
 
-```text
-[2020/10/15 03:48:57] [ info] [filter_kube] testing connectivity with API server...
-[2020/10/15 03:48:57] [error] [filter_kube] upstream connection error
-[2020/10/15 03:48:57] [ warn] [filter_kube] could not get meta for POD
-```
+  ```text
+  [2020/10/15 03:48:57] [ info] [filter_kube] testing connectivity with API server...
+  [2020/10/15 03:48:57] [error] [filter_kube] upstream connection error
+  [2020/10/15 03:48:57] [ warn] [filter_kube] could not get meta for POD
+  ```
 
-**Potential fix \#1: Check Kubernetes roles**
+  - Potential fix 1: Check Kubernetes roles
 
-When Fluent Bit is deployed as a DaemonSet it generally runs with specific roles that allow the application to talk to the Kubernetes API server. If you are deployed in a more restricted environment check that all the Kubernetes roles are set correctly.
+    When Fluent Bit is deployed as a DaemonSet it generally runs with specific roles that allow the application to talk to the Kubernetes API server. If you are deployed in a more restricted environment ensure that all the Kubernetes roles are set correctly.
 
-You can test this by running the following command (replace `fluentbit-system` with the namespace where your fluentbit is installed)
+    You can test this by running the following command. Replace `fluentbit-system` with the namespace where your Fluent Bit is installed.
 
-```text
-kubectl auth can-i list pods --as=system:serviceaccount:fluentbit-system:fluentbit
-```
+    ```text
+    kubectl auth can-i list pods --as=system:serviceaccount:fluentbit-system:fluentbit
+    ```
 
-If set roles are configured correctly, it should simply respond with `yes`.
+    If set roles are configured correctly, it should respond with `yes`.
 
-For instance, using Azure AKS, running the above command may respond with:
+    For instance, using Azure Kubernetes Service (AKS), running the previous command might respond with:
 
-```text
-no - Azure does not have opinion for this user.
-```
+    ```text
+    no - Azure does not have opinion for this user.
+    ```
 
-If you have connectivity to the API server, but still "could not get meta for POD" - debug logging might give you a message with `Azure does not have opinion for this user`. Then the following `subject` may need to be included in the `fluentbit` `ClusterRoleBinding`:
+    If you have can connect to the API server, but still `could not get meta for POD` - debug logging might give you a message with `Azure does not have opinion for this user`. The following `subject` might need to be included in the `fluentbit` `ClusterRoleBinding`, appended to `subjects` array:
 
-appended to `subjects` array:
+    ```yaml
+    - apiGroup: rbac.authorization.k8s.io
+      kind: Group
+      name: system:serviceaccounts
+    ```
 
-```yaml
-- apiGroup: rbac.authorization.k8s.io
-  kind: Group
-  name: system:serviceaccounts
-```
+  - Potential fix 2: Check Kubernetes IPv6
+
+    There might be cases where you have IPv6 on in the environment and you need to enable this within Fluent Bit. Under the service tag set the following option `ipv6` to `on` .
 
-**Potential fix \#2: Check Kubernetes IPv6**
+  - Potential fix 3: Check connectivity to `Kube_URL`
 
-There may be cases where you have IPv6 on in the environment and you need to enable this within Fluent Bit. Under the service tag please set the following option `ipv6` to `on` .
+    By default the `Kube_URL` is set to `https://kubernetes.default.svc:443`. Ensure that you have connectivity to this endpoint from within the cluster and that there are no special permissions interfering with the connection.
 
-**Potential fix \#3: Check connectivity to Kube\_URL**
+- You can't see new objects getting metadata
 
-By default the Kube\_URL is set to `https://kubernetes.default.svc:443` . Ensure that you have connectivity to this endpoint from within the cluster and that there are no special permission interfering with the connection.
+  In some cases, you might see only some objects being appended with metadata while other objects aren't enriched. This can occur when local data is cached and doesn't contain the correct ID for the Kubernetes object that requires enrichment. For most Kubernetes objects the Kubernetes API server is updated, which will then be reflected in Fluent Bit logs. In some cases for `Pod` objects, this refresh to the Kubernetes API server can be skipped, causing metadata to be skipped.
 
-### I can't see new objects getting metadata
+## Credit
 
-In some cases, you may only see some objects being appended with metadata while other objects are not enriched. This can occur at times when local data is cached and does not contain the correct id for the kubernetes object that requires enrichment. For most Kubernetes objects the Kubernetes API server is updated which will then be reflected in Fluent Bit logs, however in some cases for `Pod` objects this refresh to the Kubernetes API server can be skipped, causing metadata to be skipped.
+The Kubernetes Filter plugin is fully inspired by the [Fluentd Kubernetes Metadata Filter](https://github.com/fabric8io/fluent-plugin-kubernetes_metadata_filter) written by [Jimmi Dyson](https://github.com/jimmidyson).
diff --git a/pipeline/filters/log_to_metrics.md b/pipeline/filters/log_to_metrics.md
index 5dbc017d7..f5e104605 100644
--- a/pipeline/filters/log_to_metrics.md
+++ b/pipeline/filters/log_to_metrics.md
@@ -2,70 +2,140 @@
 description: Generate metrics from logs
 ---
 
-# Log To Metrics
+# Logs to metrics
 
-The _Log To Metrics Filter_ plugin allows you to generate log-derived metrics. It currently supports modes to count records, provide a gauge for field values or create a histogram. You can also match or exclude specific records based on regular expression patterns for values or nested values. This filter plugin does not actually act as a record filter and does not change or drop records. All records will pass this filter untouched and generated metrics will be emitted into a seperate metric pipeline.
+The _log to metrics_ filter lets you generate log-derived metrics. It supports modes to count records, provide a gauge for field values, or create a histogram. You can also match or exclude specific records based on regular expression patterns for values or nested values.
 
-_Please note that this plugin is an experimental feature and is not recommended for production use. Configuration parameters and plugin functionality are subject to change without notice._
+This filter doesn't actually act as a record filter and therefore doesn't change or drop records. All records will pass through this filter untouched, and any generated metrics will be emitted into a separate metric pipeline.
 
+{% hint style="warning" %}
 
-## Configuration Parameters
+This filter is an experimental feature and isn't recommended for production use. Configuration parameters and other capabilities are subject to change without notice.
 
-The plugin supports the following configuration parameters:
+{% endhint %}
 
-| Key |  Description | Mandatory  | Value Format
-| :--- | :--- | :--- | :--- 
-| tag | Defines the tag for the generated metrics record| Yes | |
-| metric_mode | Defines the mode for the metric. Valid values are [`counter`, `gauge` or `histogram`] | Yes | |  
-| metric_name | Sets the name of the metric. | Yes | |
-| metric_description | Sets a help text for the metric. | Yes | |
-| bucket | Defines a bucket for `histogram` | Yes, for mode  `histogram` | e.g. 0.75 |
-| add_label | Add a custom label NAME and set the value to the value of KEY | | | NAME  KEY |
-| label_field | Includes a record field as label dimension in the metric. | | Name of record key. Supports [Record Accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md) notation for nested fields.
-| value_field | Specify the record field that holds a numerical value | Yes, for modes [`gauge` and `histogram`] | Name of record key. Supports [Record Accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md) notation for nested fields.
-| kubernetes_mode |  If enabled, it will automatically put pod_id, pod_name, namespace_name, docker_id and container_name into the metric as labels. This option is intended to be used in combination with the [kubernetes](./kubernetes.md) filter plugin, which fills those fields. | | 
-| Regex | Include records in which the content of KEY matches the regular expression. | |  KEY  REGEX 
-| Exclude | Exclude records in which the content of KEY matches the regular expression. | |  KEY  REGEX 
+## Configuration parameters
 
-## Getting Started
+The plugin supports the following configuration parameters:
 
-The following example takes records from two dummy inputs and counts all messages passing through the `log_to_metrics` filter. It then generates metric records which are provided to the `prometheus_exporter`:
+| Parameter | Description | Value format |
+|---|---|---|
+| `tag` | Required. Defines the tag for the generated metrics record. |  |
+| `metric_mode` | Required. Defines the mode for the metric. Valid values are `counter`, `gauge` or `histogram`. |  |
+| `metric_name` | Required. Sets the name of the metric. |  |
+| `metric_description` | Required. Sets a description for the metric. |  |
+| `bucket` | Required for mode `histogram`. Defines a bucket for histograms. | For example, `0.75` |
+| `add_label` | Adds a custom label `NAME` and set the value to the value of `KEY`. |  |
+| `label_field` | Includes a record field as label dimension in the metric. | Name of record key. Supports [record accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md) notation for nested fields. |
+| `value_field` | Required for modes `gauge` and `histogram`. Specifies the record field that holds a numerical value. | Name of record key. Supports [record accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md) notation for nested fields. |
+| `kubernetes_mode` | If enabled, adds `pod_id`, `pod_name`, `namespace_name`, `docker_id` and `container_name` to the metric as labels. This option is intended to be used in combination with the [Kubernetes](./kubernetes.md) filter plugin, which fills those fields. |  |
+| `Regex` | Includes records in which the content of `KEY` matches the regular expression. | `KEY REGEX` |
+| `Exclude` | Excludes records in which the content of `KEY` matches the regular expression. | `KEY REGEX` |
+| `Flush_Interval_Sec` | The interval for metrics emission, in seconds. If `Flush_Interval_Sec` and `Flush_Interval_Nsec` are either both unset or both set to `0`, the filter emits metrics immediately after each filter match. Otherwise, if either parameter is set to a non-zero value, the filter emits metrics at the specified interval. Longer intervals help lower resource consumption in high-load situations. Default value: `0`. |  |
+| `Flush_Interval_Nsec` | The interval for metrics emission, in nanoseconds. This parameter works in conjunction with `Flush_Interval_Sec`. Default value: `0`. |  |
+
+## Examples
+
+{% hint style="info" %}
+
+The following examples assume Prometheus is running on the local machine as shown in the Fluent Bit configurations.
+
+{% endhint %}
+
+### Counter
+
+The following example takes records from two `dummy` inputs and counts all messages that pass through the `log_to_metrics` filter. It then generates metric records, which are provided to the `prometheus_exporter` output:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"message":"dummy", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 20, "color": "red", "shape": "circle"}'
+      tag: dummy.log
+
+    - name: dummy
+      dummy: '{"message":"hello", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 60, "color": "blue", "shape": "square"}'
+      tag: dummy.log2
+
+  filters:
+    - name: log_to_metrics
+      match: 'dummy.log*'
+      tag: test_metric
+      metric_mode: counter
+      metric_name: count_all_dummy_messages
+      metric_description: 'This metric counts dummy messages'
+
+  outputs:
+    - name: prometheus_exporter
+      match: '*'
+      host: 0.0.0.0
+      port: 9999
+```
 
-### Configuration - Counter
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [SERVICE]
-    flush              1
-    log_level          info
+  flush              1
+  log_level          info
 
 [INPUT]
-    Name               dummy
-    Dummy              {"message":"dummy", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 20, "color": "red", "shape": "circle"}
-    Tag                dummy.log
+  Name               dummy
+  Dummy              {"message":"dummy", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 20, "color": "red", "shape": "circle"}
+  Tag                dummy.log
 
 [INPUT]
-    Name               dummy
-    Dummy              {"message":"hello", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 60, "color": "blue", "shape": "square"}
-    Tag                dummy.log2
+  Name               dummy
+  Dummy              {"message":"hello", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 60, "color": "blue", "shape": "square"}
+  Tag                dummy.log2
 
 [FILTER]
-    name               log_to_metrics
-    match              dummy.log*
-    tag                test_metric
-    metric_mode        counter
-    metric_name        count_all_dummy_messages
-    metric_description This metric counts dummy messages
+  name               log_to_metrics
+  match              dummy.log*
+  tag                test_metric
+  metric_mode        counter
+  metric_name        count_all_dummy_messages
+  metric_description This metric counts dummy messages
 
 [OUTPUT]
-    name               prometheus_exporter
-    match              *
-    host               0.0.0.0
-    port               2021
+  name               prometheus_exporter
+  match              *
+  host               0.0.0.0
+  port               9999
 ```
 
-You can then use e.g. curl command to retrieve the generated metric:
-```text
-> curl -s http://127.0.0.1:2021/metrics
+{% endtab %}
+{% tab title="prometheus.yml" %}
+
+Run this configuration file with Prometheus to collect the metrics from the Fluent Bit configurations.
+
+```yaml
+# config
+global:
+  scrape_interval: 5s
+
+scrape_configs:
+  # Scraping Fluent Bit example.
+  - job_name: "fluentbit"
+    static_configs:
+      - targets: ["localhost:9999"]
+```
+
+{% endtab %}
+{% endtabs %}
+
+You can then use a tool like curl to retrieve the generated metric:
+
+```shell
+$ curl -s http://127.0.0.1:9999/metrics
 
 
 # HELP log_metric_counter_count_all_dummy_messages This metric counts dummy messages
@@ -73,27 +143,113 @@ You can then use e.g. curl command to retrieve the generated metric:
 log_metric_counter_count_all_dummy_messages 49
 ```
 
-### Configuration  - Gauge
+### Gauge
+
+The `gauge` mode needs a `value_field` to specify where to generate the metric values from. This example also applies a `regex` filter and enables the `kubernetes_mode` option:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"message":"dummy", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 20, "color": "red", "shape": "circle"}'
+      tag: dummy.log
+
+    - name: dummy
+      dummy: '{"message":"hello", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 60, "color": "blue", "shape": "square"}'
+      tag: dummy.log2
+
+  filters:
+    - name: log_to_metrics
+      match: 'dummy.log*'
+      tag: test_metric
+      metric_mode: gauge
+      metric_name: current_duration
+      metric_description: 'This metric shows the current duration'
+      value_field: duration
+      kubernetes_mode: on
+      regex: 'message .*el.*'
+      add_label: app $kubernetes['labels']['app']
+      label_field:
+        - color
+        - shape
+
+  outputs:
+    - name: prometheus_exporter
+      match: '*'
+      host: 0.0.0.0
+      port: 9999
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[SERVICE]
+  flush              1
+  log_level          info
+
+[INPUT]
+  Name               dummy
+  Dummy              {"message":"dummy", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 20, "color": "red", "shape": "circle"}
+  Tag                dummy.log
+
+[INPUT]
+  Name               dummy
+  Dummy              {"message":"hello", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 60, "color": "blue", "shape": "square"}
+  Tag                dummy.log2
 
-The `gauge` mode needs a `value_field` specified, where the current metric values are generated from. In this example we also apply a regex filter and enable the `kubernetes_mode` option:
-```python
 [FILTER]
-    name               log_to_metrics
-    match              dummy.log*
-    tag                test_metric
-    metric_mode        gauge
-    metric_name        current_duration
-    metric_description This metric shows the current duration
-    value_field        duration
-    kubernetes_mode    on
-    regex              message .*el.*
-    add_label          app $kubernetes['labels']['app']
-    label_field        color
-    label_field        shape
+  name               log_to_metrics
+  match              dummy.log*
+  tag                test_metric
+  metric_mode        gauge
+  metric_name        current_duration
+  metric_description This metric shows the current duration
+  value_field        duration
+  kubernetes_mode    on
+  regex              message .*el.*
+  add_label          app $kubernetes['labels']['app']
+  label_field        color
+  label_field        shape
+
+[OUTPUT]
+  name               prometheus_exporter
+  match              *
+  host               0.0.0.0
+  port               9999
+```
+
+{% endtab %}
+{% tab title="prometheus.yml" %}
+
+Run this configuration file with Prometheus to collect the metrics from the Fluent Bit configurations.
+
+```yaml
+# config
+global:
+  scrape_interval: 5s
+
+scrape_configs:
+  # Scraping Fluent Bit example.
+  - job_name: "fluentbit"
+    static_configs:
+      - targets: ["localhost:9999"]
 ```
-You can then use e.g. curl command to retrieve the generated metric:
-```text
-> curl -s http://127.0.0.1:2021/metrics
+
+{% endtab %}
+{% endtabs %}
+
+You can then use a tool like curl to retrieve the generated metric:
+
+```shell
+$ curl -s http://127.0.0.1:9999/metrics
 
 
 # HELP log_metric_gauge_current_duration This metric shows the current duration
@@ -101,50 +257,123 @@ You can then use e.g. curl command to retrieve the generated metric:
 log_metric_gauge_current_duration{namespace_name="default",pod_name="pod1",container_name="mycontainer",docker_id="abc123",pod_id="def456",app="app1",color="blue",shape="square"} 60
 ```
 
-As you can see in the output, only one line is printed, as the records from the first input plugin are ignored, as they do not match the regex.
+In the resulting output, only one line is printed. Records from the first input plugin are ignored because they don't match the regular expression.
 
-The filter also allows to use multiple rules which are applied in order, you can have many _Regex_ and _Exclude_ entries as required (see [grep](./grep.md) filter plugin).
+This filter also lets you use multiple rules, which are applied in order. You can have as many `regex` and `exclude` entries as required (see [Grep](./grep.md) filter plugin).
 
-If you execute the above `curl` command multiple times, you see, that in this example the metric value stays at `60`, as the messages generated by the dummy plugin are not changing. In a real-world scenario the values would change and return the last processed value.
+If you execute the example curl command multiple times, the example metric value remains at `60` because the messages generated by the Dummy plugin don't change. In a real-world scenario, the values would change and return to the last processed value.
 
+#### Metric `label_values`
 
-#### Metric label_values
-As you can see, the label sets defined by `add_label` and `label_field` are added to the metric. The lines in the metric represent every combination of labels. Only actually used combinations are displayed here. To see this, you can add a dummy `dummy` input to your configuration.
+The label sets defined by `add_label` and `label_field` are added to the metric. The lines in the metric represent every combination of labels. Only combinations that are actually used are displayed here.
 
-The metric output would then look like:
-```text
-> curl -s http://127.0.0.1:2021/metrics
+### Histogram
 
-# HELP log_metric_gauge_current_duration This metric shows the current duration
-# TYPE log_metric_gauge_current_duration gauge
-log_metric_gauge_current_duration{namespace_name="default",pod_name="pod1",container_name="mycontainer",docker_id="abc123",pod_id="def456",app="app1",color="blue",shape="square"} 60
-log_metric_gauge_current_duration{namespace_name="default",pod_name="pod1",container_name="mycontainer",docker_id="abc123",pod_id="def456",app="app1",color="red",shape="circle"} 20
+Similar to the `gauge` mode, the `histogram` mode needs a `value_field` to specify where to generate the metric values from. This example also applies a `regex` filter and enables the `kubernetes_mode` option:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
 
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"message":"dummy", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 20, "color": "red", "shape": "circle"}'
+      tag: dummy.log
+
+    - name: dummy
+      dummy: '{"message":"hello", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 60, "color": "blue", "shape": "square"}'
+      tag: dummy.log2
+
+  filters:
+    - name: log_to_metrics
+      match: 'dummy.log*'
+      tag: test_metric
+      metric_mode: histogram
+      metric_name: current_duration
+      metric_description: 'This metric shows the request duration'
+      value_field: duration
+      kubernetes_mode: on
+      regex: 'message .*el.*'
+      add_label: app $kubernetes['labels']['app']
+      label_field:
+        - color
+        - shape
+
+  outputs:
+    - name: prometheus_exporter
+      match: '*'
+      host: 0.0.0.0
+      port: 9999
 ```
 
-You can also see, that all the kubernetes labels have been attached to the metric, accordingly. 
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[SERVICE]
+  flush              1
+  log_level          info
+
+[INPUT]
+  Name               dummy
+  Dummy              {"message":"dummy", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 20, "color": "red", "shape": "circle"}
+  Tag                dummy.log
 
-### Configuration  - Histogram
+[INPUT]
+  Name               dummy
+  Dummy              {"message":"hello", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 60, "color": "blue", "shape": "square"}
+  Tag                dummy.log2
 
-Similar to the `gauge` mode, `histogram` needs a `value_field` specified, where the current metric values are generated from. In this example we also apply a regex filter and enable the `kubernetes_mode` option:
-```python
 [FILTER]
-    name               log_to_metrics
-    match              dummy.log*
-    tag                test_metric
-    metric_mode        histogram
-    metric_name        current_duration
-    metric_description This metric shows the request duration
-    value_field        duration
-    kubernetes_mode    on
-    regex              message .*el.*
-    add_label          app $kubernetes['labels']['app']
-    label_field        color
-    label_field        shape
+  name               log_to_metrics
+  match              dummy.log*
+  tag                test_metric
+  metric_mode        histogram
+  metric_name        current_duration
+  metric_description This metric shows the request duration
+  value_field        duration
+  kubernetes_mode    on
+  regex              message .*el.*
+  add_label          app $kubernetes['labels']['app']
+  label_field        color
+  label_field        shape
+
+[OUTPUT]
+  name               prometheus_exporter
+  match              *
+  host               0.0.0.0
+  port               9999
 ```
-You can then use e.g. curl command to retrieve the generated metric:
-```text
-> curl -s http://127.0.0.1:2021/metrics
+
+{% endtab %}
+{% tab title="prometheus.yml" %}
+
+Run this configuration file with Prometheus to collect the metrics from the Fluent Bit configurations.
+
+```yaml
+# config
+global:
+  scrape_interval: 5s
+
+scrape_configs:
+  # Scraping Fluent Bit example.
+  - job_name: "fluentbit"
+    static_configs:
+      - targets: ["localhost:9999"]
+```
+
+{% endtab %}
+{% endtabs %}
+
+You can then use a tool like curl to retrieve the generated metric:
+
+```shell
+$ curl -s http://127.0.0.1:2021/metrics
 
 
 # HELP log_metric_histogram_current_duration This metric shows the request duration
@@ -179,32 +408,126 @@ log_metric_histogram_current_duration_sum{namespace_name="default",pod_name="pod
 log_metric_histogram_current_duration_count{namespace_name="default",pod_name="pod1",container_name="mycontainer",docker_id="abc123",pod_id="def456",app="app1",color="blue",shape="circle"} 27
 ```
 
-As you can see in the output, there are per default the buckets `0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0` and `+Inf`, in which values are sorted into. A sum and a counter are also part of this metric. You can specify own buckets in the config, like in the following example:
+In the resulting output, there are several buckets by default: `0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0` and `+Inf`. Values are sorted into these buckets. A sum and a counter are also part of this metric. You can specify own buckets in the configuration, like in the following example:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"message":"dummy", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 20, "color": "red", "shape": "circle"}'
+      tag: dummy.log
+
+    - name: dummy
+      dummy: '{"message":"hello", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 60, "color": "blue", "shape": "square"}'
+      tag: dummy.log2
+
+  filters:
+    - name: log_to_metrics
+      match: 'dummy.log*'
+      tag: test_metric
+      metric_mode: histogram
+      metric_name: current_duration
+      metric_description: 'This metric shows the HTTP request duration as histogram in milliseconds'
+      value_field: duration
+      kubernetes_mode: on
+      bucket:
+        - 1
+        - 5
+        - 10
+        - 50
+        - 1000
+        - 250
+        - 500
+        - 1000
+      regex: 'message .*el.*'
+      label_field:
+        - color
+        - shape
+
+  outputs:
+    - name: prometheus_exporter
+      match: '*'
+      host: 0.0.0.0
+      port: 9999
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[SERVICE]
+  flush              1
+  log_level          info
+
+[INPUT]
+  Name               dummy
+  Dummy              {"message":"dummy", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 20, "color": "red", "shape": "circle"}
+  Tag                dummy.log
+
+[INPUT]
+  Name               dummy
+  Dummy              {"message":"hello", "kubernetes":{"namespace_name": "default", "docker_id": "abc123", "pod_name": "pod1", "container_name": "mycontainer", "pod_id": "def456", "labels":{"app": "app1"}}, "duration": 60, "color": "blue", "shape": "square"}
+  Tag                dummy.log2
 
-```python
 [FILTER]
-    name               log_to_metrics
-    match              dummy.log*
-    tag                test_metric
-    metric_mode        histogram
-    metric_name        current_duration
-    metric_description This metric shows the HTTP request duration as histogram in milliseconds
-    value_field        duration
-    kubernetes_mode    on
-    bucket             1
-    bucket             5
-    bucket             10
-    bucket             50
-    bucket             100
-    bucket             250
-    bucket             500
-    bucket             1000
-    regex              message .*el.*
-    label_field        color
-    label_field        shape
+  name               log_to_metrics
+  match              dummy.log*
+  tag                test_metric
+  metric_mode        histogram
+  metric_name        current_duration
+  metric_description This metric shows the HTTP request duration as histogram in milliseconds
+  value_field        duration
+  kubernetes_mode    on
+  bucket             1
+  bucket             5
+  bucket             10
+  bucket             50
+  bucket             100
+  bucket             250
+  bucket             500
+  bucket             1000
+  regex              message .*el.*
+  label_field        color
+  label_field        shape
+
+[OUTPUT]
+  name               prometheus_exporter
+  match              *
+  host               0.0.0.0
+  port               9999
 ```
 
-Please note, that the `+Inf` bucket will always be included implicitly. The buckets in a histogram are cumulative, so a value added to one bucket will add to all larger buckets, too.
+{% endtab %}
+{% tab title="prometheus.yml" %}
+
+Run this configuration file with Prometheus to collect the metrics from the Fluent Bit configurations.
+
+```yaml
+# config
+global:
+  scrape_interval: 5s
+
+scrape_configs:
+  # Scraping Fluent Bit example.
+  - job_name: "fluentbit"
+    static_configs:
+      - targets: ["localhost:9999"]
+```
+
+{% endtab %}
+{% endtabs %}
+
+{% hint style="info" %}
+
+The `+Inf` bucket will always be included regardless of the buckets you specify. The buckets in a histogram are cumulative, so a value added to one bucket will be added to all larger buckets, too.
 
+{% endhint %}
 
-You can also see, that all the kubernetes labels have been attached to the metric, idential to the behavior of `label_field` described in [the previous chapter](#metric-label_values). That results in two sets for the histogram.
\ No newline at end of file
+This filter also attaches Kubernetes labels to each metric, identical to the behavior of `label_field`. This results in two sets for the histogram.
diff --git a/pipeline/filters/lua.md b/pipeline/filters/lua.md
index 09d56808a..e16e460bc 100644
--- a/pipeline/filters/lua.md
+++ b/pipeline/filters/lua.md
@@ -1,46 +1,67 @@
 # Lua
 
-The **Lua** filter allows you to modify the incoming records (even split one record into multiple records) using custom [Lua](https://www.lua.org/) scripts.
+The _Lua_ filter lets you modify incoming records (or split one record into multiple records) using custom [Lua](https://www.lua.org/) scripts.
 
-Due to the necessity to have a flexible filtering mechanism, it is now possible to extend Fluent Bit capabilities by writing custom filters using Lua programming language. A Lua-based filter takes two steps:
+A Lua-based filter requires two steps:
 
-1. Configure the Filter in the main configuration
-2. Prepare a Lua script that will be used by the Filter
+1. Configure the filter in the main configuration.
+1. Prepare a Lua script for the filter to use.
 
-## Configuration Parameters <a id="config"></a>
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
 | Key | Description |
-| :--- | :--- |
-| script | Path to the Lua script that will be used. This can be a relative path against the main configuration file. |
-| call | Lua function name that will be triggered to do filtering. It's assumed that the function is declared inside the **script** parameter defined above. |
-| type\_int\_key | If these keys are matched, the fields are converted to integer. If more than one key, delimit by space. Note that starting from Fluent Bit v1.6 integer data types are preserved and not converted to double as in previous versions. |
-| type\_array\_key| If these keys are matched, the fields are handled as array. If more than one key, delimit by space. It is useful the array can be empty. |
-| protected\_mode | If enabled, Lua script will be executed in protected mode. It prevents Fluent Bit from crashing when invalid Lua script is executed or the triggered Lua function throws exceptions. Default is true. |
-| time\_as\_table | By default when the Lua script is invoked, the record timestamp is passed as a *floating number* which might lead to precision loss when it is converted back. If you desire timestamp precision, enabling this option will pass the timestamp as a Lua table with keys `sec` for seconds since epoch and `nsec` for nanoseconds. |
-| code | Inline LUA code instead of loading from a path via `script`. |
-| enable_flb_null| If enabled, null will be converted to flb_null in Lua. It is useful to prevent removing key/value since nil is a special value to remove key value from map in Lua. Default is false. |
+| --- | ----------- |
+| `script` | Path to the Lua script that will be used. This can be a relative path against the main configuration file. |
+| `call` | The Lua function name that will be triggered to do filtering. It's assumed that the function is declared inside the `script` parameter. |
+| `type_int_key` | If these keys are matched, the fields are converted to integers. If more than one key, delimit by space. |
+| `type_array_key` | If these keys are matched, the fields are handled as array. If more than one key, delimit by space. The array can be empty. |
+| `protected_mode` | If enabled, the Lua script will be executed in protected mode. It prevents Fluent Bit from crashing when an invalid Lua script is executed or the triggered Lua function throws exceptions. Default value: `true`. |
+| `time_as_table` | By default, when the Lua script is invoked, the record timestamp is passed as a floating number, which might lead to precision loss when it's converted back. If you need timestamp precision, enabling this option will pass the timestamp as a Lua table with keys `sec` for seconds since epoch and `nsec` for nanoseconds. |
+| `code` | Inline Lua code instead of loading from a path defined in `script`. |
+| `enable_flb_null` | If enabled, `null` will be converted to `flb_null` in Lua. This helps prevent removing key/value since `nil` is a special value to remove key/value from map in Lua. Default value: `false`. |
 
-## Getting Started <a id="getting_started"></a>
+## Get started
 
-In order to test the filter, you can run the plugin from the command line or through the configuration file. The following examples use the [dummy](../inputs/dummy.md) input plugin for data ingestion, invoke Lua filter using the [test.lua](https://github.com/fluent/fluent-bit/blob/master/scripts/test.lua) script and call the [cb\_print\(\)](https://github.com/fluent/fluent-bit/blob/master/scripts/test.lua#L29) function which only prints the same information to the standard output:
+To test the Lua filter, you can run the plugin from the command line or through the configuration file. The following examples use the [dummy](../inputs/dummy.md) input plugin for data ingestion, invoke Lua filter using the [test.lua](https://github.com/fluent/fluent-bit/blob/master/scripts/test.lua) script, and call the [`cb_print()`](https://github.com/fluent/fluent-bit/blob/master/scripts/test.lua#L29) function, which only prints the same information to the standard output.
 
-### Command Line
+### Command line
 
 From the command line you can use the following options:
 
-```bash
-$ fluent-bit -i dummy -F lua -p script=test.lua -p call=cb_print -m '*' -o null
+```shell
+fluent-bit -i dummy -F lua -p script=test.lua -p call=cb_print -m '*' -o null
 ```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file, append the following `Input`, `Filter`, and `Output` sections:
 
-In your main configuration file append the following _Input_, _Filter_ & _Output_ sections:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+
+  filters:
+    - name: lua
+      match: '*'
+      script: test.lua
+      call: cb_print
+
+  outputs:
+    - name: null
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
     Name    dummy
 
@@ -54,268 +75,418 @@ In your main configuration file append the following _Input_, _Filter_ & _Output
     Name    null
     Match   *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-  inputs:
-    - name: dummy
-  filters:
-    - name: lua
-      match: '*'
-      script: test.lua
-      call:  cb_print
-  outputs:
-    - name: null
-      match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
+## Lua script filter API
 
-## Lua Script Filter API <a id="lua_script"></a>
-
-The life cycle of a filter have the following steps:
+The life cycle of a filter has the following steps:
 
-1. Upon Tag matching by this filter, it may process or bypass the record.
-2. If tag matched, it will accept the record and invoke the function defined in the `call` property which basically is the name of a function defined in the Lua `script`.
-3. Invoke Lua function and pass each record in JSON format.
-4. Upon return, validate return value and continue the pipeline.
+1. Upon tag matching by this filter, it might process or bypass the record.
+1. If the tag matched, it will accept the record and invoke the function defined in the `call` property, which is the name of a function defined in the Lua `script`.
+1. It invokes the Lua function and passes each record in JSON format.
+1. Upon return, it validates the return value and continues the pipeline.
 
-## Callback Prototype
+## Callback prototype
 
 The Lua script can have one or multiple callbacks that can be used by this filter. The function prototype is as follows:
 
 ```lua
 function cb_print(tag, timestamp, record)
-    ...
-    return code, timestamp, record
+  ...
+  return code, timestamp, record
 end
 ```
 
-#### Function Arguments
+### Function arguments
 
-| name | description |
-| :--- | :--- |
-| tag | Name of the tag associated with the incoming record. |
-| timestamp | Unix timestamp with nanoseconds associated with the incoming record. The original format is a double (seconds.nanoseconds) |
-| record | Lua table with the record content |
+| Name | Description |
+| ---- | ----------- |
+| `tag` | Name of the tag associated with the incoming record. |
+| `timestamp` | Unix timestamp with nanoseconds associated with the incoming record. The original format is a double (`seconds.nanoseconds`). |
+| `record` | Lua table with the record content. |
 
-#### Return Values
+### Return values
 
-Each callback **must** return three values:
+Each callback must return three values:
 
-| name | data type | description |
-| :--- | :--- | :--- |
-| code | integer | The code return value represents the result and further action that may follows. If _code_ equals -1, means that the record will be dropped. If _code_ equals 0, the record will not be modified, otherwise if _code_ equals 1, means the original timestamp and record have been modified so it must be replaced by the returned values from _timestamp_ (second return value) and _record_ (third return value). If _code_ equals 2, means the original timestamp is not modified and the record has been modified so it must be replaced by the returned values from _record_ (third return value). The _code_ 2 is supported from v1.4.3. |
-| timestamp | double | If code equals 1, the original record timestamp will be replaced with this new value. |
-| record | table | If code equals 1, the original record information will be replaced with this new value. Note that the _record_ value **must** be a valid Lua table. This value can be an array of tables (i.e., array of objects in JSON format), and in that case the input record is effectively split into multiple records. (see below for more details) |
+| Name | Data type | Description |
+| ---- | --------- | ----------- |
+| `code` | integer | The code return value represents the result and further actions that might follow. If `code` equals `-1`, this means that the record will be dropped. If `code` equals `0`, the record won't be modified. Otherwise, if `code` equals `1`, this means the original timestamp and record have been modified, so it must be replaced by the returned values from `timestamp` (second return value) and `record` (third return value). If `code` equals `2`, this means the original timestamp won't be modified and the record has been modified, so it must be replaced by the returned values from `record` (third return value). |
+| `timestamp` | double | If `code` equals `1`, the original record timestamp will be replaced with this new value. |
+| `record` | table | If `code` equals `1`, the original record information will be replaced with this new value. The `record` value must be a valid Lua table. This value can be an array of tables (for example, an array of objects in JSON format), and in that case the input record is effectively split into multiple records. |
 
-### Code Examples
+## Lua extended callback with groups and metadata support
 
-For functional examples of this interface, please refer to the code samples provided in the source code of the project located here:
+{% hint style="info" %}
+This feature requires Fluent Bit version 4.0.4 or later.
+{% endhint %}
 
-[https://github.com/fluent/fluent-bit/tree/master/scripts](https://github.com/fluent/fluent-bit/tree/master/scripts)
+For more advanced use cases, especially when working with structured formats like OpenTelemetry logs, Fluent Bit supports an extended callback prototype that provides access to group metadata and record metadata.
 
-#### Inline configuration
+### Extended function signature
 
-The [Fluent Bit smoke tests](https://github.com/fluent/fluent-bit/tree/master/packaging/testing/smoke/container) include examples to verify during CI.
+```lua
+function cb_metadata(tag, timestamp, group, metadata, record)
+  ...
+  return code, timestamp, metadata, record
+end
+```
 
-{% tabs %}
-{% tab title="fluent-bit.conf" %}
+#### Extended function arguments
+
+| Name | Description |
+| ---- | ----------- |
+| `tag` | Name of the tag associated with the incoming record. |
+| `timestamp` | Unix timestamp with nanoseconds associated with the incoming record. |
+| `group` | A read-only table containing group-level metadata (for example, OpenTelemetry resource or scope info). This will be an empty table if the log isn't part of a group. |
+| `metadata` | A table representing the record-specific metadata. You can modify this if needed. |
+| `record` | Lua table with the record content. |
+
+#### Extended return values
+
+Each extended callback must return four values:
+
+| Name | Data type | Description |
+| ---- | --------- | ----------- |
+| `code` | integer | The code return value: `-1` (drop record), `0` (no modification), or `1` (record was modified). |
+| `timestamp` | double | The updated timestamp. |
+| `metadata` | table | A new or modified metadata table. |
+| `record` | table | A new or modified log record. This can be an array of tables for splitting records. |
+
+### Function signature detection
+
+At load time, the Lua filter automatically detects which callback prototype to use based on the number of parameters:
+
+- Three arguments: Uses the classic mode (`tag`, `timestamp`, `record`)
+- Five arguments: Uses the metadata-aware mode (`tag`, `timestamp`, `group`, `metadata`, `record`)
+
+This ensures backward compatibility with existing Lua scripts.
+
+### Multiple records with metadata
+
+When using the extended prototype, you can return multiple records with their respective metadata:
+
+```lua
+function cb_metadata(tag, ts, group, metadata, record)
+  -- first record with its metadata
+  m1 = {foo = "meta1"}
+  r1 = {msg = "first log", old_record = record}
+
+  -- second record with its metadata
+  m2 = {foo = "meta2"}
+  r2 = {msg = "second log", old_record = record}
+
+  return 1, ts, {m1, m2}, {r1, r2}
+end
 ```
-[SERVICE]
-	flush 1
-	daemon off
-	log_level debug
 
-[INPUT]
-	Name random
-	Tag test
-	Samples 10
+{% hint style="info" %}
 
-[FILTER]
-	Name Lua
-	Match *
-	call append_tag
-	code function append_tag(tag, timestamp, record) new_record = record new_record["tag"] = tag return 1, timestamp, new_record end
+The metadata and record arrays must have the same length.
 
-[OUTPUT]
-	Name stdout
-	Match *
+{% endhint %}
+
+### OpenTelemetry example
+
+This example demonstrates processing OpenTelemetry logs with group metadata access:
+
+#### Configuration [#configuration-otel]
+
+```yaml
+pipeline:
+  inputs:
+    - name: opentelemetry
+      port: 4318
+      processors:
+        logs:
+          - name: lua
+            call: cb_groups_and_metadata
+            code: |
+              function cb_groups_and_metadata(tag, timestamp, group, metadata, record)
+                -- copy the OTLP metadata 'service.name' to the record
+                if group['resource']['attributes']['service.name'] then
+                  record['service_name'] = group['resource']['attributes']['service.name']
+                end
+
+                -- change OTLP Log severity by modifying the record metadata
+                if metadata['otlp']['severity_number'] then
+                  if metadata['otlp']['severity_number'] == 9 then
+                    -- change severity 9 to 13
+                    metadata['otlp']['severity_number'] = 13
+                    metadata['otlp']['severity_text'] = 'WARN'
+                  end
+                end
+
+                return 1, timestamp, metadata, record
+              end
+
+  outputs:
+    - name: stdout
+      match: '*'
 ```
-{% endtab %}
 
+#### Input JSON
+
+```json
+{
+  "resourceLogs": [
+    {
+      "resource": {
+        "attributes": [
+          { "key": "service.name", "value": { "stringValue": "my-app" } },
+          { "key": "host.name", "value": { "stringValue": "localhost" } }
+        ]
+      },
+      "scopeLogs": [
+        {
+          "scope": {
+            "name": "example-logger",
+            "version": "1.0.0"
+          },
+          "logRecords": [
+            {
+              "timeUnixNano": "1717920000000000000",
+              "severityNumber": 9,
+              "severityText": "INFO",
+              "body": {
+                "stringValue": "User logged in successfully"
+              },
+              "attributes": [
+                { "key": "user.id", "value": { "stringValue": "12345" } },
+                { "key": "env", "value": { "stringValue": "prod" } }
+              ]
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
+```
+
+{% hint style="info" %}
+
+Group metadata is read-only and should not be modified. If you don't need group or metadata support, you can continue using the three-argument prototype.
+
+{% endhint %}
+
+## Features
+
+### Inline configuration
+
+The [Fluent Bit smoke tests](https://github.com/fluent/fluent-bit/tree/master/packaging/testing/smoke/container) include examples to verify during CI.
+
+{% tabs %}
 {% tab title="fluent-bit.yaml" %}
+
 ```yaml
 service:
-    flush:           1
-    daemon:          off
-    log_level:       info
+  flush: 1
+  daemon: off
+  log_level: info
 
 pipeline:
-    inputs:
-        - name:    random
-          tag:     test
-          samples: 10
-
-    filters:
-        - name:  lua
-          match: "*"
-          call:  append_tag
-          code:  |
-              function append_tag(tag, timestamp, record)
-                 new_record = record
-                 new_record["tag"] = tag
-                 return 1, timestamp, new_record
-              end
+  inputs:
+    - name: random
+      tag: test
+      samples: 10
 
-    outputs:
-        - name:  stdout
-          match: "*"
+  filters:
+    - name: lua
+      match: '*'
+      call: append_tag
+      code:  |
+        function append_tag(tag, timestamp, record)
+          new_record = record
+          new_record["my_env"] = FLB_ENV
+          return 1, timestamp, new_record
+        end
+
+  outputs:
+    - name: stdout
+      match: '*'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[SERVICE]
+  flush 1
+  daemon off
+  log_level debug
+
+[INPUT]
+  Name random
+  Tag test
+  Samples 10
+
+[FILTER]
+  Name Lua
+  Match *
+  call append_tag
+  code function append_tag(tag, timestamp, record) new_record = record new_record["tag"] = tag return 1, timestamp, new_record end
+
+[OUTPUT]
+  Name stdout
+  Match *
+```
+
 {% endtab %}
 {% endtabs %}
 
-#### Environment variable processing
+### Number type
 
-As an example that combines a bit of LUA processing with the [Kubernetes filter](./kubernetes.md) that demonstrates using environment variables with LUA regex and substitutions.
+Lua treats numbers as a `double` type, which means an `integer` type containing data like user IDs and log levels will be converted to a `double`. To avoid type conversion, use the `type_int_key` property.
 
-Kubernetes pods generally have various environment variables set by the infrastructure automatically which may contain useful information.
+### Protected mode
 
-In this example, we want to extract part of the Kubernetes cluster API name.
+Fluent Bit supports protected mode to prevent crashes if it executes an invalid Lua script. See [Error Handling in Application Code](https://www.lua.org/pil/24.3.1.html) in the Lua documentation for more information.
 
-The environment variable is set like so:
-`KUBERNETES_SERVICE_HOST: api.sandboxbsh-a.project.domain.com`
+## Code examples
 
-We want to extract the `sandboxbsh` name and add it to our record as a special key.
+For functional examples of this interface, refer to the code samples provided in the source code of the project.
 
-{% tabs %}
-{% tab title="fluent-bit.conf" %}
-```
-      [FILTER]
-          Name                lua
-          Alias               filter-iots-lua
-          Match               iots_thread.*
-          Script              filters.lua
-          Call                set_landscape_deployment
-```
-{% endtab %}
+### Processing environment variables
+
+As an example that combines Lua processing with the [Kubernetes filter](./kubernetes.md) that demonstrates using environment variables with Lua regular expressions and substitutions.
+
+Kubernetes pods generally have various environment variables set by the infrastructure automatically, which can contain valuable information.
+
+This example extracts part of the Kubernetes cluster API name.
 
+The environment variable is set as `KUBERNETES_SERVICE_HOST: api.sandboxbsh-a.project.domain.com`.
+
+The goal of this example is to extract the `sandboxbsh` name and add it to the record as a special key.
+
+{% tabs %}
 {% tab title="fluent-bit.yaml" %}
+
 ```yaml
+pipeline:
   filters:
     - name: lua
       alias: filter-iots-lua
       match: iots_thread.*
       script: filters.lua
-      call:  set_landscape_deployment
+      call: set_landscape_deployment
 ```
-{% endtab %}
-{% endtabs %}
 
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-filters.lua:
-```lua
-    -- Use a Lua function to create some additional entries based
-    -- on substrings from the kubernetes properties.
-    function set_landscape_deployment(tag, timestamp, record)
-        local landscape = os.getenv("KUBERNETES_SERVICE_HOST")
-        if landscape then
-            -- Strip the landscape name from this field, KUBERNETES_SERVICE_HOST
-            -- Should be of this format
-            -- api.sandboxbsh-a.project.domain.com
-            -- Take off the leading "api."
-            -- sandboxbsh-a.project.domain.com
-            --print("landscape1:" .. landscape)
-            landscape = landscape:gsub("^[^.]+.", "")
-            --print("landscape2:" .. landscape)
-            -- Take off everything including and after the - in the cluster name
-            -- sandboxbsh
-            landscape = landscape:gsub("-.*$", "")
-            -- print("landscape3:" .. landscape)
-            record["iot_landscape"] = landscape
-        end
-        -- 2 - replace existing record with this update
-        return 2, timestamp, record
-    end
+```text
+[FILTER]
+  Name                lua
+  Alias               filter-iots-lua
+  Match               iots_thread.*
+  Script              filters.lua
+  Call                set_landscape_deployment
 ```
 
-### Number Type
-
-+Lua treats number as double. It means an integer field (e.g. IDs, log levels) will be converted double. To avoid type conversion, The `type_int_key` property is available.
+{% endtab %}
+{% endtabs %}
 
-### Protected Mode
+filters.lua:
 
-Fluent Bit supports protected mode to prevent crash when executes invalid Lua script. See also [Error Handling in Application Code](https://www.lua.org/pil/24.3.1.html).
+```lua
+-- Use a Lua function to create some additional entries based
+-- on substrings from the kubernetes properties.
+function set_landscape_deployment(tag, timestamp, record)
+  local landscape = os.getenv("KUBERNETES_SERVICE_HOST")
+  if landscape then
+    -- Strip the landscape name from this field, KUBERNETES_SERVICE_HOST
+    -- Should be of this format
+    -- api.sandboxbsh-a.project.domain.com
+    -- Take off the leading "api."
+    -- sandboxbsh-a.project.domain.com
+    --print("landscape1:" .. landscape)
+    landscape = landscape:gsub("^[^.]+.", "")
+    --print("landscape2:" .. landscape)
+    -- Take off everything including and after the - in the cluster name
+    -- sandboxbsh
+    landscape = landscape:gsub("-.*$", "")
+    -- print("landscape3:" .. landscape)
+    record["iot_landscape"] = landscape
+  end
+  -- 2 - replace existing record with this update
+  return 2, timestamp, record
+end
+```
 
-### Record Split
+### Record split
 
-The Lua callback function can return an array of tables (i.e., array of records) in its third _record_ return value. With this feature, the Lua filter can split one input record into multiple records according to custom logic.
+The Lua callback function can return an array of tables (for example, an array of records) in its third `record` return value. With this feature, the Lua filter can split one input record into multiple records according to custom logic.
 
 For example:
 
-#### Lua script
+#### Lua script [#lua-record-split]
 
 ```lua
 function cb_split(tag, timestamp, record)
-    if record["x"] ~= nil then
-        return 2, timestamp, record["x"]
-    else
-        return 2, timestamp, record
-    end
+  if record["x"] ~= nil then
+    return 2, timestamp, record["x"]
+  else
+    return 2, timestamp, record
+  end
 end
 ```
 
-#### Configuration
+#### Configuration [#configuration-record-split]
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```python
-[Input]
-    Name    stdin
-
-[Filter]
-    Name    lua
-    Match   *
-    script  test.lua
-    call    cb_split
-
-[Output]
-    Name    stdout
-    Match   *
-```
-{% endtab %}
-
 {% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
   inputs:
     - name: stdin
+
   filters:
     - name: lua
       match: '*'
       script: test.lua
       call: cb_split
+
   outputs:
     - name: stdout
       match: '*'
 ```
+
 {% endtab %}
-{% endtabs %}
+{% tab title="fluent-bit.conf" %}
 
-#### Input
+```text
+[Input]
+  Name    stdin
 
+[Filter]
+  Name    lua
+  Match   *
+  script  test.lua
+  call    cb_split
+
+[Output]
+  Name    stdout
+  Match   *
 ```
+
+{% endtab %}
+{% endtabs %}
+
+#### Input [#input-record-split]
+
+```text
 {"x": [ {"a1":"aa", "z1":"zz"}, {"b1":"bb", "x1":"xx"}, {"c1":"cc"} ]}
 {"x": [ {"a2":"aa", "z2":"zz"}, {"b2":"bb", "x2":"xx"}, {"c2":"cc"} ]}
 {"a3":"aa", "z3":"zz", "b3":"bb", "x3":"xx", "c3":"cc"}
 ```
 
-#### Output
+#### Output [#output-record-split]
 
-```
+```text
 [0] stdin.0: [1538435928.310583591, {"a1"=>"aa", "z1"=>"zz"}]
 [1] stdin.0: [1538435928.310583591, {"x1"=>"xx", "b1"=>"bb"}]
 [2] stdin.0: [1538435928.310583591, {"c1"=>"cc"}]
@@ -329,10 +500,9 @@ See also [Fluent Bit: PR 811](https://github.com/fluent/fluent-bit/pull/811).
 
 ### Response code filtering
 
-In this example, we want to filter istio logs to exclude lines with response codes between 1 and 399.
-Istio is configured to write the logs in json format.
+This example filters Istio logs to exclude lines with a response code between `1` and `399`. Istio is configured to write logs in JSON format.
 
-#### Lua script
+#### Lua script [#lua-response-code]
 
 Script `response_code_filter.lua`
 
@@ -349,34 +519,13 @@ function cb_response_code_filter(tag, timestamp, record)
 end
 ```
 
-#### Configuration
+#### Configuration [#configuration-response-code]
 
-Configuration to get istio logs and apply response code filter to them.
+Configuration to get Istio logs and apply response code filter to them.
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```ini
-    [INPUT]
-        Name                tail
-        Path                /var/log/containers/*_istio-proxy-*.log
-        multiline.parser    docker, cri
-        Tag                 istio.*
-        Mem_Buf_Limit       64MB
-        Skip_Long_Lines     Off
-
-    [FILTER]
-        Name                lua
-        Match               istio.*
-        Script              response_code_filter.lua
-        call                cb_response_code_filter
-
-    [Output]
-        Name                stdout
-        Match               *
-```
-{% endtab %}
-
 {% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
   inputs:
@@ -386,53 +535,273 @@ pipeline:
       tag: istio.*
       mem_buf_limit: 64MB
       skip_long_lines: off
+
   filters:
     - name: lua
       match: istio.*
       script: response_code_filter.lua
       call: cb_response_code_filter
+
   outputs:
     - name: stdout
       match: '*'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[INPUT]
+  Name                tail
+  Path                /var/log/containers/*_istio-proxy-*.log
+  multiline.parser    docker, cri
+  Tag                 istio.*
+  Mem_Buf_Limit       64MB
+  Skip_Long_Lines     Off
+
+[FILTER]
+  Name                lua
+  Match               istio.*
+  Script              response_code_filter.lua
+  call                cb_response_code_filter
+
+[Output]
+  Name                stdout
+  Match               *
+```
+
 {% endtab %}
 {% endtabs %}
 
-#### Input
+#### Input [#input-response-code]
 
 ```json
 {
-    "log": {
-        "response_code": 200,
-        "bytes_sent": 111328341,
-        "authority": "randomservice.randomservice",
-        "duration": 14493,
-        "request_id": "2e9d38f8-36a9-40a6-bdb2-47c8eb7d399d",
-        "upstream_local_address": "10.11.82.178:42738",
-        "downstream_local_address": "10.10.21.17:80",
-        "upstream_cluster": "outbound|80||randomservice.svc.cluster.local",
-        "x_forwarded_for": null,
-        "route_name": "default",
-        "upstream_host": "10.11.6.90:80",
-        "user_agent": "RandomUserAgent",
-        "response_code_details": "via_upstream",
-        "downstream_remote_address": "10.11.82.178:51096",
-        "bytes_received": 1148,
-        "path": "/?parameter=random",
-        "response_flags": "-",
-        "start_time": "2022-07-28T11:16:51.663Z",
-        "upstream_transport_failure_reason": null,
-        "method": "POST",
-        "connection_termination_details": null,
-        "protocol": "HTTP/1.1",
-        "requested_server_name": null,
-        "upstream_service_time": "6161"
-    },
-    "stream": "stdout",
-    "time": "2022-07-28T11:17:06.704109897Z"
+  "log": {
+    "response_code": 200,
+    "bytes_sent": 111328341,
+    "authority": "randomservice.randomservice",
+    "duration": 14493,
+    "request_id": "2e9d38f8-36a9-40a6-bdb2-47c8eb7d399d",
+    "upstream_local_address": "10.11.82.178:42738",
+    "downstream_local_address": "10.10.21.17:80",
+    "upstream_cluster": "outbound|80||randomservice.svc.cluster.local",
+    "x_forwarded_for": null,
+    "route_name": "default",
+    "upstream_host": "10.11.6.90:80",
+    "user_agent": "RandomUserAgent",
+    "response_code_details": "via_upstream",
+    "downstream_remote_address": "10.11.82.178:51096",
+    "bytes_received": 1148,
+    "path": "/?parameter=random",
+    "response_flags": "-",
+    "start_time": "2022-07-28T11:16:51.663Z",
+    "upstream_transport_failure_reason": null,
+    "method": "POST",
+    "connection_termination_details": null,
+    "protocol": "HTTP/1.1",
+    "requested_server_name": null,
+    "upstream_service_time": "6161"
+  },
+  "stream": "stdout",
+  "time": "2022-07-28T11:17:06.704109897Z"
 }
 ```
 
+#### Output [#output-response-code]
+
+In the output, only the messages with response code `0` or greater than `399` are shown.
+
+### Time format conversion
+
+The following example converts a field's specific type of `datetime` format to the UTC ISO 8601 format.
+
+#### Lua script [#lua-time-format]
+
+Script `custom_datetime_format.lua`:
+
+```lua
+function convert_to_utc(tag, timestamp, record)
+  local date_time = record["pub_date"]
+  local new_record = record
+  if date_time then
+    if string.find(date_time, ",") then
+      local pattern = "(%a+, %d+ %a+ %d+ %d+:%d+:%d+) ([+-]%d%d%d%d)"
+      local date_part, zone_part = date_time:match(pattern)
+
+      if date_part and zone_part then
+        local command = string.format("date -u -d '%s %s' +%%Y-%%m-%%dT%%H:%%M:%%SZ", date_part, zone_part)
+        local handle = io.popen(command)
+        local result = handle:read("*a")
+        handle:close()
+        new_record["pub_date"] = result:match("%S+")
+      end
+    end
+  end
+  return 1, timestamp, new_record
+end
+```
+
+#### Configuration [#configuration-time-format]
+
+Use this configuration to obtain a JSON key with `datetime`, and then convert it to another format.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"event": "Restock", "pub_date": "Tue, 30 Jul 2024 18:01:06 +0000"}'
+      tag: event_category_a
+
+    - name: dummy
+      dummy: '{"event": "Soldout", "pub_date": "Mon, 29 Jul 2024 10:15:00 +0600"}'
+      tag: event_category_b
+
+  filters:
+    - name: lua
+      match: '*'
+      code: |
+        function convert_to_utc(tag, timestamp, record)
+          local date_time = record["pub_date"]
+          local new_record = record
+          if date_time then
+            if string.find(date_time, ",") then
+              local pattern = "(%a+, %d+ %a+ %d+ %d+:%d+:%d+) ([+-]%d%d%d%d)"
+              local date_part, zone_part = date_time:match(pattern)
+              if date_part and zone_part then
+                local command = string.format("date -u -d '%s %s' +%%Y-%%m-%%dT%%H:%%M:%%SZ", date_part, zone_part)
+                local handle = io.popen(command)
+                local result = handle:read("*a")
+                handle:close()
+                new_record["pub_date"] = result:match("%S+")
+              end
+            end
+          end
+          return 1, timestamp, new_record
+        end
+      call: convert_to_utc
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[INPUT]
+  Name    dummy
+  Dummy   {"event": "Restock", "pub_date": "Tue, 30 Jul 2024 18:01:06 +0000"}
+  Tag     event_category_a
+
+[INPUT]
+  Name    dummy
+  Dummy   {"event": "Soldout", "pub_date": "Mon, 29 Jul 2024 10:15:00 +0600"}
+  Tag     event_category_b
+
+[FILTER]
+  Name                lua
+  Match               *
+  Script              custom_datetime_format.lua
+  call                convert_to_utc
+
+[Output]
+  Name                stdout
+  Match               *
+```
+
+{% endtab %}
+{% endtabs %}
+
+#### Input [#input-time-format]
+
+```json
+{"event": "Restock", "pub_date": "Tue, 30 Jul 2024 18:01:06 +0000"}
+```
+
+and
+
+```json
+{"event": "Soldout", "pub_date": "Mon, 29 Jul 2024 10:15:00 +0600"}
+```
+
+Which are handled by dummy in this example.
+
+#### Output [#output-time-format]
+
+The output of this process shows the conversion of the `datetime` of two timezones to ISO 8601 format in UTC.
+
+```text
+...
+[2024/08/01 00:56:25] [ info] [output:stdout:stdout.0] worker #0 started
+[0] event_category_a: [[1722452186.727104902, {}], {"event"=>"Restock", "pub_date"=>"2024-07-30T18:01:06Z"}]
+[0] event_category_b: [[1722452186.730255842, {}], {"event"=>"Soldout", "pub_date"=>"2024-07-29T04:15:00Z"}]
+...
+```
+
+### Using configuration variables
+
+Fluent Bit supports definition of configuration variables, which can be done in the following way:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+env:
+  myvar1: myvalue1
+```
+
+{% endtab %}
+{% endtabs %}
+
+These variables can be accessed from the Lua code by referring to the `FLB_ENV` Lua table. Since this is a Lua table, you can access its sub-records through the same syntax (for example, `FLB_ENV['A']`).
+
+#### Configuration [#configuration-env-var]
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+env:
+  A: aaa
+  B: bbb
+  C: ccc
+
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: random
+      tag: test
+      samples: 10
+
+  filters:
+    - name: lua
+      match: '*'
+      call: append_tag
+      code:  |
+        function append_tag(tag, timestamp, record)
+          new_record = record
+          new_record["my_env"] = FLB_ENV
+          return 1, timestamp, new_record
+        end
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% endtabs %}
+
 #### Output
 
-In the output only the messages with response code 0 or greater than 399 are shown.
+```text
+test: [[1731990257.781970977, {}], {"my_env"=>{"A"=>"aaa", "C"=>"ccc", "HOSTNAME"=>"monox-2.lan", "B"=>"bbb"}, "rand_value"=>4805047635809401856}]
+```
diff --git a/pipeline/filters/modify.md b/pipeline/filters/modify.md
index b769f7537..1a9cc32c4 100644
--- a/pipeline/filters/modify.md
+++ b/pipeline/filters/modify.md
@@ -1,15 +1,15 @@
 # Modify
 
-The _Modify Filter_ plugin allows you to change records using rules and conditions.
+The _Modify Filter_ plugin lets you change records using rules and conditions.
 
 ## Example usage
 
-As an example using JSON notation to,
+As an example, use JSON notation to:
 
-* Rename `Key2` to `RenamedKey`
-* Add a key `OtherKey` with value `Value3` if `OtherKey` does not yet exist
+- Rename `Key2` to `RenamedKey`
+- Add a key `OtherKey` with value `Value3` if `OtherKey` doesn't yet exist
 
-_Example \(input\)_
+Example (input):
 
 ```text
 {
@@ -18,7 +18,7 @@ _Example \(input\)_
 }
 ```
 
-_Example \(output\)_
+Example (output):
 
 ```text
 {
@@ -28,7 +28,9 @@ _Example \(output\)_
 }
 ```
 
-## Configuration Parameters
+## Configuration parameters
+
+The Modify filter supports multiple parameters.
 
 ### Rules
 
@@ -36,21 +38,21 @@ The plugin supports the following rules:
 
 | Operation | Parameter 1 | Parameter 2 | Description |
 | :--- | :--- | :--- | :--- |
-| Set | STRING:KEY | STRING:VALUE | Add a key/value pair with key `KEY` and value `VALUE`. If `KEY` already exists, _this field is overwritten_ |
-| Add | STRING:KEY | STRING:VALUE | Add a key/value pair with key `KEY` and value `VALUE` if `KEY` does not exist |
-| Remove | STRING:KEY | NONE | Remove a key/value pair with key `KEY` if it exists |
-| Remove\_wildcard | WILDCARD:KEY | NONE | Remove all key/value pairs with key matching wildcard `KEY` |
-| Remove\_regex | REGEXP:KEY | NONE | Remove all key/value pairs with key matching regexp `KEY` |
-| Rename | STRING:KEY | STRING:RENAMED\_KEY | Rename a key/value pair with key `KEY` to `RENAMED_KEY` if `KEY` exists AND `RENAMED_KEY` _does not exist_ |
-| Hard\_rename | STRING:KEY | STRING:RENAMED\_KEY | Rename a key/value pair with key `KEY` to `RENAMED_KEY` if `KEY` exists. If `RENAMED_KEY` already exists, _this field is overwritten_ |
-| Copy | STRING:KEY | STRING:COPIED\_KEY | Copy a key/value pair with key `KEY` to `COPIED_KEY` if `KEY` exists AND `COPIED_KEY` _does not exist_ |
-| Hard\_copy | STRING:KEY | STRING:COPIED\_KEY | Copy a key/value pair with key `KEY` to `COPIED_KEY` if `KEY` exists. If `COPIED_KEY` already exists, _this field is overwritten_ |
-| Move\_to\_start | WILDCARD:KEY | NONE | Move key/value pairs with keys matching KEY to the start of the message |
-| Move\_to\_end | WILDCARD:KEY | NONE | Move key/value pairs with keys matching KEY to the end of the message |
-
-* Rules are case insensitive, parameters are not
-* Any number of rules can be set in a filter instance.
-* Rules are applied in the order they appear, with each rule operating on the result of the previous rule.
+| `Set` | `STRING:KEY` | `STRING:VALUE` | Add a key/value pair with key `KEY` and value `VALUE`. If `KEY` already exists, this field is overwritten. |
+| `Add` | `STRING:KEY` | `STRING:VALUE` | Add a key/value pair with key `KEY` and value `VALUE` if `KEY` doesn't exist. |
+| `Remove` | `STRING:KEY` | _none_ | Remove a key/value pair with key `KEY` if it exists. |
+| `Remove_wildcard` | `WILDCARD:KEY` | _none_ | Remove all key/value pairs with key matching wildcard `KEY`. |
+| `Remove_regex` | `REGEXP:KEY` | _none_ | Remove all key/value pairs with key matching regexp `KEY`. |
+| `Rename` | `STRING:KEY` | `STRING:RENAMED_KEY` | Rename a key/value pair with key `KEY` to `RENAMED_KEY` if `KEY` exists and `RENAMED_KEY` doesn't exist. |
+| `Hard_rename` | `STRING:KEY` | `STRING:RENAMED_KEY` | Rename a key/value pair with key `KEY` to `RENAMED_KEY` if `KEY` exists. If `RENAMED_KEY` already exists, this field is overwritten. |
+| `Copy` | `STRING:KEY` | `STRING:COPIED_KEY` | Copy a key/value pair with key `KEY` to `COPIED_KEY` if `KEY` exists and `COPIED_KEY` doesn't exist. |
+| `Hard_copy` | `STRING:KEY` | `STRING:COPIED_KEY` | Copy a key/value pair with key `KEY` to `COPIED_KEY` if `KEY` exists. If `COPIED_KEY` already exists, this field is overwritten. |
+| `Move_to_start` | `WILDCARD:KEY` | _none_ | Move key/value pairs with keys matching `KEY` to the start of the message. |
+| `Move_to_end` | `WILDCARD:KEY` | _none_ | Move key/value pairs with keys matching `KEY` to the end of the message. |
+
+- Rules are case-insensitive, but parameters aren't.
+- Any number of rules can be set in a filter instance.
+- Rules are applied in the order they appear, with each rule operating on the result of the previous rule.
 
 ### Conditions
 
@@ -58,26 +60,28 @@ The plugin supports the following conditions:
 
 | Condition | Parameter | Parameter 2 | Description |
 | :--- | :--- | :--- | :--- |
-| Key\_exists | STRING:KEY | NONE | Is `true` if `KEY` exists |
-| Key\_does\_not\_exist | STRING:KEY | NONE | Is `true` if `KEY` does not exist |
-| A\_key\_matches | REGEXP:KEY | NONE | Is `true` if a key matches regex `KEY` |
-| No\_key\_matches | REGEXP:KEY | NONE | Is `true` if no key matches regex `KEY` |
-| Key\_value\_equals | STRING:KEY | STRING:VALUE | Is `true` if `KEY` exists and its value is `VALUE` |
-| Key\_value\_does\_not\_equal | STRING:KEY | STRING:VALUE | Is `true` if `KEY` exists and its value is not `VALUE` |
-| Key\_value\_matches | STRING:KEY | REGEXP:VALUE | Is `true` if key `KEY` exists and its value matches `VALUE` |
-| Key\_value\_does\_not\_match | STRING:KEY | REGEXP:VALUE | Is `true` if key `KEY` exists and its value does not match `VALUE` |
-| Matching\_keys\_have\_matching\_values | REGEXP:KEY | REGEXP:VALUE | Is `true` if all keys matching `KEY` have values that match `VALUE` |
-| Matching\_keys\_do\_not\_have\_matching\_values | REGEXP:KEY | REGEXP:VALUE | Is `true` if all keys matching `KEY` have values that do not match `VALUE` |
-
-* Conditions are case insensitive, parameters are not
-* Any number of conditions can be set.
-* Conditions apply to the whole filter instance and all its rules. _Not_ to individual rules.
-* All conditions have to be `true` for the rules to be applied.
-* You can set [Record Accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md) as `STRING:KEY` for nested key.
-
-## Example \#1 - Add and Rename
-
-In order to start filtering records, you can run the filter from the command line or through the configuration file. The following invokes the [Memory Usage Input Plugin](../inputs/memory-metrics.md), which outputs the following \(example\),
+| `Key_exists` | `STRING:KEY` | _none_ | Is `true` if `KEY` exists. |
+| `Key_does_not_exist` | `STRING:KEY` | _none_ | Is `true` if `KEY` doesn't exist. |
+| `A_key_matches` | `REGEXP:KEY` | _none_ | Is `true` if a key matches regular expression `KEY`. |
+| `No_key_matches` | `REGEXP:KEY` | _none_ | Is `true` if no key matches regular expression `KEY`. |
+| `Key_value_equals` | `STRING:KEY` | `STRING:VALUE` | Is `true` if `KEY` exists and its value is `VALUE`. |
+| `Key_value_does_not_equal` | `STRING:KEY` | `STRING:VALUE` | Is `true` if `KEY` exists and its value isn't `VALUE`. |
+| `Key_value_matches` | `STRING:KEY` | `REGEXP:VALUE` | Is `true` if key `KEY` exists and its value matches `VALUE`. |
+| `Key_value_does_not_match` | `STRING:KEY` | `REGEXP:VALUE` | Is `true` if key `KEY` exists and its value doesn't match `VALUE`. |
+| `Matching_keys_have_matching_values` | `REGEXP:KEY` | `REGEXP:VALUE` | Is `true` if all keys matching `KEY` have values that match `VALUE`. |
+| `Matching_keys_do_not_have_matching_values` | `REGEXP:KEY` | `REGEXP:VALUE` | Is `true` if all keys matching `KEY` have values that don't match `VALUE`. |
+
+- Conditions are case-insensitive, but parameters aren't.
+- Any number of conditions can be set.
+- Conditions apply to the whole filter instance and all its rules. _Not_ to individual rules.
+- All conditions must be `true` for the rules to be applied.
+- You can set [Record Accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md) as `STRING:KEY` for nested key.
+
+## Example 1 - add and rename
+
+To start filtering records, you can run the filter from the command line or through
+the configuration file. The following invokes the [Memory Usage Input Plugin](../inputs/memory-metrics.md),
+which outputs data similar to the following:
 
 ```text
 [0] memory: [1488543156, {"Mem.total"=>1016044, "Mem.used"=>841388, "Mem.free"=>174656, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]
@@ -86,79 +90,84 @@ In order to start filtering records, you can run the filter from the command lin
 [3] memory: [1488543159, {"Mem.total"=>1016044, "Mem.used"=>841420, "Mem.free"=>174624, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]
 ```
 
-### Using command Line
-
-> Note: Using the command line mode requires quotes parse the wildcard properly. The use of a configuration file is recommended.
-
-```text
-bin/fluent-bit -i mem \
-  -p 'tag=mem.local' \
-  -F modify \
-  -p 'Add=Service1 SOMEVALUE' \
-  -p 'Add=Service2 SOMEVALUE3' \
-  -p 'Add=Mem.total2 TOTALMEM2' \
-  -p 'Rename=Mem.free MEMFREE' \
-  -p 'Rename=Mem.used MEMUSED' \
-  -p 'Rename=Swap.total SWAPTOTAL' \
-  -p 'Add=Mem.total TOTALMEM' \
-  -m '*' \
-  -o stdout
+### Using command line
+
+Using the command line mode requires quotes parse the wildcard properly. The use of a configuration file is recommended.
+
+```shell
+fluent-bit -i mem \
+           -p 'tag=mem.local' \
+           -F modify \
+           -p 'Add=Service1 SOMEVALUE' \
+           -p 'Add=Service2 SOMEVALUE3' \
+           -p 'Add=Mem.total2 TOTALMEM2' \
+           -p 'Rename=Mem.free MEMFREE' \
+           -p 'Rename=Mem.used MEMUSED' \
+           -p 'Rename=Swap.total SWAPTOTAL' \
+           -p 'Add=Mem.total TOTALMEM' \
+           -m '*' \
+           -o stdout
 ```
 
-### Configuration File
+### Configuration file
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: mem
+      tag: mem.local
+
+  filters:
+    - name: modify
+      match: '*'
+      Add:
+        - Service1 SOMEVALUE
+        - Service3 SOMEVALUE3
+        - Mem.total2 TOTALMEM2
+        - Mem.total TOTALMEM
+      Rename:
+        - Mem.free MEMFREE
+        - Mem.used MEMUSED
+        - Swap.total SWAPTOTAL
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
-[INPUT]
-    Name mem
-    Tag  mem.local
 
-[OUTPUT]
-    Name  stdout
-    Match *
+```text
+[INPUT]
+  Name mem
+  Tag  mem.local
 
 [FILTER]
-    Name modify
-    Match *
-    Add Service1 SOMEVALUE
-    Add Service3 SOMEVALUE3
-    Add Mem.total2 TOTALMEM2
-    Rename Mem.free MEMFREE
-    Rename Mem.used MEMUSED
-    Rename Swap.total SWAPTOTAL
-    Add Mem.total TOTALMEM
-```
-{% endtab %}
+  Name modify
+  Match *
+  Add Service1 SOMEVALUE
+  Add Service3 SOMEVALUE3
+  Add Mem.total2 TOTALMEM2
+  Rename Mem.free MEMFREE
+  Rename Mem.used MEMUSED
+  Rename Swap.total SWAPTOTAL
+  Add Mem.total TOTALMEM
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: mem
-          tag: mem.local
-    filters:
-        - name: modify
-          match: '*'
-          Add:
-            - Service1 SOMEVALUE
-            - Service3 SOMEVALUE3
-            - Mem.total2 TOTALMEM2
-            - Mem.total TOTALMEM
-          Rename:
-            - Mem.free MEMFREE
-            - Mem.used MEMUSED
-            - Swap.total SWAPTOTAL
-    outputs:
-        - name: stdout
-          match: '*'
+[OUTPUT]
+  Name  stdout
+  Match *
 ```
+
 {% endtab %}
 {% endtabs %}
 
 ### Result
 
-The output of both the command line and configuration invocations should be identical and result in the following output.
+The output of both the command line and configuration invocations should be identical and result in the following output:
 
 ```text
 [2018/04/06 01:35:13] [ info] [engine] started
@@ -168,84 +177,85 @@ The output of both the command line and configuration invocations should be iden
 [3] mem.local: [1522980613.000122671, {"Mem.total"=>4050908, "MEMUSED"=>738068, "MEMFREE"=>3312840, "SWAPTOTAL"=>1046524, "Swap.used"=>0, "Swap.free"=>1046524, "Service1"=>"SOMEVALUE", "Service3"=>"SOMEVALUE3", "Mem.total2"=>"TOTALMEM2"}]
 ```
 
-## Example \#2 - Conditionally Add and Remove
+## Example 2 - conditionally add and remove
 
-### Configuration File
+### Use a configuration file
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```python
-[INPUT]
-    Name mem
-    Tag  mem.local
-    Interval_Sec 1
+{% tab title="fluent-bit.yaml" %}
 
-[FILTER]
-    Name    modify
-    Match   mem.*
+```yaml
+pipeline:
+  inputs:
+    - name: mem
+      tag: mem.local
+      interval_sec: 1
+
+  filters:
+    - name: modify
+      match: mem.*
+      Condition:
+        - Key_Does_Not_Exist cpustats
+        - Key_Exists Mem.used
+      Set: cpustats UNKNOWN
+
+    - name: modify
+      match: mem.*
+      Condition: Key_Value_Does_Not_Equal cpustats KNOWN
+      Add: sourcetype memstats
+
+    - name: modify
+      match: mem.*
+      Condition: Key_Value_Equals cpustats UNKNOWN
+      Remove_wildcard:
+        - Mem
+        - Swap
+      Add: cpustats_more STILL_UNKNOWN
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
 
-    Condition Key_Does_Not_Exist cpustats
-    Condition Key_Exists Mem.used
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-    Set cpustats UNKNOWN
+```text
+[INPUT]
+  Name mem
+  Tag  mem.local
+  Interval_Sec 1
 
 [FILTER]
-    Name    modify
-    Match   mem.*
-
-    Condition Key_Value_Does_Not_Equal cpustats KNOWN
-
-    Add sourcetype memstats
+  Name    modify
+  Match   mem.*
+  Condition Key_Does_Not_Exist cpustats
+  Condition Key_Exists Mem.used
+  Set cpustats UNKNOWN
 
 [FILTER]
-    Name    modify
-    Match   mem.*
-
-    Condition Key_Value_Equals cpustats UNKNOWN
+  Name    modify
+  Match   mem.*
+  Condition Key_Value_Does_Not_Equal cpustats KNOWN
+  Add sourcetype memstats
 
-    Remove_wildcard Mem
-    Remove_wildcard Swap
-    Add cpustats_more STILL_UNKNOWN
+[FILTER]
+  Name    modify
+  Match   mem.*
+  Condition Key_Value_Equals cpustats UNKNOWN
+  Remove_wildcard Mem
+  Remove_wildcard Swap
+  Add cpustats_more STILL_UNKNOWN
 
 [OUTPUT]
-    Name           stdout
-    Match          *
+  Name           stdout
+  Match          *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: mem
-          tag: mem.local
-          interval_sec: 1
-    filters:
-        - name: modify
-          match: mem.*
-          Condition:
-            - Key_Does_Not_Exist cpustats
-            - Key_Exists Mem.used
-          Set: cpustats UNKNOWN
-        - name: modify
-          match: mem.*
-          Condition: Key_Value_Does_Not_Equal cpustats KNOWN
-          Add: sourcetype memstats
-        - name: modify
-          match: mem.*
-          Condition: Key_Value_Equals cpustats UNKNOWN
-          Remove_wildcard:
-            - Mem
-            - Swap
-          Add: cpustats_more STILL_UNKNOWN
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
-### Result
+### Add and remove result
 
 ```text
 [2018/06/14 07:37:34] [ info] [engine] started (pid=1493)
@@ -255,66 +265,68 @@ pipeline:
 [3] mem.local: [1528925858.000152319, {"cpustats"=>"UNKNOWN", "sourcetype"=>"memstats", "cpustats_more"=>"STILL_UNKNOWN"}]
 ```
 
-## Example \#3 - Emoji
+## Example 3 - emoji
 
-### Configuration File
+### Emoji configuration file
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: mem
+      tag: mem.local
+      interval_sec: 1
+
+  filters:
+    - name: modify
+      match: mem.*
+      Remove_wildcard:
+        - Mem
+        - Swap
+      set:
+        - This_plugin_is_on 🔥
+        - 🔥 is_hot
+        - ❄️ is_cold
+        - 💦 is_wet
+      copy: 🔥 💦
+      rename:  💦 ❄️
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
-[INPUT]
-    Name mem
-    Tag  mem.local
 
-[OUTPUT]
-    Name  stdout
-    Match *
+```text
+[INPUT]
+  Name mem
+  Tag  mem.local
 
 [FILTER]
-    Name modify
-    Match *
-
-    Remove_Wildcard Mem
-    Remove_Wildcard Swap
-    Set This_plugin_is_on 🔥
-    Set 🔥 is_hot
-    Copy 🔥 💦
-    Rename  💦 ❄️
-    Set ❄️ is_cold
-    Set 💦 is_wet
-```
-{% endtab %}
+  Name modify
+  Match *
+  Remove_Wildcard Mem
+  Remove_Wildcard Swap
+  Set This_plugin_is_on 🔥
+  Set 🔥 is_hot
+  Copy 🔥 💦
+  Rename  💦 ❄️
+  Set ❄️ is_cold
+  Set 💦 is_wet
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: mem
-          tag: mem.local
-          interval_sec: 1
-    filters:
-        - name: modify
-          match: mem.*
-          Remove_wildcard:
-            - Mem
-            - Swap
-          Set:
-            - This_plugin_is_on 🔥
-            - 🔥 is_hot
-          Copy: 🔥 💦
-          Rename:  💦 ❄️
-          Set:
-            - ❄️ is_cold
-            - 💦 is_wet
-    outputs:
-        - name: stdout
-          match: '*'
+[OUTPUT]
+  Name  stdout
+  Match *
 ```
+
 {% endtab %}
 {% endtabs %}
 
-
-### Result
+### Emoji example result
 
 ```text
 [2018/06/14 07:46:11] [ info] [engine] started (pid=21875)
@@ -324,4 +336,3 @@ pipeline:
 [3] mem.local: [1528926375.000090841, {"This_plugin_is_on"=>"🔥", "🔥"=>"is_hot", "❄️"=>"is_cold", "💦"=>"is_wet"}]
 [0] mem.local: [1528926376.000610974, {"This_plugin_is_on"=>"🔥", "🔥"=>"is_hot", "❄️"=>"is_cold", "💦"=>"is_wet"}]
 ```
-
diff --git a/pipeline/filters/multiline-stacktrace.md b/pipeline/filters/multiline-stacktrace.md
index 1db4a242d..4a904595b 100644
--- a/pipeline/filters/multiline-stacktrace.md
+++ b/pipeline/filters/multiline-stacktrace.md
@@ -1,29 +1,28 @@
 ---
-description: >-
-  Concatenate Multiline or Stack trace log messages. Available on Fluent Bit >=
-  v1.8.2.
+description: Concatenate multiline or stack trace log messages.
 ---
 
 # Multiline
 
-The Multiline Filter helps to concatenate messages that originally belong to one context but were split across multiple records or log lines. Common examples are stack traces or applications that print logs in multiple lines. 
+The Multiline filter helps concatenate messages that originally belonged to one context but were split across multiple records or log lines. Common examples are stack traces or applications that print logs in multiple lines.
 
-As part of the built-in functionality, without major configuration effort, you can enable one of ours built-in parsers with auto detection and multi format support:
+Along with multiline filters, you can enable one of the following built-in Fluent Bit parsers with auto-detection and multi-format support:
 
-* go
-* python
-* ruby
-* java (Google Cloud Platform Java stacktrace format)
+- Go
+- Python
+- Ruby
+- Java (Google Cloud Platform Java stack trace format)
 
-Some comments about this filter:
+When using this filter:
 
-* The usage of this filter depends on a previous configuration of a [Multiline Parser](../../administration/configuring-fluent-bit/multiline-parsing.md) definition. 
-* If you wish to concatenate messages read from a log file, it is highly recommended to use the multiline support in the [Tail plugin](https://docs.fluentbit.io/manual/pipeline/inputs/tail#multiline-support) itself. This is because performing concatenation while reading the log file is more performant. Concatenating messages originally split by Docker or CRI container engines, is supported in the [Tail plugin](https://docs.fluentbit.io/manual/pipeline/inputs/tail#multiline-support).
+- The usage of this filter depends on a previous configuration of a [multiline parser](../../administration/configuring-fluent-bit/multiline-parsing.md) definition.
+- To concatenate messages read from a log file, it's highly recommended to use the multiline support in the [Tail plugin](https://docs.fluentbit.io/manual/pipeline/inputs/tail#multiline-support) itself. This is because performing concatenation while reading the log file is more performant. Concatenating messages originally split by Docker or CRI container engines, is supported in the [Tail plugin](https://docs.fluentbit.io/manual/pipeline/inputs/tail#multiline-support).
 
 {% hint style="warning" %}
-This filter only performs buffering that persists across different Chunks when `Buffer` is enabled. Otherwise, the filter will *process one Chunk at a time* and is not suitable for most inputs which might send multiline messages in separate chunks. 
 
-When buffering is enabled, the filter does not immediately emit messages it receives. It uses the in_emitter plugin, same as the [Rewrite Tag Filter](pipeline/filters/rewrite-tag.md), and emits messages once they are fully concatenated, or a timeout is reached. 
+This filter only performs buffering that persists across different Chunks when `Buffer` is enabled. Otherwise, the filter processes one chunk at a time and isn't suitable for most inputs which might send multiline messages in separate chunks.
+
+When buffering is enabled, the filter doesn't immediately emit messages it receives. It uses the `in_emitter` plugin, similar to the [Rewrite Tag filter](rewrite-tag.md), and emits messages once they're fully concatenated, or a timeout is reached.
 
 {% endhint %}
 
@@ -31,74 +30,99 @@ When buffering is enabled, the filter does not immediately emit messages it rece
 
 Since concatenated records are re-emitted to the head of the Fluent Bit log pipeline, you can not configure multiple multiline filter definitions that match the same tags. This will cause an infinite loop in the Fluent Bit pipeline; to use multiple parsers on the same logs, configure a single filter definitions with a comma separated list of parsers for `multiline.parser`. For more, see issue [#5235](https://github.com/fluent/fluent-bit/issues/5235).
 
-Secondly, for the same reason, the multiline filter should be the **first** filter. Logs will be re-emitted by the multiline filter to the head of the pipeline- the filter will ignore its own re-emitted records, but other filters won't. If there are filters before the multiline filter, they will be applied twice. 
+Secondly, for the same reason, the multiline filter should be the first filter. Logs will be re-emitted by the multiline filter to the head of the pipeline - the filter will ignore its own re-emitted records, but other filters won't. If there are filters before the multiline filter, they will be applied twice.
 
 {% endhint %}
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Property              | Description                                                                                                                                                                                                                                                |
-| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| multiline.parser      | Specify one or multiple [Multiline Parser definitions](../../administration/configuring-fluent-bit/multiline-parsing.md) to apply to the content. You can specify multiple multiline parsers to detect different formats by separating them with a comma.  |
-| multiline.key_content | Key name that holds the content to process. Note that a Multiline Parser definition can already specify the `key_content` to use, but this option allows to overwrite that value for the purpose of the filter.                                            |
-| mode | Mode can be `parser` for regex concat, or `partial_message` to concat split docker logs. |
-| buffer | Enable buffered mode. In buffered mode, the filter can concatenate multilines from inputs that ingest records one by one (ex: Forward), rather than in chunks, re-emitting them into the beggining of the pipeline (with the same tag) using the in_emitter instance. With buffer off, this filter will not work with most inputs, except tail. |
-| flush_ms | Flush time for pending multiline records. Defaults to 2000. |
-| emitter_name | Name for the emitter input instance which re-emits the completed records at the beginning of the pipeline. |
-| emitter_storage.type | The storage type for the emitter input instance. This option supports the values `memory` \(default\) and `filesystem`. |
-| emitter\_mem\_buf\_limit | Set a limit on the amount of memory the emitter can consume if the outputs provide backpressure.  The default for this limit is `10M`.  The pipeline will pause once the buffer exceeds the value of this setting.  For example, if the value is set to `10M` then the pipeline will pause if the buffer exceeds `10M`.  The pipeline will remain paused until the output drains the buffer below the `10M` limit. |
-
+| Property | Description |
+| -------- | ----------- |
+| `multiline.parser` | Specify one or multiple [Multiline Parser definitions](../../administration/configuring-fluent-bit/multiline-parsing.md) to apply to the content. You can specify multiple multiline parsers to detect different formats by separating them with a comma. |
+| `multiline.key_content` | Key name that holds the content to process. A multiline parser definition can specify the `key_content` This option allows for overwriting that value for the purpose of the filter. |
+| `mode` | Mode can be `parser` for regular expression concatenation, or `partial_message` to concatenate split Docker logs. |
+| `buffer` | Enable buffered mode. In buffered mode, the filter can concatenate multiple lines from inputs that ingest records one by one (like Forward), rather than in chunks, re-emitting them into the beginning of the pipeline (with the same tag) using the `in_emitter` instance. With buffer off, this filter won't work with most inputs, except Tail. |
+| `flush_ms` | Flush time for pending multiline records. Default: `2000`. |
+| `emitter_name` | Name for the emitter input instance which re-emits the completed records at the beginning of the pipeline. |
+| `emitter_storage.type` | The storage type for the emitter input instance. This option supports the values `memory` (default) and `filesystem`. |
+| `emitter_mem_buf_limit` | Set a limit on the amount of memory the emitter can consume if the outputs provide backpressure. The default for this limit is `10M`. The pipeline will pause once the buffer exceeds the value of this setting.  or example, if the value is set to `10M` then the pipeline pauses if the buffer exceeds `10M`. The pipeline will remain paused until the output drains the buffer under the `10M` limit. |
 
-## Configuration Example
+## Configuration example
 
-The following example aims to parse a log file called `test.log` that contains some full lines, a custom Java stacktrace and a Go stacktrace. 
+The following example aims to parse a log file called `test.log` that contains some full lines, a custom Java stack trace and a Go Stack Trace.
 
-{% hint style="info" %}
-The following example files can be located at:\
-\
-[https://github.com/fluent/fluent-bit/tree/master/documentation/examples/multiline/filter_multiline](https://github.com/fluent/fluent-bit/tree/master/documentation/examples/multiline/filter_multiline)
-{% endhint %}
+The following example files can be located [in the Fluent Bit repository](https://github.com/fluent/fluent-bit/tree/master/documentation/examples/multiline/filter_multiline).
 
 Example files content:
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-This is the primary Fluent Bit configuration file. It includes the `parsers_multiline.conf` and tails the file `test.log` by applying the multiline parsers `multiline-regex-test` and `go`. Then it sends the processing to the standard output. 
+{% tab title="fluent-bit.yaml" %}
+
+This is the primary Fluent Bit YAML configuration file. It includes the `parsers_multiline.yaml` and tails the file `test.log` by applying the multiline parsers `multiline-regex-test` and `go`. Then it sends the processing to the standard output.
+
 
+```yaml
+service:
+  flush: 1
+  log_level: info
+  parsers_file: parsers_multiline.yaml
+    
+pipeline:
+  inputs:
+    - name: tail
+      path: test.log
+      read_from_head: true
+
+  filters:
+    - name: multiline
+      match: '*'
+      multiline.key_content: log
+      multiline.parser: go,multiline-regex-test
+
+  outputs:
+    - name: stdout
+      match: '*'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+This is the primary Fluent Bit classic configuration file. It includes the `parsers_multiline.conf` and tails the file `test.log` by applying the multiline parsers `multiline-regex-test` and `go`. Then it sends the processing to the standard output.
+
+```text
 [SERVICE]
-    flush                 1
-    log_level             info
-    parsers_file          parsers_multiline.conf
+  flush                 1
+  log_level             info
+  parsers_file          parsers_multiline.conf
 
 [INPUT]
-    name                  tail
-    path                  test.log
-    read_from_head        true
+  name                  tail
+  path                  test.log
+  read_from_head        true
 
 [FILTER]
-    name                  multiline
-    match                 *
-    multiline.key_content log
-    multiline.parser      go, multiline-regex-test
+  name                  multiline
+  match                 *
+  multiline.key_content log
+  multiline.parser      go, multiline-regex-test
 
 [OUTPUT]
-    name                  stdout
-    match                 *
-    
+  name                  stdout
+  match                 *
 ```
+
 {% endtab %}
+{% tab title="parsers_multiline.yaml" %}
 
-{% tab title="parsers_multiline.conf" %}
-This second file defines a multiline parser for the example. Note that a second multiline parser called `go` is used in **fluent-bit.conf**, but this one is a built-in parser.
+This file defines a multiline parser for the example. A second multiline parser called `go` is used in `fluent-bit.yaml`, but this one is a built-in parser.
 
-```
-[MULTILINE_PARSER]
-    name          multiline-regex-test
-    type          regex
-    flush_timeout 1000
+```yaml
+multiline_parsers:
+  - name: multiline-regex-test
+    type: regex
+    flush_timeout: 1000
     #
     # Regex rules for multiline parsing
     # ---------------------------------
@@ -110,16 +134,46 @@ This second file defines a multiline parser for the example. Note that a second
     #
     # rules |   state name  | regex pattern                  | next state
     # ------|---------------|--------------------------------------------
-    rule      "start_state"   "/([A-Za-z]+ \d+ \d+\:\d+\:\d+)(.*)/"  "cont"
-    rule      "cont"          "/^\s+at.*/"                     "cont"
-    
+    rules:
+      - state: start_state
+        regex: '/([a-zA-Z]+ \d+ \d+\:\d+\:\d+)(.*)/'
+        next_state:  cont
+      - state: cont
+        regex: '/^\s+at.*/'
+        next_state: cont
 ```
+
 {% endtab %}
+{% tab title="parsers_multiline.conf" %}
 
-{% tab title="test.log" %}
-An example file with multiline and multiformat content:
+This file defines a multiline parser for the example. A second multiline parser called `go` is used in `fluent-bit.conf`, but this one is a built-in parser.
 
+```text
+[MULTILINE_PARSER]
+  name          multiline-regex-test
+  type          regex
+  flush_timeout 1000
+  #
+  # Regex rules for multiline parsing
+  # ---------------------------------
+  #
+  # configuration hints:  
+  #
+  #  - first state always has the name: start_state
+  #  - every field in the rule must be inside double quotes 
+  #
+  # rules |   state name  | regex pattern                  | next state
+  # ------|---------------|--------------------------------------------
+  rule      "start_state"   "/([A-Za-z]+ \d+ \d+\:\d+\:\d+)(.*)/"  "cont"
+  rule      "cont"          "/^\s+at.*/"                     "cont"
 ```
+
+{% endtab %}
+{% tab title="test.log" %}
+
+An example file with multiline and multi-format content:
+
+```text
 single line...
 Dec 14 06:41:08 Exception in thread "main" java.lang.RuntimeException: Something has gone wrong, aborting!
     at com.myproject.module.MyProject.badMethod(MyProject.java:22)
@@ -180,16 +234,20 @@ runtime.goexit()
 created by runtime.gcenable
   /usr/local/go/src/runtime/mgc.go:216 +0x58
 one more line, no multiline
-
 ```
+
 {% endtab %}
 {% endtabs %}
 
-By running Fluent Bit with the given configuration file you will obtain:
+Running Fluent Bit with the given configuration file:
 
+```shell
+fluent-bit -c fluent-bit.conf
 ```
-$ fluent-bit -c fluent-bit.conf 
 
+Should return something like the following:
+
+```text
 [0] tail.0: [1626736433.143567481, {"log"=>"single line..."}]
 [1] tail.0: [1626736433.143570538, {"log"=>"Dec 14 06:41:08 Exception in thread "main" java.lang.RuntimeException: Something has gone wrong, aborting!
     at com.myproject.module.MyProject.badMethod(MyProject.java:22)
@@ -250,28 +308,46 @@ runtime.goexit()
 created by runtime.gcenable
   /usr/local/go/src/runtime/mgc.go:216 +0x58"}]
 [4] tail.0: [1626736433.143585473, {"log"=>"one more line, no multiline"}]
-
 ```
 
-The lines that did not match a pattern are not considered as part of the multiline message, while the ones that matched the rules were concatenated properly.
+Lines that don't match a pattern aren't considered as part of the multiline message, while the ones that matched the rules were concatenated properly.
 
+## Docker partial message use case
 
-## Docker Partial Message Use Case
+When Fluent Bit is consuming logs from a container runtime, such as Docker, these logs will be split when larger than a certain limit, usually 16&nbspKB. If your application emits a 100K log line, it will be split into seven partial messages. If you are using the [Fluentd Docker Log Driver](https://docs.docker.com/config/containers/logging/fluentd/) to send the logs to Fluent Bit, they might look like this:
 
-When Fluent Bit is consuming logs from a container runtime, such as docker, these logs will be split above a certain limit, usually 16KB. If your application emits a 100K log line, it will be split into 7 partial messages. If you are using the [Fluentd Docker Log Driver](https://docs.docker.com/config/containers/logging/fluentd/) to send the logs to Fluent Bit, they might look like this:
-
-```
+```text
 {"source": "stdout", "log": "... omitted for brevity...", "partial_message": "true", "partial_id": "dc37eb08b4242c41757d4cd995d983d1cdda4589193755a22fcf47a638317da0", "partial_ordinal": "1", "partial_last": "false", "container_id": "a96998303938eab6087a7f8487ca40350f2c252559bc6047569a0b11b936f0f2", "container_name": "/hopeful_taussig"}]
 ```
 
-Fluent Bit can re-combine these logs that were split by the runtime and remove the partial message fields. The filter example below is for this use case. 
+Fluent Bit can re-combine these logs that were split by the runtime and remove the partial message fields. The following filter example is for this use case.
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  filters:
+    - name: multiline
+      match: '*'
+      multiline.key_content: log
+      mode: partial_message
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [FILTER]
-     name                  multiline
-     match                 *
-     multiline.key_content log
-     mode                  partial_message
+  name                  multiline
+  match                 *
+  multiline.key_content log
+  mode                  partial_message
 ```
 
-The two options for `mode` are mutually exclusive in the filter. If you set the `mode` to `partial_message` then the `multiline.parser` option is not allowed. 
+{% endtab %}
+{% endtabs %}
+
+The two options for `mode` are mutually exclusive in the filter. If you set the
+`mode` to `partial_message` then the `multiline.parser` option isn't allowed.
diff --git a/pipeline/filters/nest.md b/pipeline/filters/nest.md
index 96990ca81..b1dd407d5 100644
--- a/pipeline/filters/nest.md
+++ b/pipeline/filters/nest.md
@@ -1,15 +1,15 @@
 # Nest
 
-The _Nest Filter_ plugin allows you to operate on or with nested data. Its modes of operation are
+The _Nest_ filter plugin lets you operate on or with nested data. Its modes of operation are:
 
-* `nest` - Take a set of records and place them in a map
-* `lift` - Take a map by key and lift its records up
+- `nest`: Take a set of records and place them in a map.
+- `lift` Take a map by key and lift its records up.
 
-## Example usage \(nest\)
+## Example usage for `nest`
 
-As an example using JSON notation, to nest keys matching the `Wildcard` value `Key*` under a new key `NestKey` the transformation becomes,
+As an example using JSON notation, to nest keys matching the `Wildcard` value `Key*` under a new key `NestKey` the transformation becomes:
 
-_Example \(input\)_
+Input:
 
 ```text
 {
@@ -19,7 +19,7 @@ _Example \(input\)_
 }
 ```
 
-_Example \(output\)_
+Output:
 
 ```text
 {
@@ -31,11 +31,11 @@ _Example \(output\)_
 }
 ```
 
-## Example usage \(lift\)
+## Example usage for `lift`
 
-As an example using JSON notation, to lift keys nested under the `Nested_under` value `NestKey*` the transformation becomes,
+As an example using JSON notation, to lift keys nested under the `Nested_under` value `NestKey*` the transformation becomes:
 
-_Example \(input\)_
+Input:
 
 ```text
 {
@@ -47,7 +47,7 @@ _Example \(input\)_
 }
 ```
 
-_Example \(output\)_
+Output:
 
 ```text
 {
@@ -57,83 +57,88 @@ _Example \(output\)_
 }
 ```
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Value Format | Operation | Description |
+| Key | Value format | Operation | Description |
 | :--- | :--- | :--- | :--- |
-| Operation | ENUM \[`nest` or `lift`\] |  | Select the operation `nest` or `lift` |
-| Wildcard | FIELD WILDCARD | `nest` | Nest records which field matches the wildcard |
-| Nest\_under | FIELD STRING | `nest` | Nest records matching the `Wildcard` under this key |
-| Nested\_under | FIELD STRING | `lift` | Lift records nested under the `Nested_under` key |
-| Add\_prefix | FIELD STRING | ANY | Prefix affected keys with this string |
-| Remove\_prefix | FIELD STRING | ANY | Remove prefix from affected keys if it matches this string |
+| `Operation` | Enum [`nest` or `lift`] |  | Select the operation `nest` or `lift` |
+| `Wildcard` | Field wildcard | `nest` | Nest records which field matches the wildcard |
+| `Nest_under` | Field string | `nest` | Nest records matching the `Wildcard` under this key |
+| `Nested_under` | Field string | `lift` | Lift records nested under the `Nested_under` key |
+| `Add_prefix` | Field string | Any | Prefix affected keys with this string |
+| `Remove_prefix` | Field string | Any | Remove prefix from affected keys if it matches this string |
 
-## Getting Started
+## Get started
 
-In order to start filtering records, you can run the filter from the command line or through the configuration file. The following invokes the [Memory Usage Input Plugin](../inputs/memory-metrics.md), which outputs the following \(example\),
+To start filtering records, run the filter from the command line or through the configuration file. The following example invokes the [Memory Usage input plugin](../inputs/memory-metrics.md), which outputs the following:
 
 ```text
 [0] memory: [1488543156, {"Mem.total"=>1016044, "Mem.used"=>841388, "Mem.free"=>174656, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]
 ```
 
-## Example \#1 - nest
+## Example 1 - nest
 
-### Command Line
+### Use `nest` from the command line
 
-> Note: Using the command line mode requires quotes parse the wildcard properly. The use of a configuration file is recommended.
+Using the command line mode requires quotes to parse the wildcard properly. The use of a configuration file is recommended.
 
-The following command will load the _mem_ plugin. Then the _nest_ filter will match the wildcard rule to the keys and nest the keys matching `Mem.*` under the new key `NEST`.
+The following command loads the _mem_ plugin. Then the _nest_ filter matches the wildcard rule to the keys and nests the keys matching `Mem.*` under the new key `NEST`.
 
-```text
-$ bin/fluent-bit -i mem -p 'tag=mem.local' -F nest -p 'Operation=nest' -p 'Wildcard=Mem.*' -p 'Nest_under=Memstats' -p 'Remove_prefix=Mem.' -m '*' -o stdout
+```shell
+fluent-bit -i mem -p 'tag=mem.local' -F nest -p 'Operation=nest' -p 'Wildcard=Mem.*' -p 'Nest_under=Memstats' -p 'Remove_prefix=Mem.' -m '*' -o stdout
 ```
 
-### Configuration File
+### Nest configuration file
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: mem
+      tag: mem.local
+
+  filters:
+    - name: nest
+      match: '*'
+      operation: nest
+      wildcard: Mem.*
+      nest_under: Memstats
+      remove_prefix: Mem.
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
-[INPUT]
-    Name mem
-    Tag  mem.local
 
-[OUTPUT]
-    Name  stdout
-    Match *
+```text
+[INPUT]
+  Name mem
+  Tag  mem.local
 
 [FILTER]
-    Name nest
-    Match *
-    Operation nest
-    Wildcard Mem.*
-    Nest_under Memstats
-    Remove_prefix Mem.
+  Name nest
+  Match *
+  Operation nest
+  Wildcard Mem.*
+  Nest_under Memstats
+  Remove_prefix Mem.
+
+ [OUTPUT]
+  Name  stdout
+  Match *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: mem
-          tag: mem.local
-    filters:
-        - name: nest
-          match: '*'
-          operation: nest
-          wildcard: Mem.*
-          nest_under: Memstats
-          remove_prefix: Mem.
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
-### Result
+### Nest result
 
 The output of both the command line and configuration invocations should be identical and result in the following output.
 
@@ -142,145 +147,158 @@ The output of both the command line and configuration invocations should be iden
 [0] mem.local: [1522978514.007359767, {"Swap.total"=>1046524, "Swap.used"=>0, "Swap.free"=>1046524, "Memstats"=>{"total"=>4050908, "used"=>714984, "free"=>3335924}}]
 ```
 
-## Example \#2 - nest and lift undo
+## Example 2 - `nest` and `lift` undo
 
-This example nests all `Mem.*` and `Swap,*` items under the `Stats` key and then reverses these actions with a `lift` operation. The output appears unchanged.
+This example nests all `Mem.*` and `Swap.*` items under the `Stats` key and then reverses these actions with a `lift` operation. The output appears unchanged.
 
-### Configuration File
+### `nest` and `lift` undo configuration file
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: mem
+      tag: mem.local
+
+  filters:
+    - name: nest
+      match: '*'
+      Operation: nest
+      Wildcard:
+        - Mem.*
+        - Swap.*
+      Nest_under: Stats
+      Add_prefix: NESTED
+
+    - name: nest
+      match: '*'
+      Operation: lift
+      Nested_under: Stats
+      Remove_prefix: NESTED
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
-[INPUT]
-    Name mem
-    Tag  mem.local
 
-[OUTPUT]
-    Name  stdout
-    Match *
+```text
+[INPUT]
+  Name mem
+  Tag  mem.local
 
 [FILTER]
-    Name nest
-    Match *
-    Operation nest
-    Wildcard Mem.*
-    Wildcard Swap.*
-    Nest_under Stats
-    Add_prefix NESTED
+  Name nest
+  Match *
+  Operation nest
+  Wildcard Mem.*
+  Wildcard Swap.*
+  Nest_under Stats
+  Add_prefix NESTED
 
 [FILTER]
-    Name nest
-    Match *
-    Operation lift
-    Nested_under Stats
-    Remove_prefix NESTED
-```
-{% endtab %}
+  Name nest
+  Match *
+  Operation lift
+  Nested_under Stats
+  Remove_prefix NESTED
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: mem
-          tag: mem.local
-    filters:
-        - name: nest
-          match: '*'
-          Operation: nest
-          Wildcard:
-            - Mem.*
-            - Swap.*
-          Nest_under: Stats
-          Add_prefix: NESTED
-        - name: nest
-          match: '*'
-          Operation: lift
-          Nested_under: Stats
-          Remove_prefix: NESTED
-    outputs:
-        - name: stdout
-          match: '*'
+[OUTPUT]
+  Name  stdout
+  Match *
 ```
+
 {% endtab %}
 {% endtabs %}
 
-### Result
+### `nest` and `lift` undo result
 
 ```text
 [2018/06/21 17:42:37] [ info] [engine] started (pid=17285)
 [0] mem.local: [1529566958.000940636, {"Mem.total"=>8053656, "Mem.used"=>6940380, "Mem.free"=>1113276, "Swap.total"=>16532988, "Swap.used"=>1286772, "Swap.free"=>15246216}]
 ```
 
-## Example \#3 - nest 3 levels deep
+## Example 3 - `nest` 3 levels deep
 
-This example takes the keys starting with `Mem.*` and nests them under `LAYER1`, which itself is then nested under `LAYER2`, which is nested under `LAYER3`.
+This example takes the keys starting with `Mem.*` and nests them under `LAYER1`, which is then nested under `LAYER2`, which is nested under `LAYER3`.
 
-### Configuration File
+### Deep `nest` configuration file
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: mem
+      tag: mem.local
+
+  filters:
+    - name: nest
+      match: '*'
+      Operation: nest
+      Wildcard: Mem.*
+      Nest_under: LAYER1
+
+    - name: nest
+      match: '*'
+      Operation: nest
+      Wildcard: LAYER1*
+      Nest_under: LAYER2
+
+    - name: nest
+      match: '*'
+      Operation: nest
+      Wildcard: LAYER2*
+      Nest_under: LAYER3
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
-[INPUT]
-    Name mem
-    Tag  mem.local
 
-[OUTPUT]
-    Name  stdout
-    Match *
+```text
+[INPUT]
+  Name mem
+  Tag  mem.local
 
 [FILTER]
-    Name nest
-    Match *
-    Operation nest
-    Wildcard Mem.*
-    Nest_under LAYER1
+  Name nest
+  Match *
+  Operation nest
+  Wildcard Mem.*
+  Nest_under LAYER1
 
 [FILTER]
-    Name nest
-    Match *
-    Operation nest
-    Wildcard LAYER1*
-    Nest_under LAYER2
+  Name nest
+  Match *
+  Operation nest
+  Wildcard LAYER1*
+  Nest_under LAYER2
 
 [FILTER]
-    Name nest
-    Match *
-    Operation nest
-    Wildcard LAYER2*
-    Nest_under LAYER3
-```
-{% endtab %}
+  Name nest
+  Match *
+  Operation nest
+  Wildcard LAYER2*
+  Nest_under LAYER3
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: mem
-          tag: mem.local
-    filters:
-        - name: nest
-          match: '*'
-          Operation: nest
-          Wildcard: Mem.*
-          Nest_under: LAYER1
-        - name: nest
-          match: '*'
-          Operation: nest
-          Wildcard: LAYER1*
-          Nest_under: LAYER2
-        - name: nest
-          match: '*'
-          Operation: nest
-          Wildcard: LAYER2*
-          Nest_under: LAYER3
-    outputs:
-        - name: stdout
-          match: '*'
+[OUTPUT]
+  Name  stdout
+  Match *
 ```
+
 {% endtab %}
 {% endtabs %}
 
-### Result
+### Deep `nest` result
 
 ```text
 [0] mem.local: [1524795923.009867831, {"Swap.total"=>1046524, "Swap.used"=>0, "Swap.free"=>1046524, "LAYER3"=>{"LAYER2"=>{"LAYER1"=>{"Mem.total"=>4050908, "Mem.used"=>1112036, "Mem.free"=>2938872}}}}]
@@ -302,125 +320,132 @@ pipeline:
 }
 ```
 
-## Example \#4 - multiple nest and lift filters with prefix
+## Example 4 - multiple `nest` and `lift` filters with prefix
 
-This example starts with the 3-level deep nesting of _Example 2_ and applies the `lift` filter three times to reverse the operations. The end result is that all records are at the top level, without nesting, again. One prefix is added for each level that is lifted.
+This example uses the 3-level deep nesting of Example 2 and applies the `lift` filter three times to reverse the operations. The end result is that all records are at the top level, without nesting, again. One prefix is added for each level that's lifted.
 
-### Configuration file
+### `nest` and `lift` prefix configuration file
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: mem
+      tag: mem.local
+
+  filters:
+    - name: nest
+      match: '*'
+      Operation: nest
+      Wildcard: Mem.*
+      Nest_under: LAYER1
+
+    - name: nest
+      match: '*'
+      Operation: nest
+      Wildcard: LAYER1*
+      Nest_under: LAYER2
+
+    - name: nest
+      match: '*'
+      Operation: nest
+      Wildcard: LAYER2*
+      Nest_under: LAYER3
+
+    - name: nest
+      match: '*'
+      Operation: lift
+      Nested_under: LAYER3
+      Add_prefix: Lifted3_
+
+    - name: nest
+      match: '*'
+      Operation: lift
+      Nested_under: Lifted3_LAYER2
+      Add_prefix: Lifted3_Lifted2_
+
+    - name: nest
+      match: '*'
+      Operation: lift
+      Nested_under: Lifted3_Lifted2_LAYER1
+      Add_prefix: Lifted3_Lifted2_Lifted1_
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
-[INPUT]
-    Name mem
-    Tag  mem.local
 
-[OUTPUT]
-    Name  stdout
-    Match *
+```text
+[INPUT]
+  Name mem
+  Tag  mem.local
 
 [FILTER]
-    Name nest
-    Match *
-    Operation nest
-    Wildcard Mem.*
-    Nest_under LAYER1
+  Name nest
+  Match *
+  Operation nest
+  Wildcard Mem.*
+  Nest_under LAYER1
 
 [FILTER]
-    Name nest
-    Match *
-    Operation nest
-    Wildcard LAYER1*
-    Nest_under LAYER2
+  Name nest
+  Match *
+  Operation nest
+  Wildcard LAYER1*
+  Nest_under LAYER2
 
 [FILTER]
-    Name nest
-    Match *
-    Operation nest
-    Wildcard LAYER2*
-    Nest_under LAYER3
+  Name nest
+  Match *
+  Operation nest
+  Wildcard LAYER2*
+  Nest_under LAYER3
 
 [FILTER]
-    Name nest
-    Match *
-    Operation lift
-    Nested_under LAYER3
-    Add_prefix Lifted3_
+  Name nest
+  Match *
+  Operation lift
+  Nested_under LAYER3
+  Add_prefix Lifted3_
 
 [FILTER]
-    Name nest
-    Match *
-    Operation lift
-    Nested_under Lifted3_LAYER2
-    Add_prefix Lifted3_Lifted2_
+  Name nest
+  Match *
+  Operation lift
+  Nested_under Lifted3_LAYER2
+  Add_prefix Lifted3_Lifted2_
 
 [FILTER]
-    Name nest
-    Match *
-    Operation lift
-    Nested_under Lifted3_Lifted2_LAYER1
-    Add_prefix Lifted3_Lifted2_Lifted1_
-```
-{% endtab %}
+  Name nest
+  Match *
+  Operation lift
+  Nested_under Lifted3_Lifted2_LAYER1
+  Add_prefix Lifted3_Lifted2_Lifted1_
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: mem
-          tag: mem.local
-    filters:
-        - name: nest
-          match: '*'
-          Operation: nest
-          Wildcard: Mem.*
-          Nest_under: LAYER1
-        - name: nest
-          match: '*'
-          Operation: nest
-          Wildcard: LAYER1*
-          Nest_under: LAYER2
-        - name: nest
-          match: '*'
-          Operation: nest
-          Wildcard: LAYER2*
-          Nest_under: LAYER3
-        - name: nest
-          match: '*'
-          Operation: lift
-          Nested_under: LAYER3
-          Add_prefix: Lifted3_
-        - name: nest
-          match: '*'
-          Operation: lift
-          Nested_under: Lifted3_LAYER2
-          Add_prefix: Lifted3_Lifted2_
-        - name: nest
-          match: '*'
-          Operation: lift
-          Nested_under: Lifted3_Lifted2_LAYER1
-          Add_prefix: Lifted3_Lifted2_Lifted1_
-    outputs:
-        - name: stdout
-          match: '*'
+[OUTPUT]
+  Name  stdout
+  Match *
 ```
+
 {% endtab %}
 {% endtabs %}
 
-
-### Result
+### `nest` and `lift` prefix result
 
 ```text
 [0] mem.local: [1524862951.013414798, {"Swap.total"=>1046524, "Swap.used"=>0, "Swap.free"=>1046524, "Lifted3_Lifted2_Lifted1_Mem.total"=>4050908, "Lifted3_Lifted2_Lifted1_Mem.used"=>1253912, "Lifted3_Lifted2_Lifted1_Mem.free"=>2796996}]
 
-
 {
-  "Swap.total"=>1046524, 
-  "Swap.used"=>0, 
-  "Swap.free"=>1046524, 
-  "Lifted3_Lifted2_Lifted1_Mem.total"=>4050908, 
-  "Lifted3_Lifted2_Lifted1_Mem.used"=>1253912, 
+  "Swap.total"=>1046524,
+  "Swap.used"=>0,
+  "Swap.free"=>1046524,
+  "Lifted3_Lifted2_Lifted1_Mem.total"=>4050908,
+  "Lifted3_Lifted2_Lifted1_Mem.used"=>1253912,
   "Lifted3_Lifted2_Lifted1_Mem.free"=>2796996
 }
 ```
-
diff --git a/pipeline/filters/nightfall.md b/pipeline/filters/nightfall.md
index cf928784e..73cfd9836 100644
--- a/pipeline/filters/nightfall.md
+++ b/pipeline/filters/nightfall.md
@@ -1,28 +1,92 @@
 # Nightfall
 
-The Nightfall filter scans logs for sensitive data and redacts the sensitive portions. This filter supports scanning for
-various sensitive information, ranging from API keys and personally identifiable information(PII) to custom regexes you
-define. You can configure what to scan for in the [Nightfall Dashboard](https://app.nightfall.ai).
+The _Nightfall_ filter scans logs for sensitive data and redacts any sensitive portions. This filter supports scanning for various sensitive information, ranging from API keys and Personally Identifiable Information (PII) to custom regular expressions you define. You can configure what to scan for in the [Nightfall Dashboard](https://app.nightfall.ai).
 
-> This filter is not enabled by default in 1.9.0 due to a typo. It must be enabled by setting flag ```-DFLB_FILTER_NIGHTFALL=ON``` when building. In 1.9.1 and above this is fixed.
-## Configuration Parameters
+This filter isn't enabled by default in version 1.9.0 due to a typo. To enable it, set the flag ```-DFLB_FILTER_NIGHTFALL=ON``` when building. This is fixed for versions 1.9.1 and later.
+
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
 | Key | Description | Default |
 | :--- | :--- | :--- |
-| nightfall\_api_key | The Nightfall API key to scan your logs with, obtainable from the [Nightfall Dashboard](https://app.nightfall.ai) | |
-| policy\_id | The Nightfall dev platform policy to scan your logs with, configurable in the [Nightfall Dashboard](https://app.nightfall.ai/developer-platform/policies). | |
-| sampling\_rate | The rate controlling how much of your logs you wish to be scanned, must be a float between (0,1]. 1 means all logs will be scanned. Useful for avoiding rate limits in conjunction with Fluent Bit's match rule.| 1 |
-| tls.debug | Debug level between 0 (nothing) and 4 (every detail). | 0 |
-| tls.verify | When enabled, turns on certificate validation when connecting to the Nightfall API. | true |
-| tls.ca_path | Absolute path to root certificates, required if tls.verify is true. | |
+| `nightfall_api_key` | The Nightfall API key to scan your logs with, obtainable from the [Nightfall Dashboard](https://app.nightfall.ai) | _none_ |
+| `policy_id` | The Nightfall developer platform policy to scan your logs with, configurable in the [Nightfall Dashboard](https://app.nightfall.ai/developer-platform/policies). | _none_ |
+| `sampling_rate` | The rate controlling how much of your logs you wish to be scanned. Must be a float between `(0,1]`. `1` means all logs will be scanned. Use this setting to avoid rate limits in conjunction with Fluent Bit match rules.| `1` |
+| `tls.debug` | Debug level between `0` (nothing) and `4` (every detail). | `0` |
+| `tls.verify` | When enabled, turns on certificate validation when connecting to the Nightfall API. | `true` |
+| `tls.ca_path` | Absolute path to root certificates, required if `tls.verify` is true. | _none_ |
+
+### Configuration file
+
+The following is an example of a configuration file for the Nightfall filter:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: http
+      host: 0.0.0.0
+      port: 8000
 
-### Command Line
+  filters:
+    - name: nightfall
+      match: '*'
+      nightfall_api_key: <API key>
+      policy_id: 5991946b-1cc8-4c38-9240-72677029a3f7
+      sampling_rate: 1
+      tls.ca_path: /etc/ssl/certs
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
-$ bin/fluent-bit -c /PATH_TO_CONF_FILE/fluent-bit.conf
+[INPUT]
+  name http
+  host 0.0.0.0
+  port 8000
+
+[FILTER]
+  Name nightfall
+  Match *
+  nightfall_api_key <API key>
+  policy_id 5991946b-1cc8-4c38-9240-72677029a3f7
+  sampling_rate 1
+  tls.ca_path /etc/ssl/certs
+
+[OUTPUT]
+  Name stdout
+  Match *
+```
+
+{% endtab %}
+{% endtabs %}
+
+### Command line
+
+After you configure the filter, you can use it from the command line by running a command like:
 
+```shell
+# For YAML configuration.
+fluent-bit -c /PATH_TO_CONF_FILE/fluent-bit.yaml
+
+# For classic configuration.
+fluent-bit -c /PATH_TO_CONF_FILE/fluent-bit.conf
+```
+
+Replace _`PATH_TO_CONF_FILE`_ with the path for where your filter configuration file
+is located.
+
+Which results in output like:
+
+```text
 [2022/02/09 19:46:22] [ info] [engine] started (pid=53844)
 [2022/02/09 19:46:22] [ info] [storage] version=1.1.5, initializing...
 [2022/02/09 19:46:22] [ info] [storage] in-memory
@@ -35,24 +99,3 @@ $ bin/fluent-bit -c /PATH_TO_CONF_FILE/fluent-bit.conf
 [2022/02/09 19:47:25] [ info] [filter:nightfall:nightfall.0] Nightfall request http_do=0, HTTP Status: 200
 [0] app.log: [1644464845.675431000, {"A"=>"a very safe string"}]
 ```
-
-### Configuration File
-
-```text
-[INPUT]
-    name http
-    host 0.0.0.0
-    port 8000
-
-[FILTER]
-    Name nightfall
-    Match *
-    nightfall_api_key <API key>
-    policy_id 5991946b-1cc8-4c38-9240-72677029a3f7
-    sampling_rate 1
-    tls.ca_path /etc/ssl/certs
-
-[OUTPUT]
-    Name stdout
-```
-
diff --git a/pipeline/filters/parser.md b/pipeline/filters/parser.md
index b0ff976b1..18c208ad2 100644
--- a/pipeline/filters/parser.md
+++ b/pipeline/filters/parser.md
@@ -1,70 +1,115 @@
 # Parser
 
-The _Parser Filter_ plugin allows for parsing fields in event records.
+The _Parser_ filter allows for parsing fields in event records.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
 | Key | Description | Default |
 | :--- | :--- | :--- |
-| Key\_Name | Specify field name in record to parse. |  |
-| Parser | Specify the parser name to interpret the field. Multiple _Parser_ entries are allowed \(one per line\). |  |
-| Preserve\_Key | Keep 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 |
+| `Key_Name` | Specify field name in record to parse. | _none_ |
+| `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` |
 
-## Getting Started
+## Get started
 
-### Configuration File
+### Configuration file
+
+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"}`.
 
-The plugin needs a parser file which defines how to parse each field.
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+parsers:
+  - name: dummy_test
+    format: regex
+    regex: '^(?<INT>[^ ]+) (?<FLOAT>[^ ]+) (?<BOOL>[^ ]+) (?<STRING>.+)$'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [PARSER]
-    Name dummy_test
-    Format regex
-    Regex ^(?<INT>[^ ]+) (?<FLOAT>[^ ]+) (?<BOOL>[^ ]+) (?<STRING>.+)$
+  Name dummy_test
+  Format regex
+  Regex ^(?<INT>[^ ]+) (?<FLOAT>[^ ]+) (?<BOOL>[^ ]+) (?<STRING>.+)$
+```
+
+{% endtab %}
+{% endtabs %}
+
+The path of the parser file should be written in configuration file under the `[SERVICE]` section.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  parsers_file: /path/to/parsers.yaml
+
+pipeline:
+  inputs:
+    - name: dummy
+      tag: dummy.data
+      dummy: '{"data":"100 0.5 true This is example"}'
+
+  filters:
+    - name: parser
+      match: 'dummy.*'
+      key_name: data
+      parser: dummy_test
+
+  outputs:
+    - name: stdout
+      match: '*'
 ```
 
-The path of the parser file should be written in configuration file under the **\[SERVICE\]** section.
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [SERVICE]
-    Parsers_File /path/to/parsers.conf
+  Parsers_File /path/to/parsers.conf
 
 [INPUT]
-    Name dummy
-    Tag  dummy.data
-    Dummy {"data":"100 0.5 true This is example"}
+  Name dummy
+  Tag  dummy.data
+  Dummy {"data":"100 0.5 true This is example"}
 
 [FILTER]
-    Name parser
-    Match dummy.*
-    Key_Name data
-    Parser dummy_test
+  Name parser
+  Match dummy.*
+  Key_Name data
+  Parser dummy_test
 
 [OUTPUT]
-    Name stdout
-    Match *
+  Name stdout
+  Match *
 ```
 
-The output is
+{% endtab %}
+{% endtabs %}
+
+The output when running the corresponding configuration is as follows:
 
 ```text
-$ fluent-bit -c dummy.conf
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
-
-[2017/07/06 22:33:12] [ info] [engine] started
-[0] dummy.data: [1499347993.001371317, {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example"}]
-[1] dummy.data: [1499347994.001303118, {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example"}]
-[2] dummy.data: [1499347995.001296133, {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example"}]
-[3] dummy.data: [1499347996.001320284, {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example"}]
+# For YAML configuration.
+$ fluent-bit --config fluent-bit.yaml
+
+# For classic configuration.
+$ fluent-bit --config fluent-bit.conf
+
+...
+[0] dummy.data: [[1750323528.603308000, {}], {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example"}]
+[0] dummy.data: [[1750323529.603788000, {}], {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example"}]
+[0] dummy.data: [[1750323530.604204000, {}], {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example"}]
+[0] dummy.data: [[1750323531.603961000, {}], {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example"}]e
 ```
 
 You can see the records `{"data":"100 0.5 true This is example"}` are parsed.
@@ -73,86 +118,192 @@ You can see the records `{"data":"100 0.5 true This is example"}` are parsed.
 
 By default, the parser plugin only keeps the parsed fields in its output.
 
-If you enable `Reserve_Data`, all other fields are preserved:
+If you enable `Reserve_Data`, all other fields are preserved. First the contents of the corresponding parsers file, depending on the choice for YAML or classic configurations, would be as follows:
+
+{% tabs %}
+{% tab title="parsers.yaml" %}
+
+```yaml
+parsers:
+  - name: dummy_test
+    format: regex
+    regex: '^(?<INT>[^ ]+) (?<FLOAT>[^ ]+) (?<BOOL>[^ ]+) (?<STRING>.+)$'
+```
 
-```python
+{% endtab %}
+{% tab title="parsers.conf" %}
+
+```text
 [PARSER]
-    Name dummy_test
-    Format regex
-    Regex ^(?<INT>[^ ]+) (?<FLOAT>[^ ]+) (?<BOOL>[^ ]+) (?<STRING>.+)$
+  Name dummy_test
+  Format regex
+  Regex ^(?<INT>[^ ]+) (?<FLOAT>[^ ]+) (?<BOOL>[^ ]+) (?<STRING>.+)$
+```
+
+{% endtab %}
+{% endtabs %}
+
+Now add `Reserve_Data` to the filter section of the corresponding configuration file as follows:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  parsers_file: /path/to/parsers.yaml
+
+pipeline:
+  inputs:
+    - name: dummy
+      tag: dummy.data
+      dummy: '{"data":"100 0.5 true This is example", "key1":"value1", "key2":"value2"}'
+
+  filters:
+    - name: parser
+      match: 'dummy.*'
+      key_name: data
+      parser: dummy_test
+      reserve_data: on
+
+  outputs:
+    - name: stdout
+      match: '*'
 ```
 
-```python
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [SERVICE]
-    Parsers_File /path/to/parsers.conf
+  Parsers_File /path/to/parsers.conf
 
 [INPUT]
-    Name dummy
-    Tag  dummy.data
-    Dummy {"data":"100 0.5 true This is example", "key1":"value1", "key2":"value2"}
+  Name dummy
+  Tag  dummy.data
+  Dummy {"data":"100 0.5 true This is example", "key1":"value1", "key2":"value2"}
 
 [FILTER]
-    Name parser
-    Match dummy.*
-    Key_Name data
-    Parser dummy_test
-    Reserve_Data On
+  Name parser
+  Match dummy.*
+  Key_Name data
+  Parser dummy_test
+  Reserve_Data On
+    
+[OUTPUT]
+  Name stdout
+  Match *
 ```
 
-This will produce the output:
+{% endtab %}
+{% endtabs %}
+
+The output when running the corresponding configuration is as follows:
 
 ```text
-$ fluent-bit -c dummy.conf
-Fluent-Bit v0.12.0
-Copyright (C) Treasure Data
-
-[2017/07/06 22:33:12] [ info] [engine] started
-[0] dummy.data: [1499347993.001371317, {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example"}, "key1":"value1", "key2":"value2"]
-[1] dummy.data: [1499347994.001303118, {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example"}, "key1":"value1", "key2":"value2"]
-[2] dummy.data: [1499347995.001296133, {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example"}, "key1":"value1", "key2":"value2"]
-[3] dummy.data: [1499347996.001320284, {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example"}, "key1":"value1", "key2":"value2"]
+# For YAML configuration.
+$ fluent-bit --config fluent-bit.yaml
+
+# For classic configuration.
+$ fluent-bit --config fluent-bit.conf
+
+...
+[0] dummy.data: [[1750325238.681398000, {}], {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example", "key1"=>"value1", "key2"=>"value2"}]
+[0] dummy.data: [[1750325239.682090000, {}], {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example", "key1"=>"value1", "key2"=>"value2"}]
+[0] dummy.data: [[1750325240.682903000, {}], {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example", "key1"=>"value1", "key2"=>"value2"}]
 ```
 
-If you enable `Reserved_Data` and `Preserve_Key`, the original key field will be preserved as well:
+If you enable `Reserve_Data` and `Preserve_Key`, the original key field will also be preserved. First the contents of the corresponding parsers file, depending on the choice for YAML or classic configurations, would be as follows:
 
-```python
+{% tabs %}
+{% tab title="parsers.yaml" %}
+
+```yaml
+parsers:
+  - name: dummy_test
+    format: regex
+    regex: '^(?<INT>[^ ]+) (?<FLOAT>[^ ]+) (?<BOOL>[^ ]+) (?<STRING>.+)$'
+```
+
+{% endtab %}
+{% tab title="parsers.conf" %}
+
+```text
 [PARSER]
-    Name dummy_test
-    Format regex
-    Regex ^(?<INT>[^ ]+) (?<FLOAT>[^ ]+) (?<BOOL>[^ ]+) (?<STRING>.+)$
+  Name dummy_test
+  Format regex
+  Regex ^(?<INT>[^ ]+) (?<FLOAT>[^ ]+) (?<BOOL>[^ ]+) (?<STRING>.+)$
 ```
 
-```python
+{% endtab %}
+{% endtabs %}
+
+Now add `Reserve_Data` and `Preserve_Key`to the filter section of the corresponding configuration file as follows:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  parsers_file: /path/to/parsers.yaml
+
+pipeline:
+  inputs:
+    - name: dummy
+      tag: dummy.data
+      dummy: '{"data":"100 0.5 true This is example", "key1":"value1", "key2":"value2"}'
+
+  filters:
+    - name: parser
+      match: 'dummy.*'
+      key_name: data
+      parser: dummy_test
+      reserve_data: on
+      preserve_key: on
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [SERVICE]
-    Parsers_File /path/to/parsers.conf
+  Parsers_File /path/to/parsers.conf
 
 [INPUT]
-    Name dummy
-    Tag  dummy.data
-    Dummy {"data":"100 0.5 true This is example", "key1":"value1", "key2":"value2"}
+  Name dummy
+  Tag  dummy.data
+  Dummy {"data":"100 0.5 true This is example", "key1":"value1", "key2":"value2"}
 
 [FILTER]
-    Name parser
-    Match dummy.*
-    Key_Name data
-    Parser dummy_test
-    Reserve_Data On
-    Preserve_Key On
-
+  Name parser
+  Match dummy.*
+  Key_Name data
+  Parser dummy_test
+  Reserve_Data On
+  Preserve_Key On
+    
 [OUTPUT]
-    Name stdout
-    Match *
+  Name stdout
+  Match *
 ```
 
-This will produce the following output:
+{% endtab %}
+{% endtabs %}
+
+The output when running the corresponding configuration is as follows:
 
 ```text
-$ fluent-bit -c dummy.conf
-Fluent Bit v2.1.1
-* Copyright (C) 2015-2022 The Fluent Bit Authors
-...
+# For YAML configuration.
+$ fluent-bit --config fluent-bit.yaml
+
+# For classic configuration.
+$ fluent-bit --config fluent-bit.conf
+
 ...
-[0] dummy.data: [[1687122778.299116136, {}], {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example", "data"=>"100 0.5 true This is example", "key1"=>"value1", "key2"=>"value2"}]
-[0] dummy.data: [[1687122779.296906553, {}], {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example", "data"=>"100 0.5 true This is example", "key1"=>"value1", "key2"=>"value2"}]
-[0] dummy.data: [[1687122780.297475803, {}], {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example", "data"=>"100 0.5 true This is example", "key1"=>"value1", "key2"=>"value2"}]
+[0] dummy.data: [[1750325678.572817000, {}], {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example", "data"=>"100 0.5 true This is example", "key1"=>"value1", "key2"=>"value2"}]
+[0] dummy.data: [[1750325679.574538000, {}], {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example", "data"=>"100 0.5 true This is example", "key1"=>"value1", "key2"=>"value2"}]
+[0] dummy.data: [[1750325680.569750000, {}], {"INT"=>"100", "FLOAT"=>"0.5", "BOOL"=>"true", "STRING"=>"This is example", "data"=>"100 0.5 true This is example", "key1"=>"value1", "key2"=>"value2"}]
 ```
diff --git a/pipeline/filters/record-modifier.md b/pipeline/filters/record-modifier.md
index 0a1f74572..47a4d2d70 100644
--- a/pipeline/filters/record-modifier.md
+++ b/pipeline/filters/record-modifier.md
@@ -1,24 +1,24 @@
-# Record Modifier
+# Record modifier
 
-The _Record Modifier Filter_ plugin allows to append fields or to exclude specific fields.
+The _Record Modifier_ [filter](record-modifier.md) lets you append fields to a record, or exclude specific fields.
 
-## Configuration Parameters
+## Configuration parameters
 
-The plugin supports the following configuration parameters: _Remove\_key_ and _Allowlist\_key_ are exclusive.
+The plugin supports the following configuration parameters:
 
 | Key | Description |
 | :--- | :--- |
-| Record | Append fields. This parameter needs key and value pair. |
-| Remove\_key | If the key is matched, that field is removed. |
-| Allowlist\_key | If the key is **not** matched, that field is removed. |
-| Whitelist\_key | An alias of `Allowlist_key` for backwards compatibility. |
-| Uuid\_key| If set, the plugin appends uuid to each record.  The value assigned becomes the key in the map.|
+| `Record` | Append fields. This parameter needs a key/value pair. |
+| `Remove_key` | If the key is matched, that field is removed. You can use this or `Allowlist_key`.|
+| `Allowlist_key` | If the key isn't matched, that field is removed. You can use this or `Remove_key`. |
+| `Whitelist_key` | An alias of `Allowlist_key` for backwards compatibility. |
+| `Uuid_key` | If set, the plugin appends UUID to each record. The value assigned becomes the key in the map. |
 
-## Getting Started
+## Get started
 
-In order to start filtering records, you can run the filter from the command line or through the configuration file.
+To start filtering records, run the filter from the command line or through a configuration file.
 
-This is a sample in\_mem record to filter.
+This is a sample `in_mem` record to filter.
 
 ```text
 {"Mem.total"=>1016024, "Mem.used"=>716672, "Mem.free"=>299352, "Swap.total"=>2064380, "Swap.used"=>32656, "Swap.free"=>2031724}
@@ -26,169 +26,181 @@ This is a sample in\_mem record to filter.
 
 ### Append fields
 
-The following configuration file is to append product name and hostname \(via environment variable\) to record.
+The following configuration file appends a product name and hostname to a record using an environment variable:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: mem
+      tag: mem.local
+
+  filters:
+    - name: record_modifier
+      match: '*'
+      record:
+       - hostname ${HOSTNAME}
+       - product Awesome_Tool
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name mem
-    Tag  mem.local
+  Name mem
+  Tag  mem.local
 
 [OUTPUT]
-    Name  stdout
-    Match *
+  Name  stdout
+  Match *
 
 [FILTER]
-    Name record_modifier
-    Match *
-    Record hostname ${HOSTNAME}
-    Record product Awesome_Tool
+  Name record_modifier
+  Match *
+  Record hostname ${HOSTNAME}
+  Record product Awesome_Tool
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: mem
-          tag: mem.local
-    filters:
-        - name: record_modifier
-          match: '*'
-          record: 
-             - hostname ${HOSTNAME}
-             - product Awesome_Tool
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
+You can run the filter from command line:
 
-You can also run the filter from command line.
-
-```text
-$ fluent-bit -i mem -o stdout -F record_modifier -p 'Record=hostname ${HOSTNAME}' -p 'Record=product Awesome_Tool' -m '*'
+```shell
+fluent-bit -i mem -o stdout -F record_modifier -p 'Record=hostname ${HOSTNAME}' -p 'Record=product Awesome_Tool' -m '*'
 ```
 
-The output will be
+The output looks something like:
 
-```python
+```text
 [0] mem.local: [1492436882.000000000, {"Mem.total"=>1016024, "Mem.used"=>716672, "Mem.free"=>299352, "Swap.total"=>2064380, "Swap.used"=>32656, "Swap.free"=>2031724, "hostname"=>"localhost.localdomain", "product"=>"Awesome_Tool"}]
 ```
 
-### Remove fields with Remove\_key
-
-The following configuration file is to remove 'Swap.\*' fields.
+### Remove fields with `Remove_key`
 
+The following configuration file removes `Swap.*` fields:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: mem
+      tag: mem.local
+
+  filters:
+    - name: record_modifier
+      match: '*'
+      remove_key:
+       - Swap.total
+       - Swap.used
+       - Swap.free
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name mem
-    Tag  mem.local
+  Name mem
+  Tag  mem.local
 
 [OUTPUT]
-    Name  stdout
-    Match *
+  Name  stdout
+  Match *
 
 [FILTER]
-    Name record_modifier
-    Match *
-    Remove_key Swap.total
-    Remove_key Swap.used
-    Remove_key Swap.free
+  Name record_modifier
+  Match *
+  Remove_key Swap.total
+  Remove_key Swap.used
+  Remove_key Swap.free
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: mem
-          tag: mem.local
-    filters:
-        - name: record_modifier
-          match: '*'
-          remove_key: 
-             - Swap.total
-             - Swap.used
-             - Swap.free
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
 You can also run the filter from command line.
 
-```text
-$ fluent-bit -i mem -o stdout -F  record_modifier -p 'Remove_key=Swap.total' -p 'Remove_key=Swap.free' -p 'Remove_key=Swap.used' -m '*'
+```shell
+fluent-bit -i mem -o stdout -F  record_modifier -p 'Remove_key=Swap.total' -p 'Remove_key=Swap.free' -p 'Remove_key=Swap.used' -m '*'
 ```
 
-The output will be
+The output looks something like:
 
-```python
+```text
 [0] mem.local: [1492436998.000000000, {"Mem.total"=>1016024, "Mem.used"=>716672, "Mem.free"=>295332}]
 ```
 
-### Remove fields with Allowlist\_key
+### Retain fields with `Allowlist_key`
 
-The following configuration file is to remain 'Mem.\*' fields.
+The following configuration file retains `Mem.*` fields.
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: mem
+      tag: mem.local
+
+  filters:
+    - name: record_modifier
+      match: '*'
+      Allowlist_key:
+       - Mem.total
+       - Mem.used
+       - Mem.free
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
-[INPUT]
-    Name mem
-    Tag  mem.local
 
-[OUTPUT]
-    Name  stdout
-    Match *
+```text
+[INPUT]
+  Name mem
+  Tag  mem.local
 
 [FILTER]
-    Name record_modifier
-    Match *
-    Allowlist_key Mem.total
-    Allowlist_key Mem.used
-    Allowlist_key Mem.free
-```
-{% endtab %}
+  Name record_modifier
+  Match *
+  Allowlist_key Mem.total
+  Allowlist_key Mem.used
+  Allowlist_key Mem.free
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: mem
-          tag: mem.local
-    filters:
-        - name: record_modifier
-          match: '*'
-          Allowlist_key: 
-             - Mem.total
-             - Mem.used
-             - Mem.free
-    outputs:
-        - name: stdout
-          match: '*'
+[OUTPUT]
+  Name  stdout
+  Match *
 ```
+
 {% endtab %}
 {% endtabs %}
 
-You can also run the filter from command line.
+You can also run the filter from command line:
 
-```text
-$ fluent-bit -i mem -o stdout -F  record_modifier -p 'Allowlist_key=Mem.total' -p 'Allowlist_key=Mem.free' -p 'Allowlist_key=Mem.used' -m '*'
+```shell
+fluent-bit -i mem -o stdout -F record_modifier -p 'Allowlist_key=Mem.total' -p 'Allowlist_key=Mem.free' -p 'Allowlist_key=Mem.used' -m '*'
 ```
 
-The output will be
+The output looks something like:
 
-```python
+```text
 [0] mem.local: [1492436998.000000000, {"Mem.total"=>1016024, "Mem.used"=>716672, "Mem.free"=>295332}]
 ```
-
diff --git a/pipeline/filters/rewrite-tag.md b/pipeline/filters/rewrite-tag.md
index 72a991c1b..54f844155 100644
--- a/pipeline/filters/rewrite-tag.md
+++ b/pipeline/filters/rewrite-tag.md
@@ -2,38 +2,37 @@
 description: Powerful and flexible routing
 ---
 
-# Rewrite Tag
+# Rewrite tag
 
-Tags are what makes [routing](../../concepts/data-pipeline/router.md) possible. Tags are set in the configuration of the Input definitions where the records are generated, but there are certain scenarios where might be useful to modify the Tag in the pipeline so we can perform more advanced and flexible routing.
+Tags make [routing](../../concepts/data-pipeline/router.md) possible. Tags are set in the configuration of the `INPUT` definitions where the records are generated. There are scenarios where you might want to modify the tag in the pipeline to perform more advanced and flexible routing.
 
-The `rewrite_tag` filter, allows to re-emit a record under a new Tag. Once a record has been re-emitted, the original record can be preserved or discarded.
+The _Rewrite Tag_ filter lets you re-emit a record under a new tag. Once a record has been re-emitted, the original record can be preserved or discarded.
 
-## How it Works
+The Rewrite Tag filter defines rules that match specific record key content against a regular expression. If a match exists, a new record with the defined tag will be emitted, entering from the beginning of the pipeline. Multiple rules can be specified and are processed in order until one of them matches.
 
-The way it works is defining rules that matches specific record key content against a regular expression, if a match exists, **a new record with the defined Tag will be emitted, entering from the beginning of the pipeline.** Multiple rules can be specified and they are processed in order until one of them matches.
+The new tag definition can be composed of:
 
-The new Tag to define can be composed by:
+- Alphanumeric characters
+- Numbers
+- The original tag string or part of it
+- Regular expressions groups capture
+- Any key or sub-key of the processed record
+- Environment variables
 
-* Alphabet characters & Numbers
-* Original Tag string or part of it
-* Regular Expressions groups capture
-* Any key or sub-key of the processed record
-* Environment variables
-
-## Configuration Parameters
+## Configuration parameters
 
 The `rewrite_tag` filter supports the following configuration parameters:
 
 | Key | Description |
 | :--- | :--- |
-| Rule | Defines the matching criteria and the format of the Tag for the matching record. The Rule format have four components: `KEY REGEX NEW_TAG KEEP`. For more specific details of the Rule format and it composition read the next section. |
-| Emitter\_Name | When the filter emits a record under the new Tag, there is an internal emitter plugin that takes care of the job. Since this emitter expose metrics as any other component of the pipeline, you can use this property to configure an optional name for it. |
-| Emitter\_Storage.type | Define a buffering mechanism for the new records created. Note these records are part of the emitter plugin. This option support the values `memory` \(default\) or `filesystem`. If the destination for the new records generated might face backpressure due to latency or slow network, we strongly recommend enabling the `filesystem` mode. |
-| Emitter\_Mem\_Buf\_Limit | Set a limit on the amount of memory the tag rewrite emitter can consume if the outputs provide backpressure.  The default for this limit is `10M`.  The pipeline will pause once the buffer exceeds the value of this setting.  For example, if the value is set to `10M` then the pipeline will pause if the buffer exceeds `10M`.  The pipeline will remain paused until the output drains the buffer below the `10M` limit. |
+| `Rule` | Defines the matching criteria and the format of the tag for the matching record. The Rule format has four components: `KEY REGEX NEW_TAG KEEP`. |
+| `Emitter_Name` | Use this property to configure an optional name for the internal emitter plugin that handles filters emitting a record under the new tag. This emitter exposes metrics like any other component of the pipeline. |
+| `Emitter_Storage.type` | Define a buffering mechanism for the new records created. These records are part of the emitter plugin. Supported values are `memory` (default) and `filesystem`. If the destination for the new records generated might face backpressure due to latency or slow network, Fluent Bit strongly recommends enabling the `filesystem` mode. |
+| `Emitter_Mem_Buf_Limit` | Set a limit on the amount of memory the tag rewrite emitter can consume if the outputs provide backpressure. The default value is `10M`. The pipeline will pause once the buffer exceeds the value of this setting. For example, if the value is set to `10M` then the pipeline will pause if the buffer exceeds `10M`. The pipeline will remain paused until the output drains the buffer below the `10M` limit. |
 
 ## Rules
 
-A rule aims to define matching criteria and specify how to create a new Tag for a record. You can define one or multiple rules in the same configuration section. The rules have the following format:
+A rule defines matching criteria and specifies how to create a new tag for a record. You can define one or multiple rules in the same configuration section. The rules have the following format:
 
 ```text
 $KEY  REGEX  NEW_TAG  KEEP
@@ -41,9 +40,9 @@ $KEY  REGEX  NEW_TAG  KEEP
 
 ### Key
 
-The key represents the name of the _record key_ that holds the _value_ that we want to use to match our regular expression. A key name is specified and prefixed with a `$`. Consider the following structured record \(formatted for readability\):
+The key represents the name of the _record key_ that holds the `value` to use to match the regular expression. A key name is specified and prefixed with a `$`. Consider the following structured record (formatted for readability):
 
-```javascript
+```text
 {
   "name": "abc-123",
   "ss": {
@@ -54,125 +53,125 @@ The key represents the name of the _record key_ that holds the _value_ that we w
 }
 ```
 
-If we wanted to match against the value of the key `name` we must use `$name`. The key selector is flexible enough to allow to match nested levels of sub-maps from the structure. If we wanted to check the value of the nested key `s2` we can do it specifying `$ss['s1']['s2']`, for short:
+To match against the value of the key `name`, you must use `$name`. The key selector is flexible enough to allow to match nested levels of sub-maps from the structure. To capture the value of the nested key `s2`, specify `$ss['s1']['s2']`, for short:
 
-* `$name` = "abc-123"
-* `$ss['s1']['s2']` = "flb"
+-`$name` = `abc-123`
+-`$ss['s1']['s2']` = `flb`
 
-Note that a key must point to a value that contains a string, it's **not valid** for numbers, booleans, maps or arrays.
+A key must point to a value that contains a string. It's not valid for numbers, Boolean values, maps, or arrays.
 
-### Regex
+### Regular expressions
 
-Using a simple regular expression we can specify a matching pattern to use against the value of the key specified above, also we can take advantage of group capturing to create custom placeholder values.
+Use a regular expression to specify a matching pattern to use against the value of the key specified previously. You can take advantage of group capturing to create custom placeholder values.
 
-If we wanted to match any record that it `$name` contains a value of the format `string-number` like the example provided above, we might use:
+To match any record that it `$name` contains a value of the format `string-number` like the previous example, you might use:
 
 ```text
 ^([a-z]+)-([0-9]+)$
 ```
 
-Note that in our example we are using parentheses, this teams that we are specifying groups of data. If the pattern matches the value a placeholder will be created that can be consumed by the NEW\_TAG section.
+This example uses parentheses to specify groups of data. If the pattern matches the value a placeholder will be created that can be consumed by the `NEW_TAG` section.
 
-If `$name` equals `abc-123` , then the following **placeholders** will be created:
+If `$name` equals `abc-123`, then the following placeholders will be created:
 
-* `$0` = "abc-123"
-* `$1` = "abc"
-* `$2` = "123"
+-`$0` = `abc-123`
+-`$1` = `abc`
+-`$2` = `123`
 
-If the Regular expression do not matches an incoming record, the rule will be skipped and the next rule \(if any\) will be processed.
+If the regular expression doesn't match an incoming record, the rule will be skipped and the next rule (if present) will be processed.
 
-### New Tag
+### `New_Tag`
 
-If a regular expression has matched the value of the defined key in the rule, we are ready to compose a new Tag for that specific record. The tag is a concatenated string that can contain any of the following characters: `a-z`,`A-Z`, `0-9` and `.-,`.
+If a regular expression has matched the value of the defined key in the rule, you can compose a new tag for that specific record. The tag is a concatenated string that can contain any of the following characters: `a-z`,`A-Z`, `0-9` and `.-,`.
 
-A Tag can take any string value from the matching record, the original tag it self, environment variable or general placeholder.
+A tag can take any string value from the matching record, the original tag itself, environment variables, or general placeholders.
 
 Consider the following incoming data on the rule:
 
-* Tag = aa.bb.cc
-* Record =  `{"name": "abc-123", "ss": {"s1": {"s2": "flb"}}}`
-* Environment variable $HOSTNAME = fluent
+- Tag = aa.bb.cc
+- Record =  `{"name": "abc-123", "ss": {"s1": {"s2": "flb"}}}`
+- Environment variable $HOSTNAME = fluent
 
-With such information we could create a very custom Tag for our record like the following:
+With this information you can create a custom tag for your record like the following:
 
 ```text
 newtag.$TAG.$TAG[1].$1.$ss['s1']['s2'].out.${HOSTNAME}
 ```
 
-the expected Tag to generated will be:
+the expected generated tag will be:
 
 ```text
 newtag.aa.bb.cc.bb.abc.flb.out.fluent
 ```
 
-We make use of placeholders, record content and environment variables.
+This make use of placeholders, record content, and environment variables.
 
 ### Keep
 
-If a rule matches a rule the filter will emit a copy of the record with the new defined Tag. The property keep takes a boolean value to define if the original record with the old Tag must be preserved and continue in the pipeline or just be discarded.
+If a rule matches, the filter will emit a copy of the record with the new defined tag. The `keep` property takes a Boolean value to determine if the original record with the old tag must be preserved and continue in the pipeline or be discarded.
 
-You can use `true` or `false` to decide the expected behavior. There is no default value and this is a mandatory field in the rule.
+You can use `true` or `false` to decide the expected behavior. This field is mandatory and has no default value.
 
-## Configuration Example
+## Configuration example
 
-The following configuration example will emit a dummy \(hand-crafted\) record, the filter will rewrite the tag, discard the old record and print the new record to the standard output interface:
+The following configuration example will emit a dummy record. The filter will rewrite the tag, discard the old record, and print the new record to the standard output interface:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: dummy
+      tag:  test_tag
+      dummy: '{"tool": "fluent", "sub": {"s1": {"s2": "bit"}}}'
+
+  filters:
+    - name: rewrite_tag
+      match: test_tag
+      rule: $tool ^(fluent)$  from.$TAG.new.$tool.$sub['s1']['s2'].out false
+      emitter_name: re_emitted
+
+  outputs:
+    - name: stdout
+      match: from.*
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [SERVICE]
-    Flush     1
-    Log_Level info
+  Flush     1
+  Log_Level info
 
 [INPUT]
-    NAME   dummy
-    Dummy  {"tool": "fluent", "sub": {"s1": {"s2": "bit"}}}
-    Tag    test_tag
+  NAME   dummy
+  Dummy  {"tool": "fluent", "sub": {"s1": {"s2": "bit"}}}
+  Tag    test_tag
 
 [FILTER]
-    Name          rewrite_tag
-    Match         test_tag
-    Rule          $tool ^(fluent)$  from.$TAG.new.$tool.$sub['s1']['s2'].out false
-    Emitter_Name  re_emitted
+  Name          rewrite_tag
+  Match         test_tag
+  Rule          $tool ^(fluent)$  from.$TAG.new.$tool.$sub['s1']['s2'].out false
+  Emitter_Name  re_emitted
 
 [OUTPUT]
-    Name   stdout
-    Match  from.*
+  Name   stdout
+  Match  from.*
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-service:
-    flush: 1
-    log_level: info
-pipeline:
-    inputs:
-        - name: dummy
-          tag:  test_tag
-          dummy: '{"tool": "fluent", "sub": {"s1": {"s2": "bit"}}}'
-    filters:
-        - name: rewrite_tag
-          match: test_tag
-          rule: $tool ^(fluent)$  from.$TAG.new.$tool.$sub['s1']['s2'].out false
-          emitter_name: re_emitted
-    outputs:
-        - name: stdout
-          match: from.*
-```
 {% endtab %}
 {% endtabs %}
 
-
 The original tag `test_tag` will be rewritten as `from.test_tag.new.fluent.bit.out`:
 
-```bash
-$ bin/fluent-bit -c example.conf
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+```shell
+$ fluent-bit -c example.conf
 
 ...
 [0] from.test_tag.new.fluent.bit.out: [1580436933.000050569, {"tool"=>"fluent", "sub"=>{"s1"=>{"s2"=>"bit"}}}]
@@ -180,23 +179,21 @@ Fluent Bit v1.x.x
 
 ## Monitoring
 
-As described in the [Monitoring](../../administration/monitoring.md) section, every component of the pipeline of Fluent Bit exposes metrics. The basic metrics exposed by this filter are `drop_records` and `add_records`, they summarize the total of dropped records from the incoming data chunk or the new records added.
-
-Since `rewrite_tag` emit new records that goes through the beginning of the pipeline, it exposes an additional metric called `emit_records` that summarize the total number of emitted records.
+As described in the [Monitoring](../../administration/monitoring.md) section, every component of the pipeline of Fluent Bit exposes metrics. The basic metrics exposed by this filter are `drop_records` and `add_records`, which summarize the total of dropped records from the incoming data chunk or the new records added.
 
-### Understanding the Metrics
+The `rewrite_tag` filter emits new records that go through the beginning of the pipeline, and exposes an additional metric called `emit_records` that summarize the total number of emitted records.
 
-Using the configuration provided above, if we query the metrics exposed in the HTTP interface we will see the following:
+### Understand the metrics
 
-Command:
+Using the previously provided configuration, when you query the metrics exposed in the HTTP interface:
 
-```bash
-$ curl  http://127.0.0.1:2020/api/v1/metrics/ | jq
+```shell
+curl  http://127.0.0.1:2020/api/v1/metrics/ | jq
 ```
 
-Metrics output:
+You will see metrics output similar to the following:
 
-```javascript
+```text
 {
   "input": {
     "dummy.0": {
@@ -227,13 +224,12 @@ Metrics output:
 }
 ```
 
-The _dummy_ input generated two records, the filter dropped two from the chunks and emitted two new ones under a different Tag.
-
-The records generated are handled by the internal Emitter, so the new records are summarized in the Emitter metrics, take a look at the entry called `emitter_for_rewrite_tag.0`.
+The _dummy_ input generated two records, while the filter dropped two from the chunks and emitted two new ones under a different tag.
 
-### What is the Emitter ?
+The records generated are handled by the internal emitter, so the new records are summarized in the Emitter metrics. Take a look at the entry called `emitter_for_rewrite_tag.0`.
 
-The Emitter is an internal Fluent Bit plugin that allows other components of the pipeline to emit custom records. On this case `rewrite_tag` creates an Emitter instance to use it exclusively to emit records, on that way we can have a granular control of _who_ is emitting what.
+### Emitter
 
-The Emitter name in the metrics can be changed setting up the `Emitter_Name` configuration property described above.
+The _Emitter_ is an internal Fluent Bit plugin that allows other components of the pipeline to emit custom records. On this case `rewrite_tag` creates an emitter instance to use it exclusively to emit records, allowing for granular control of who is emitting what.
 
+Change the Emitter name in the metrics by adding the `Emitter_Name` configuration property described previously.
diff --git a/pipeline/filters/standard-output.md b/pipeline/filters/standard-output.md
index 9db0fe324..1b7471373 100644
--- a/pipeline/filters/standard-output.md
+++ b/pipeline/filters/standard-output.md
@@ -1,36 +1,23 @@
-# Standard Output
+# Standard output
 
-The stdout filter plugin allows printing to the standard output the data flowed through the filter plugin, which can be very useful while debugging.
+The standard output filter allows printing the data flowing through the filter plugin to `stdout`, which can be used while debugging.
 
-The plugin has no configuration parameters, is very simple to use.
+The plugin has no configuration parameters.
 
-## Command Line
+## Command line
 
-```text
-$ fluent-bit -i cpu -F stdout -m '*' -o null
+Use the following command from the command line:
+
+```shell
+fluent-bit -i cpu -F stdout -m '*' -o null
 ```
 
-We have specified to gather [CPU](../inputs/cpu-metrics.md) usage metrics and print them out in a human-readable way when they flow through the stdout plugin.
+Fluent Bit specifies gathering [CPU](../inputs/cpu-metrics.md) usage metrics and prints them out in a human-readable way when they flow through the stdout plugin.
 
 ```text
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2021 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
-
-[2021/06/04 14:53:59] [ info] [engine] started (pid=3236719)
-[2021/06/04 14:53:59] [ info] [storage] version=1.1.1, initializing...
-[2021/06/04 14:53:59] [ info] [storage] in-memory
-[2021/06/04 14:53:59] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128
-[2021/06/04 14:53:59] [ info] [sp] stream processor started
+...
 [0] cpu.0: [1622789640.379532062, {"cpu_p"=>9.000000, "user_p"=>6.500000, "system_p"=>2.500000, "cpu0.p_cpu"=>8.000000, "cpu0.p_user"=>6.000000, "cpu0.p_system"=>2.000000, "cpu1.p_cpu"=>9.000000, "cpu1.p_user"=>6.000000, "cpu1.p_system"=>3.000000}]
 [0] cpu.0: [1622789641.379529426, {"cpu_p"=>22.500000, "user_p"=>18.000000, "system_p"=>4.500000, "cpu0.p_cpu"=>34.000000, "cpu0.p_user"=>30.000000, "cpu0.p_system"=>4.000000, "cpu1.p_cpu"=>11.000000, "cpu1.p_user"=>6.000000, "cpu1.p_system"=>5.000000}]
 [0] cpu.0: [1622789642.379544020, {"cpu_p"=>26.500000, "user_p"=>16.000000, "system_p"=>10.500000, "cpu0.p_cpu"=>30.000000, "cpu0.p_user"=>24.000000, "cpu0.p_system"=>6.000000, "cpu1.p_cpu"=>22.000000, "cpu1.p_user"=>8.000000, "cpu1.p_system"=>14.000000}]
 [0] cpu.0: [1622789643.379507371, {"cpu_p"=>39.500000, "user_p"=>34.500000, "system_p"=>5.000000, "cpu0.p_cpu"=>52.000000, "cpu0.p_user"=>48.000000, "cpu0.p_system"=>4.000000, "cpu1.p_cpu"=>28.000000, "cpu1.p_user"=>21.000000, "cpu1.p_system"=>7.000000}]
-^C[2021/06/04 14:54:04] [engine] caught signal (SIGINT)
-[2021/06/04 14:54:04] [ info] [input] pausing cpu.0
-[2021/06/04 14:54:04] [ warn] [engine] service will stop in 5 seconds
-[2021/06/04 14:54:08] [ info] [engine] service stopped
-```
-
+```
\ No newline at end of file
diff --git a/pipeline/filters/sysinfo.md b/pipeline/filters/sysinfo.md
index ce8c2d65b..439a65a83 100644
--- a/pipeline/filters/sysinfo.md
+++ b/pipeline/filters/sysinfo.md
@@ -1,72 +1,77 @@
 # Sysinfo
 
-The _Sysinfo Filter_ plugin allows to append system information like fluent-bit version or hostname.
+The _Sysinfo_ filter lets you append system information like the Fluent Bit version or hostname.
 
-## Configuration Prameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-|Key|Description|Supported platform|
-|---|---|---|
-|fluentbit_version_key|Specify the key name for fluent-bit version.| All |
-|os_name_key|Specify the key name for os name. e.g. linux, win64 or macos.| All |
-|hostname_key|Specify the key name for hostname.| All|
-|os_version_key|Specify the key name for os version. It is not supported on some platforms. | Linux |
-|kernel_version_key|Specify the key name for kernel version. It is not supported on some platforms.| Linux |
+| Key | Description | Supported platform |
+| --- | --- | --- |
+| `fluentbit_version_key` | Specify the key name for the Fluent Bit version.| All |
+| `os_name_key` | Specify the key name for operating system name. For example, `Linux`, `win64` or `macos`.| All |
+| `hostname_key`| Specify the key name for hostname. | All |
+| `os_version_key` | Specify the key name for the operating system version. Not supported on some platforms. | Linux |
+| `kernel_version_key` | Specify the key name for kernel version. Not supported on some platforms.| Linux |
 
-Some properties are supported by specific platform.
+Some properties are supported by specific platforms.
 
-## Getting Started
+## Get started
 
-In order to start filtering records, you can run the filter from the command line or through the configuration file.
+To start filtering records, you can run the filter from the command line or through the configuration file.
 
-The following configuration file is to append fluent-bit version and OS name.
+The following configuration file is to append the Fluent Bit version and operating system name.
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      tag: test
+
+  filters:
+    - name: sysinfo
+      match: '*'
+      Fluentbit_version_key: flb_ver
+      Os_name_key: os_name
+
+  outputs:
+    - name: stdout
+      match: '*'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name dummy
-    Tag test
+  Name dummy
+  Tag test
 
 [FILTER]
-    Name sysinfo
-    Match *
-    Fluentbit_version_key flb_ver
-    Os_name_key os_name
+  Name sysinfo
+  Match *
+  Fluentbit_version_key flb_ver
+  Os_name_key os_name
 
 [OUTPUT]
-    name stdout
-    match *
+  name stdout
+  match *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: dummy
-          tag: test
-    filters:
-        - name: sysinfo
-          match: '*'
-          Fluentbit_version_key: flb_ver
-          Os_name_key: os_name
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
-
 You can also run the filter from command line.
 
-```
+```shell
 fluent-bit -i dummy -o stdout -F sysinfo -m '*' -p fluentbit_version_key=flb_ver -p os_name_key=os_name
 ```
 
-The output will be 
-```
+The output will be something like the following:
+
+```text
 [0] dummy.0: [[1699172858.989654355, {}], {"message"=>"dummy", "flb_ver"=>"2.2.0", "os_name"=>"linux"}]
 ```
\ No newline at end of file
diff --git a/pipeline/filters/tensorflow.md b/pipeline/filters/tensorflow.md
index e1db34fac..d0217257d 100644
--- a/pipeline/filters/tensorflow.md
+++ b/pipeline/filters/tensorflow.md
@@ -1,46 +1,63 @@
 # Tensorflow
 
-## Tensorflow
+The _Tensorflow_ filter plugin allows running machine learning inference tasks on the records of data coming from input plugins or stream processors. This filter uses [Tensorflow Lite](https://www.tensorflow.org/lite/) as the inference engine, and requires Tensorflow Lite shared library to be present during build and at runtime.
 
-_Tensorflow Filter_ allows running Machine Learning inference tasks on the records of data coming from input plugins or stream processor. This filter uses [Tensorflow Lite](https://www.tensorflow.org/lite/) as the inference engine, and **requires Tensorflow Lite shared library to be present during build and at runtime**.
+Tensorflow Lite is a lightweight open source deep learning framework used for mobile and IoT applications. Tensorflow Lite only handles inference, not training. It loads pre-trained models (`.tflite` files) that are converted into Tensorflow Lite format (`FlatBuffer`). You can read more on converting [Tensorflow models](https://www.tensorflow.org/lite/convert).
 
-Tensorflow Lite is a lightweight open-source deep learning framework that is used for mobile and IoT applications. Tensorflow Lite only handles inference \(not training\), therefore, it loads pre-trained models \(`.tflite` files\) that are converted into Tensorflow Lite format \(`FlatBuffer`\). You can read more on converting Tensorflow models [here](https://www.tensorflow.org/lite/convert)
+The Tensorflow plugin for Fluent Bit has the following limitations:
 
-### Configuration Parameters
+- Currently, supports single-input models
+- Uses Tensorflow 2.3 header files
+
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
 | Key | Description | Default |
 | :--- | :--- | :--- |
-| input\_field | Specify the name of the field in the record to apply inference on. |  |
-| model\_file | Path to the model file \(`.tflite`\) to be loaded by Tensorflow Lite. |  |
-| include\_input\_fields | Include all input filed in filter's output | True |
-| normalization\_value | Divide input values to normalization\_value |  |
+| `input_field` | Specify the name of the field in the record to apply inference on. | _none_ |
+| `model_file` | Path to the model file (`.tflite`) to be loaded by Tensorflow Lite. | _none_ |
+| `include_input_fields` | Include all input filed in filter's output. | `True` |
+| `normalization_value` | Divide input values to `normalization_value`. | _none_ |
 
-### Creating Tensorflow Lite shared library
+## Creating a Tensorflow Lite shared library
 
-Clone [Tensorflow repository](https://github.com/tensorflow/tensorflow), install bazel package manager, and run the following command in order to create the shared library:
+To create a Tensorflow Lite shared library:
 
-```bash
-$ bazel build -c opt //tensorflow/lite/c:tensorflowlite_c  # see https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/c
-```
+1. Clone the [Tensorflow repository](https://github.com/tensorflow/tensorflow).
+1. Install the [Bazel](https://bazel.build/) package manager.
+1. Run the following command to create the shared library:
+
+   ```shell
+   bazel build -c opt //tensorflow/lite/c:tensorflowlite_c  # see https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/c
+   ```
 
-The script creates the shared library `bazel-bin/tensorflow/lite/c/libtensorflowlite_c.so`. You need to copy the library to a location \(such as `/usr/lib`\) that can be used by Fluent Bit.
+   The script creates the shared library
+   `bazel-bin/tensorflow/lite/c/libtensorflowlite_c.so`.
+1. Copy the library to a location such as `/usr/lib` that can be used by Fluent Bit.
 
-### Building Fluent Bit with Tensorflow filter plugin
+## Building Fluent Bit with Tensorflow filter plugin
 
-Tensorflow filter plugin is disabled by default. You need to build Fluent Bit with Tensorflow plugin enabled. In addition, it requires access to Tensorflow Lite header files to compile. Therefore, you also need to pass the address of the Tensorflow source code on your machine to the [build script](https://github.com/fluent/fluent-bit#build-from-scratch):
+The Tensorflow filter plugin is disabled by default. You must build Fluent Bit with the Tensorflow plugin enabled. In addition, it requires access to Tensorflow Lite header files to compile. Therefore, you must pass the address of the Tensorflow source code on your machine to the [build script](https://github.com/fluent/fluent-bit#build-from-scratch):
 
-```bash
+```shell
 cmake -DFLB_FILTER_TENSORFLOW=On -DTensorflow_DIR=<AddressOfTensorflowSourceCode> ...
 ```
 
-#### Command line
+### Command line
+
+If the Tensorflow plugin initializes correctly, it reports successful creation of the interpreter, and prints a summary of model's input and output types and dimensions.
+
+The command:
+
+```shell
+fluent-bit -i mqtt -p 'tag=mqtt.data' -F tensorflow -m '*' -p 'input_field=image' -p 'model_file=/home/user/model.tflite' -p
+```
 
-If Tensorflow plugin initializes correctly, it reports successful creation of the interpreter, and prints a summary of model's input/output types and dimensions.
+produces an output like:
 
-```bash
-$ bin/fluent-bit -i mqtt -p 'tag=mqtt.data' -F tensorflow -m '*' -p 'input_field=image' -p 'model_file=/home/user/model.tflite' -p 'include_input_fields=false' -p 'normalization_value=255' -o stdout
+```text
+'include_input_fields=false' -p 'normalization_value=255' -o stdout
 [2020/08/04 20:00:00] [ info] Tensorflow Lite interpreter created!
 [2020/08/04 20:00:00] [ info] [tensorflow] ===== input #1 =====
 [2020/08/04 20:00:00] [ info] [tensorflow] type: FLOAT32  dimensions: {1, 224, 224, 3}
@@ -48,33 +65,60 @@ $ bin/fluent-bit -i mqtt -p 'tag=mqtt.data' -F tensorflow -m '*' -p 'input_field
 [2020/08/04 20:00:00] [ info] [tensorflow] type: FLOAT32  dimensions: {1, 2}
 ```
 
-#### Configuration File
+### Configuration file
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  daemon: off
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: mqtt
+      tag: mqtt.data
+
+  filters:
+    - name: tensorflow
+      match: mqtt.data
+      input_field: image
+      model_file: /home/m/model.tflite
+      include_input_fields: false
+      normalization_value: 255
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [SERVICE]
-    Flush        1
-    Daemon       Off
-    Log_Level    info
+  Flush        1
+  Daemon       Off
+  Log_Level    info
 
 [INPUT]
-    Name mqtt
-    Tag mqtt.data
+  Name mqtt
+  Tag  mqtt.data
 
 [FILTER]
-    Name tensorflow
-    Match mqtt.data
-    input_field image
-    model_file /home/m/model.tflite
-    include_input_fields false
-    normalization_value 255
+  Name                 tensorflow
+  Match                mqtt.data
+  input_field          image
+  model_file           /home/m/model.tflite
+  include_input_fields false
+  normalization_value  255
 
 [OUTPUT]
-    Name stdout
-    Match *
+  Name  stdout
+  Match *
 ```
 
-## Limitations
-
-1. Currently supports single-input models
-2. Uses Tensorflow 2.3 header files
-
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/filters/throttle.md b/pipeline/filters/throttle.md
index 9c54c256d..c45e726d5 100644
--- a/pipeline/filters/throttle.md
+++ b/pipeline/filters/throttle.md
@@ -1,21 +1,21 @@
 # Throttle
 
-The _Throttle Filter_ plugin sets the average _Rate_ of messages per _Interval_, based on leaky bucket and sliding window algorithm. In case of overflood, it will leak within certain rate.
+The _Throttle_ filter sets the average `Rate` of messages per `Interval`, based on the leaky bucket and sliding window algorithm. In case of flooding, it will leak at a certain rate.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
 | Key | Value Format | Description |
 | :--- | :--- | :--- |
-| Rate | Integer | Amount of messages for the time. |
-| Window | Integer | Amount of intervals to calculate average over. Default 5. |
-| Interval | String | Time interval, expressed in "sleep" format. e.g 3s, 1.5m, 0.5h etc |
-| Print\_Status | Bool | Whether to print status messages with current rate and the limits to information logs |
+| `Rate` | `Integer` | Amount of messages for the time. |
+| `Window` | `Integer` | Amount of intervals to calculate average over. Default: `5`. |
+| `Interval` | `String` | Time interval, expressed in `sleep` format. For example, `3s`, `1.5m`, `0.5h`. |
+| `Print_Status` | `Bool` | Whether to print status messages with current rate and the limits to information logs. |
 
 ## Functional description
 
-Lets imagine we have configured:
+Using the following configuration:
 
 ```text
 Rate 5
@@ -23,27 +23,27 @@ Window 5
 Interval 1s
 ```
 
-we received 1 message first second, 3 messages 2nd, and 5 3rd. As you can see, disregard that Window is actually 5, we use "slow" start to prevent overflooding during the startup.
+You would receive 1 message in the first second, 3 messages second, and 5 third. Disregard that Window is actually 5, because the configuration uses `slow` start to prevent flooding during the startup.
 
 ```text
-+-------+-+-+-+ 
-|1|3|5| | | | | 
-+-------+-+-+-+ 
-|  3  |         average = 3, and not 1.8 if you calculate 0 for last 2 panes. 
++-------+-+-+-+
+|1|3|5| | | | |
++-------+-+-+-+
+|  3  |         average = 3, and not 1.8 if you calculate 0 for last 2 panes.
 +-----+
 ```
 
-But as soon as we reached Window size \* Interval, we will have true sliding window with aggregation over complete window.
+But as soon as you reach `Window size * Interval`, you will have true sliding window with aggregation over complete window.
 
 ```text
-+-------------+ 
-|1|3|5|7|3|4| | 
-+-------------+ 
-  |  4.4    |   
++-------------+
+|1|3|5|7|3|4| |
++-------------+
+  |  4.4    |
   ----------+
 ```
 
-When we have average over window is more than Rate, we will start dropping messages, so that
+When the average over window is more than `Rate`, Fluent Bit starts dropping messages, so the following:
 
 ```text
 +-------------+
@@ -63,11 +63,11 @@ will become:
     +---------+
 ```
 
-As you can see, last pane of the window was overwritten and 1 message was dropped.
+The last pane of the window was overwritten and 1 message was dropped.
 
-### Interval vs Window size
+### `Interval` versus `Window` size
 
-You might noticed possibility to configure _Interval_ of the _Window_ shift. It is counter intuitive, but there is a difference between two examples above:
+You might notice it's possible to configure the `Interval` of the `Window` shift. It's counterintuitive, but there is a difference between the two previous examples:
 
 ```text
 Rate 60
@@ -83,7 +83,7 @@ Window 300
 Interval 1s
 ```
 
-Even though both examples will allow maximum Rate of 60 messages per minute, first example may get all 60 messages within first second, and will drop all the rest for the entire minute:
+Even though both examples will allow maximum `Rate` of 60 messages per minute, the first example might get all 60 messages within first second, and will drop all the rest for the entire minute:
 
 ```text
 XX        XX        XX
@@ -95,7 +95,7 @@ XX        XX        XX
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 ```
 
-While the second example will not allow more than 1 message per second every second, making output rate more smooth:
+While the second example won't allow more than 1 message per second every second, making output rate more smooth:
 
 ```text
   X    X     X    X    X    X
@@ -103,36 +103,62 @@ XXXX XXXX  XXXX XXXX XXXX XXXX
 +-+-+-+-+-+--+-+-+-+-+-+-+-+-+-+
 ```
 
-It may drop some data if the rate is ragged. I would recommend to use bigger interval and rate for streams of rare but important events, while keep _Window_ bigger and _Interval_ small for constantly intensive inputs.
+Fluent Bit might drop some data if the rate is ragged. Use bigger intervals and rates for streams of rare but important events, while keeping `Window` bigger and `Interval` smaller for constantly intensive inputs.
 
-### Command Line
+### Command line
 
-> Note: It's suggested to use a configuration file.
+It's suggested to use a configuration file.
 
-The following command will load the _tail_ plugin and read the content of _lines.txt_ file. Then the _throttle_ filter will apply a rate limit and only _pass_ the records which are read below the certain _rate_:
+The following command will load the Tail plugin and read the content of the `lines.txt` file. Then, the Throttle filter will apply a rate limit and only pass the records which are read below the `rate`:
 
-```text
-$ bin/fluent-bit -i tail -p 'path=lines.txt' -F throttle -p 'rate=1' -m '*' -o stdout
+```shell
+fluent-bit -i tail -p 'path=lines.txt' -F throttle -p 'rate=1' -m '*' -o stdout
+```
+
+### Configuration file
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: tail
+      path: lines.txt
+
+  filters:
+    - name: throttle
+      match: '*'
+      rate: 1000
+      window: 300
+      interval: 1s
+
+  outputs:
+    - name: stdout
+      match: '*'
 ```
 
-### Configuration File
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [INPUT]
-    Name   tail
-    Path   lines.txt
+  Name   tail
+  Path   lines.txt
 
 [FILTER]
-    Name     throttle
-    Match    *
-    Rate     1000
-    Window   300
-    Interval 1s
+  Name     throttle
+  Match    *
+  Rate     1000
+  Window   300
+  Interval 1s
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
 
-The example above will pass 1000 messages per second in average over 300 seconds.
+{% endtab %}
+{% endtabs %}
 
+This example will pass 1000 messages per second in average over 300 seconds.
diff --git a/pipeline/filters/type-converter.md b/pipeline/filters/type-converter.md
index b185467f8..0c7a47e8e 100644
--- a/pipeline/filters/type-converter.md
+++ b/pipeline/filters/type-converter.md
@@ -1,88 +1,91 @@
-# Type Converter
+# Type converter
 
-The _Type Converter Filter_ plugin allows to convert data type and append new key value pair.
+The _Type converter_ filter plugin converts data types and appends new key-value pairs.
 
-This plugin is useful in combination with plugins which expect incoming string value.
-e.g. [filter_grep](grep.md), [filter_modify](modify.md)
+You can use this filter in combination with plugins which expect incoming string value. For example, [Grep](grep.md) and [Modify](modify.md).
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters. It needs four parameters.
 
-`<config_parameter> <src_key_name> <dst_key_name> <dst_data_type>`
-
-_dst_data_type_ allows `int`, `uint`, `float` and `string`.
-
-e.g. `int_key id id_str string`
+```text
+<config_parameter> <src_key_name> <dst_key_name> <dst_data_type>`
+```
 
+`dst_data_type` allows `int`, `uint`, `float`, and `string`. For example, `int_key id id_str string`.
 
 | Key | Description |
 | :--- | :--- |
-| int_key  | This parameter is for integer source.|
-| uint_key | This parameter is for unsigned integer source.|
-| float_key| This parameter is for float source.|
-| str_key | This parameter is for string source.|
+| `int_key` | This parameter is for an integer source.|
+| `uint_key` | This parameter is for an unsigned integer source.|
+| `float_key` | This parameter is for a float source.|
+| `str_key` | This parameter is for a string source.|
 
-## Getting Started
+## Get started
 
-In order to start filtering records, you can run the filter from the command line or through the configuration file.
+To start filtering records, you can run the filter from the command line or through the configuration file.
 
-This is a sample in\_mem record to filter. 
+This is a sample `in_mem` record to filter.
 
 ```text
 {"Mem.total"=>1016024, "Mem.used"=>716672, "Mem.free"=>299352, "Swap.total"=>2064380, "Swap.used"=>32656, "Swap.free"=>2031724}
 ```
 
-The plugin outputs uint values and filter_type_converter converts them into string type.
+The plugin outputs `uint` values and `filter_type_converter` converts them into string type.
 
-### Convert uint to string
+### Convert `uint` to string
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: mem
+
+  filters:
+    - name: type_converter
+      match: '*'
+      uint_key:
+        - Mem.total Mem.total_str string
+        - Mem.used  Mem.used_str  string
+        - Mem.free  Mem.free_str  string
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name mem
+  Name mem
 
 [FILTER]
-    Name type_converter
-    Match *
-    uint_key Mem.total Mem.total_str string
-    uint_key Mem.used  Mem.used_str  string
-    uint_key Mem.free  Mem.free_str  string
+  Name               type_converter
+  Match              *
+  uint_key Mem.total Mem.total_str string
+  uint_key Mem.used  Mem.used_str  string
+  uint_key Mem.free  Mem.free_str  string
 
 [OUTPUT]
-    Name stdout
-    Match *
+  Name  stdout
+  Match *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: mem
-    filters:
-        - name: type_converter
-          match: '*'
-          uint_key:
-            - Mem.total Mem.total_str string
-            - Mem.used  Mem.used_str  string
-            - Mem.free  Mem.free_str  string
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
 You can also run the filter from command line.
 
-```text
-$ fluent-bit -i mem -o stdout -F type_converter -p 'uint_key=Mem.total Mem.total_str string' -p 'uint_key=Mem.used Mem.used_str string' -p 'uint_key=Mem.free Mem.free_str string' -m '*'
+```shell
+fluent-bit -i mem -o stdout -F type_converter -p 'uint_key=Mem.total Mem.total_str string' -p 'uint_key=Mem.used Mem.used_str string' -p 'uint_key=Mem.free Mem.free_str string' -m '*'
 ```
 
 The output will be
 
-```python
+```text
 [0] mem.0: [1639915154.160159749, {"Mem.total"=>8146052, "Mem.used"=>4513564, "Mem.free"=>3632488, "Swap.total"=>1918356, "Swap.used"=>0, "Swap.free"=>1918356, "Mem.total_str"=>"8146052", "Mem.used_str"=>"4513564", "Mem.free_str"=>"3632488"}]
 ```
diff --git a/pipeline/filters/wasm.md b/pipeline/filters/wasm.md
index c311447ba..12740ef0b 100644
--- a/pipeline/filters/wasm.md
+++ b/pipeline/filters/wasm.md
@@ -1,46 +1,77 @@
 ---
-description: Use Wasm programs as a filter
+description: Use Wasm programs as a filter.
 ---
 
-# Wasm Filter
+# Wasm
 
-Wasm Filter allows you to modify the incoming records using [Wasm](https://webassembly.org/) technology.
+The _Wasm_ filter lets you modify the incoming records using [Wasm](https://webassembly.org/) technology.
 
-Due to the necessity to have a flexible filtering mechanism, it is now possible to extend Fluent Bit capabilities by writing custom filters using built Wasm programs and its runtime. A Wasm-based filter takes two steps:
+You can extend Fluent Bit capabilities by writing custom filters using built Wasm programs and its runtime. A Wasm-based filter takes the following steps:
 
-0. (Optional) Compiled as AOT (Ahead Of Time) objects to optimize Wasm execution pipeline
-1. Configure the Filter in the main configuration
-2. Prepare a Wasm program that will be used by the Filter
+1. (Optional) Compile Ahead Of Time (AOT) objects to optimize the Wasm execution pipeline.
+1. Configure the filter in the main configuration.
+1. Prepare a Wasm program that will be used by the filter.
 
-## Configuration Parameters <a id="config"></a>
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
 | Key | Description |
 | :--- | :--- |
-| Wasm\_Path | Path to the built Wasm program that will be used. This can be a relative path against the main configuration file. |
-| Event\_Format | Define event format to interact with Wasm programs: msgpack or json. Default: json |
-| Function\_Name | Wasm function name that will be triggered to do filtering. It's assumed that the function is built inside the Wasm program specified above. |
-| Accessible\_Paths | Specify the whilelist of paths to be able to access paths from WASM programs. |
+| `Wasm_Path` | Path to the built Wasm program that will be used. This can be a path relative to the main configuration file. |
+| `Event_Format` | Define event format to interact with Wasm programs: `msgpack` or `json`. Default: `json`. |
+| `Function_Name` | Wasm function name that will be triggered to do filtering. It's assumed that the function is built inside the Wasm program specified previously. |
+| `Accessible_Paths` | Specify the allowlist of paths to be able to access paths from Wasm programs. |
+| `Wasm_Heap_Size` | Size of the heap size of Wasm execution. Review [unit sizes](../../administration/configuring-fluent-bit/unit-sizes.md) for allowed values. |
+| `Wasm_Stack_Size` | Size of the stack size of Wasm execution. Review [unit sizes](../../administration/configuring-fluent-bit/unit-sizes.md) for allowed values. |
 
-## Configuration Examples <a id="config_example"></a>
+## Configuration example
 
 Here is a configuration example.
 
-```python
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      tag: dummy.local
+
+  filters:
+    - name: wasm
+      match: 'dummy.*'
+      event_format: json    # or msgpack
+      wasm_path: /path/to/wasm_program.wasm
+      function_name: filter_function_name
+      # Note: run Fluent Bit from the 'wasm_path' location.
+      accessible_paths: /path/to/accessible
+    
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name   dummy
-    Tag    dummy.local
+  Name   dummy
+  Tag    dummy.local
 
 [FILTER]
-    Name wasm
-    Match dummy.*
-    Event_Format json # or msgpack
-    WASM_Path /path/to/wasm_program.wasm
-    Function_Name filter_function_name
-    Accessible_Paths .,/path/to/accessible
+  Name             wasm
+  Match            dummy.*
+  Event_Format     json # or msgpack
+  WASM_Path        /path/to/wasm_program.wasm
+  Function_Name    filter_function_name
+  Accessible_Paths .,/path/to/accessible
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
+
+{% endtab %}
+{% endtabs %}
\ No newline at end of file
diff --git a/pipeline/inputs/collectd.md b/pipeline/inputs/collectd.md
index acbf773c1..534207e53 100644
--- a/pipeline/inputs/collectd.md
+++ b/pipeline/inputs/collectd.md
@@ -1,34 +1,56 @@
 # Collectd
 
-The **collectd** input plugin allows you to receive datagrams from collectd service.
+The _Collectd_ input plugin lets you receive datagrams from the `collectd` service.
 
-## Configuration Parameters <a id="config"></a>
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-| Listen | Set the address to listen to | 0.0.0.0 |
-| Port | Set the port to listen to | 25826 |
-| TypesDB | Set the data specification file | /usr/share/collectd/types.db |
+| Key        | Description                                                                                             | Default                        |
+|:-----------|:--------------------------------------------------------------------------------------------------------|:-------------------------------|
+| `Listen`   | Set the address to listen to.                                                                           | `0.0.0.0`                      |
+| `Port`     | Set the port to listen to.                                                                              | `25826`                        |
+| `TypesDB`  | Set the data specification file.                                                                        | `/usr/share/collectd/types.db` |
+| `Threaded` | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs). | `false`                        |
 
-## Configuration Examples <a id="config_example"></a>
+## Configuration examples
 
-Here is a basic configuration example.
+Here is a basic configuration example:
 
-```python
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: collectd
+      listen: 0.0.0.0
+      port: 25826
+      typesdb: '/user/share/collectd/types.db,/etc/collectd/custom.db'
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name         collectd
-    Listen       0.0.0.0
-    Port         25826
-    TypesDB      /usr/share/collectd/types.db,/etc/collectd/custom.db
+  Name         collectd
+  Listen       0.0.0.0
+  Port         25826
+  TypesDB      /usr/share/collectd/types.db,/etc/collectd/custom.db
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
 
-With this configuration, Fluent Bit listens to `0.0.0.0:25826`, and outputs incoming datagram packets to stdout.
+{% endtab %}
+{% endtabs %}
 
-You must set the same types.db files that your collectd server uses. Otherwise, Fluent Bit may not be able to interpret the payload properly.
+With this configuration, Fluent Bit listens to `0.0.0.0:25826`, and outputs incoming datagram packets to `stdout`.
 
+You must set the same `types.db` files that your `collectd` server uses. Otherwise, Fluent Bit might not be able to interpret the payload properly.
\ No newline at end of file
diff --git a/pipeline/inputs/cpu-metrics.md b/pipeline/inputs/cpu-metrics.md
index 3c296f0cd..2542dcac5 100644
--- a/pipeline/inputs/cpu-metrics.md
+++ b/pipeline/inputs/cpu-metrics.md
@@ -1,85 +1,92 @@
-# CPU Metrics
+# CPU metrics
 
-The **cpu** input plugin, measures the CPU usage of a process or the whole system by default \(considering per CPU core\). It reports values in percentage unit for every interval of time set. At the moment this plugin is only available for Linux.
+The _CPU_ input plugin, measures the CPU usage of a process or the whole system by default (considering per CPU core). It reports values in percentage unit for every interval of time set. This plugin is available only for Linux.
 
-The following tables describes the information generated by the plugin. The keys below represent the data used by the overall system, all values associated to the keys are in a percentage unit \(0 to 100%\):
+The following tables describe the information generated by the plugin. The following keys represent the data used by the overall system, and all values associated to the keys are in a percentage unit (0 to 100%):
 
-The CPU metrics plugin creates metrics that are log-based \(I.e. JSON payload\). If you are looking for Prometheus-based metrics please see the Node Exporter Metrics input plugin. 
+The CPU metrics plugin creates metrics that are log-based, such as JSON payload. For Prometheus-based metrics, see the _Node Exporter Metrics_ input plugin.
 
-| key | description |
-| :--- | :--- |
-| cpu\_p | CPU usage of the overall system, this value is the summation of time spent on user and kernel space. The result takes in consideration the numbers of CPU cores in the system. |
-| user\_p | CPU usage in User mode, for short it means the CPU usage by user space programs. The result of this value takes in consideration the numbers of CPU cores in the system. |
-| system\_p | CPU usage in Kernel mode, for short it means the CPU usage by the Kernel. The result of this value takes in consideration the numbers of CPU cores in the system. |
+| Key        | Description                                                                                                                                                                    |
+|:-----------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `cpu_p`    | CPU usage of the overall system, this value is the summation of time spent on user and kernel space. The result takes in consideration the numbers of CPU cores in the system. |
+| `user_p`   | CPU usage in User mode, for short it means the CPU usage by user space programs. The result of this value takes in consideration the numbers of CPU cores in the system.       |
+| `system_p` | CPU usage in Kernel mode, for short it means the CPU usage by the Kernel. The result of this value takes in consideration the numbers of CPU cores in the system.              |
+| `threaded` | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs). Default: `false`.                                                      |
 
-In addition to the keys reported in the above table, a similar content is created **per** CPU core. The cores are listed from _0_ to _N_ as the Kernel reports:
+In addition to the keys reported in the previous table, a similar content is created per CPU core. The cores are listed from `0` to `N` as the Kernel reports:
 
-| key | description |
-| :--- | :--- |
-| cpu**N**.p\_cpu | Represents the total CPU usage by core **N**. |
-| cpu**N**.p\_user | Total CPU spent in user mode or user space programs associated to this core. |
-| cpu**N**.p\_system | Total CPU spent in system or kernel mode associated to this core. |
+| Key             | Description                                                                  |
+|:----------------|:-----------------------------------------------------------------------------|
+| `cpuN.p_cpu`    | Represents the total CPU usage by core `N`.                                  |
+| `cpuN.p_user`   | Total CPU spent in user mode or user space programs associated to this core. |
+| `cpuN.p_system` | Total CPU spent in system or kernel mode associated to this core.            |
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-| Interval\_Sec | Polling interval in seconds | 1 |
-| Interval\_NSec | Polling interval in nanoseconds | 0 |
-| PID | Specify the ID \(PID\) of a running process in the system. By default the plugin monitors the whole system but if this option is set, it will only monitor the given process ID. |  |
+| Key            | Description                                                                                                                                                                         | Default |
+|:---------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------|
+| `Interval_Sec` | Polling interval in seconds.                                                                                                                                                        | `1`     |
+| `Interval_NSec | Polling interval in nanoseconds`                                                                                                                                                    | `0`     |
+| `PID`          | Specify the `ID` (`PID`) of a running process in the system. By default, the plugin monitors the whole system but if this option is set, it will only monitor the given process ID. | _none_  |
 
-## Getting Started
+## Get started
 
 In order to get the statistics of the CPU usage of your system, you can run the plugin from the command line or through the configuration file:
 
-### Command Line
+### Command line
 
-```bash
-$ build/bin/fluent-bit -i cpu -t my_cpu -o stdout -m '*'
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+You can run this filter from the command line using a command like the following:
 
-[2019/09/02 10:46:29] [ info] starting engine
+```shell
+build/bin/fluent-bit -i cpu -t my_cpu -o stdout -m '*'
+```
+
+The command returns results similar to the following:
+
+```text
+...
 [0] [1452185189, {"cpu_p"=>7.00, "user_p"=>5.00, "system_p"=>2.00, "cpu0.p_cpu"=>10.00, "cpu0.p_user"=>8.00, "cpu0.p_system"=>2.00, "cpu1.p_cpu"=>6.00, "cpu1.p_user"=>4.00, "cpu1.p_system"=>2.00}]
 [1] [1452185190, {"cpu_p"=>6.50, "user_p"=>5.00, "system_p"=>1.50, "cpu0.p_cpu"=>6.00, "cpu0.p_user"=>5.00, "cpu0.p_system"=>1.00, "cpu1.p_cpu"=>7.00, "cpu1.p_user"=>5.00, "cpu1.p_system"=>2.00}]
 [2] [1452185191, {"cpu_p"=>7.50, "user_p"=>5.00, "system_p"=>2.50, "cpu0.p_cpu"=>7.00, "cpu0.p_user"=>3.00, "cpu0.p_system"=>4.00, "cpu1.p_cpu"=>6.00, "cpu1.p_user"=>6.00, "cpu1.p_system"=>0.00}]
 [3] [1452185192, {"cpu_p"=>4.50, "user_p"=>3.50, "system_p"=>1.00, "cpu0.p_cpu"=>6.00, "cpu0.p_user"=>5.00, "cpu0.p_system"=>1.00, "cpu1.p_cpu"=>5.00, "cpu1.p_user"=>3.00, "cpu1.p_system"=>2.00}]
+...
 ```
 
-As described above, the CPU input plugin gathers the overall usage every one second and flushed the information to the output on the fifth second. On this example we used the **stdout** plugin to demonstrate the output records. In a real use-case you may want to flush this information to some central aggregator such as [Fluentd](http://fluentd.org) or [Elasticsearch](http://elastic.co).
+As described previously, the CPU input plugin gathers the overall usage every one second and flushed the information to the output on the fifth second. This example uses the `stdout` plugin to demonstrate the output records. In a real use-case you might want to flush this information to some central aggregator such as [Fluentd](http://fluentd.org) or [Elasticsearch](http://elastic.co).
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+In your main configuration file append the following:
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```python
-[INPUT]
-    Name cpu
-    Tag  my_cpu
+{% tab title="fluent-bit.yaml" %}
 
-[OUTPUT]
-    Name  stdout
-    Match *
+```yaml
+
+pipeline:
+  inputs:
+    - name: cpu
+      tag: my_cpu
+
+  outputs:
+    - name: stdout
+      match: '*'
 ```
+
 {% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: cpu
-          tag: my_cpu
+```shell
+[INPUT]
+  Name cpu
+  Tag  my_cpu
 
-    outputs:
-        - name: stdout
-          match: '*'
+[OUTPUT]
+  Name  stdout
+  Match *
 ```
+
 {% endtab %}
-{% endtabs %}
+{% endtabs %}
\ No newline at end of file
diff --git a/pipeline/inputs/disk-io-metrics.md b/pipeline/inputs/disk-io-metrics.md
index 024399314..11310cac9 100644
--- a/pipeline/inputs/disk-io-metrics.md
+++ b/pipeline/inputs/disk-io-metrics.md
@@ -1,75 +1,81 @@
-# Disk I/O Metrics
+# Disk I/O metrics
 
-The **disk** input plugin, gathers the information about the disk throughput of the running system every certain interval of time and reports them.
+The _Disk_ input plugin gathers the information about the disk throughput of the running system every certain interval of time and reports them.
 
-The Disk I/O metrics plugin creates metrics that are log-based \(I.e. JSON payload\). If you are looking for Prometheus-based metrics please see the Node Exporter Metrics input plugin. 
+The _Disk I/O metrics_ plugin creates metrics that are log-based, such as JSON payload. For Prometheus-based metrics, see the Node Exporter Metrics input plugin.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-| Interval\_Sec | Polling interval \(seconds\).  | 1 |
-| Interval\_NSec | Polling interval \(nanosecond\). | 0 |
-| Dev\_Name | Device name to limit the target. \(e.g. sda\). If not set, _in\_disk_ gathers information from all of disks and partitions. | all disks |
+| Key             | Description                                                                                                                       | Default   |
+|:----------------|:----------------------------------------------------------------------------------------------------------------------------------|:----------|
+| `Interval_Sec`  | Polling interval (seconds).                                                                                                       | `1`       |
+| `Interval_NSec` | Polling interval (nanosecond).                                                                                                    | `0`       |
+| `Dev_Name`      | Device name to limit the target (for example, `sda`). If not set, `in_disk` gathers information from all of disks and partitions. | all disks |
+| `Threaded`      | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                           | `false`   |
 
-## Getting Started
+## Get started
 
 In order to get disk usage from your system, you can run the plugin from the command line or through the configuration file:
 
-### Command Line
+### Command line
 
-```bash
-$ fluent-bit -i disk -o stdout
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+You can run the plugin from the command line:
 
-[2017/01/28 16:58:16] [ info] [engine] started
+```shell
+fluent-bit -i disk -o stdout
+```
+
+Which returns information like the following:
+
+```text
+...
 [0] disk.0: [1485590297, {"read_size"=>0, "write_size"=>0}]
 [1] disk.0: [1485590298, {"read_size"=>0, "write_size"=>0}]
 [2] disk.0: [1485590299, {"read_size"=>0, "write_size"=>0}]
 [3] disk.0: [1485590300, {"read_size"=>0, "write_size"=>11997184}]
+...
 ```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+In your main configuration file append the following:
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```python
-[INPUT]
-    Name          disk
-    Tag           disk
-    Interval_Sec  1
-    Interval_NSec 0
-[OUTPUT]
-    Name   stdout
-    Match  *
-```
-{% endtab %}
-
 {% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
-    inputs:
-        - name: disk
-          tag: disk
-          interval_sec: 1
-          interval_nsec: 0
-    outputs:
-        - name: stdout
-          match: '*'
+  inputs:
+    - name: disk
+      tag: disk
+      interval_sec: 1
+      interval_nsec: 0
+
+  outputs:
+    - name: stdout
+      match: '*'
 ```
+
 {% endtab %}
-{% endtabs %}
+{% tab title="fluent-bit.conf" %}
 
+```text
+[INPUT]
+  Name          disk
+  Tag           disk
+  Interval_Sec  1
+  Interval_NSec 0
 
-Note: Total interval \(sec\) = Interval\_Sec + \(Interval\_Nsec / 1000000000\).
+[OUTPUT]
+  Name   stdout
+  Match  *
+```
+
+{% endtab %}
+{% endtabs %}
 
-e.g. 1.5s = 1s + 500000000ns
+Total interval (sec) = `Interval_Sec` + `(Interval_Nsec` / 1000000000)
 
+For example: `1.5s` = `1s` + `500000000ns`
diff --git a/pipeline/inputs/docker-events.md b/pipeline/inputs/docker-events.md
index 6e850c1ee..e51ac4330 100644
--- a/pipeline/inputs/docker-events.md
+++ b/pipeline/inputs/docker-events.md
@@ -1,51 +1,57 @@
-# Docker Events
+# Docker events
 
-The **docker events** input plugin uses the docker API to capture server events. A complete list of possible events returned by this plugin can be found [here](https://docs.docker.com/engine/reference/commandline/events/)
+The _Docker events_ input plugin uses the Docker API to capture server events. A complete list of possible events returned by this plugin can be found [in the Docker documentation](https://docs.docker.com/engine/reference/commandline/events/).
 
-## Configuration Parameters
+## Configuration parameters
 
 This plugin supports the following configuration parameters:
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-| Unix\_Path | The docker socket unix path | /var/run/docker.sock |
-| Buffer\_Size | The size of the buffer used to read docker events \(in bytes\) | 8192 |
-| Parser | Specify the name of a parser to interpret the entry as a structured message. | None |
-| Key | When a message is unstructured \(no parser applied\), it's appended as a string under the key name _message_. | message |
-| Reconnect.Retry_limits| The maximum number of retries allowed. The plugin tries to reconnect with docker socket when EOF is detected. | 5 |
-| Reconnect.Retry_interval| The retrying interval. Unit is second. | 1 |
+| Key                        | Description                                                                                                     | Default                |
+|:---------------------------|:----------------------------------------------------------------------------------------------------------------|:-----------------------|
+| `Unix_Path`                | The docker socket Unix path.                                                                                    | `/var/run/docker.sock` |
+| `Buffer_Size`              | The size of the buffer used to read docker events in bytes.                                                     | `8192`                 |
+| `Parser`                   | Specify the name of a parser to interpret the entry as a structured message.                                    | _none_                 |
+| `Key`                      | When a message is unstructured (no parser applied), it's appended as a string under the key name `message`.     | `message`              |
+| `Reconnect.Retry_limits`   | The maximum number of retries allowed. The plugin tries to reconnect with docker socket when `EOF` is detected. | `5`                    |
+| `Reconnect.Retry_interval` | The retry interval in seconds.                                                                                  | `1`                    |
+| `Threaded`                 | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).         | `false`                |
 
-### Command Line
+### Command line
 
-```bash
-$ fluent-bit -i docker_events -o stdout
+You can run this plugin from the command line:
+
+```shell
+fluent-bit -i docker_events -o stdout
 ```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following **Input** & **Output** sections:
+In your main configuration file append the following:
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
+{% tab title="fluent-bit.yaml" %}
+
 ```yaml
-[INPUT]
-    Name   docker_events
+pipeline:
+  inputs:
+    - name: docker_events
 
-[OUTPUT]
-    Name   stdout
-    Match  *
+  outputs:
+    - name: stdout
+      match: '*'
 ```
+
 {% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: docker_events
+```text
+[INPUT]
+  Name   docker_events
 
-    outputs:
-        - name: stdout
-          match: '*'
+[OUTPUT]
+  Name   stdout
+  Match  *
 ```
+
 {% endtab %}
-{% endtabs %}
+{% endtabs %}
\ No newline at end of file
diff --git a/pipeline/inputs/docker-metrics.md b/pipeline/inputs/docker-metrics.md
index 1102e576f..61fb08682 100644
--- a/pipeline/inputs/docker-metrics.md
+++ b/pipeline/inputs/docker-metrics.md
@@ -1,60 +1,57 @@
----
-description: >-
-  The docker input plugin allows you to collect Docker container metrics such as
-  memory usage and CPU consumption.
----
+# Docker metrics
 
-# Docker Metrics
+The _Docker_ input plugin you collect Docker container metrics, including memory usage and CPU consumption.
 
-Content:
-
-* [Configuration Parameters](https://app.gitbook.com/s/-LKKSx-3LBTCtaHbg0gl-887967055/pipeline/inputs/docker.md#configuration-parameters)
-* [Configuration File](https://app.gitbook.com/s/-LKKSx-3LBTCtaHbg0gl-887967055/pipeline/inputs/docker.md#configuration-file)
-
-### Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key          | Description                                     | Default |
-| ------------ | ----------------------------------------------- | ------- |
-| Interval_Sec | Polling interval in seconds                     | 1       |
-| Include      | A space-separated list of containers to include |         |
-| Exclude      | A space-separated list of containers to exclude |         |
+| Key               | Description                                                                                             | Default                      |
+|-------------------|---------------------------------------------------------------------------------------------------------|------------------------------|
+| `Interval_Sec`    | Polling interval in seconds                                                                             | `1`                          |
+| `Include`         | A space-separated list of containers to include.                                                        | _none_                       |
+| `Exclude`         | A space-separated list of containers to exclude.                                                        | _none_                       |
+| `Threaded`        | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs). | `false`                      |
+| `path.containers` | Used to specify the container directory if Docker is configured with a custom `data-root` directory.    | `/var/lib/docker/containers` |
 
-If you set neither `Include` nor `Exclude`, the plugin will try to get metrics from _all_ the running containers.
+If you set neither `Include` nor `Exclude`, the plugin will try to get metrics from all running containers.
 
-### Configuration File
+## Configuration file
 
-Here is an example configuration that collects metrics from two docker instances (`6bab19c3a0f9` and `14159be4ca2c`).
+The following example configuration collects metrics from two docker instances (`6bab19c3a0f9` and `14159be4ca2c`).
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```python
-[INPUT]
-    Name         docker
-    Include      6bab19c3a0f9 14159be4ca2c
-[OUTPUT]
-    Name   stdout
-    Match  *
-```
-{% endtab %}
-
 {% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
-    inputs:
-        - name: docker
-          include: 6bab19c3a0f9 14159be4ca2c
+  inputs:
+    - name: docker
+      include: 6bab19c3a0f9 14159be4ca2c
 
-    outputs:
-        - name: stdout
-          match: '*'
+  outputs:
+    - name: stdout
+      match: '*'
 ```
+
 {% endtab %}
-{% endtabs %}
+{% tab title="fluent-bit.conf" %}
 
-This configuration will produce records like below.
+```text
+[INPUT]
+  Name         docker
+  Include      6bab19c3a0f9 14159be4ca2c
 
+[OUTPUT]
+  Name   stdout
+  Match  *
 ```
+
+{% endtab %}
+{% endtabs %}
+
+This configuration will produce records like the following:
+
+```text
 [1] docker.0: [1571994772.00555745, {"id"=>"6bab19c3a0f9", "name"=>"postgresql", "cpu_used"=>172102435, "mem_used"=>5693400, "mem_limit"=>4294963200}]
 ```
diff --git a/pipeline/inputs/dummy.md b/pipeline/inputs/dummy.md
index 745bacaa2..a886994cc 100644
--- a/pipeline/inputs/dummy.md
+++ b/pipeline/inputs/dummy.md
@@ -1,68 +1,76 @@
 # Dummy
 
-The **dummy** input plugin, generates dummy events. It is useful for testing, debugging, benchmarking and getting started with Fluent Bit.
+The _Dummy_ input plugin generates dummy events. Use this plugin for testing, debugging, benchmarking and getting started with Fluent Bit.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description |
-| :--- | :--- |
-| Dummy | Dummy JSON record. Default: `{"message":"dummy"}` |
-| Metadata | Dummy JSON metadata. Default: `{}` |
-| Start\_time\_sec | Dummy base timestamp in seconds. Default: 0 |
-| Start\_time\_nsec | Dummy base timestamp in nanoseconds. Default: 0 |
-| Rate | Rate at which messages are generated expressed in how many times per second. Default: 1 |
-| Interval\_sec  | Set seconds of time interval at which every message is generated. If set, `Rate` configuration will be ignored. Default: 0 |
-| Interval\_nsec | Set nanoseconds of time interval at which every message is generated. If set, `Rate` configuration will be ignored. Default: 0 |
-| Samples | If set, the events number will be limited. e.g. If Samples=3, the plugin only generates three events and stops. |
-| Copies | Number of messages to generate each time they are generated. Defaults to 1. |
-| Flush\_on\_startup | If set to `true`, the first dummy event is generated at startup. Default: `false` |
-
-## Getting Started
+| Key                | Description                                                                                                             | Default               |
+|:-------------------|:------------------------------------------------------------------------------------------------------------------------|:----------------------|
+| `Dummy`            | Dummy JSON record.                                                                                                      | `{"message":"dummy"}` |
+| `Metadata`         | Dummy JSON metadata.                                                                                                    | `{}`                  |
+| `Start_time_sec`   | Dummy base timestamp, in seconds.                                                                                       | `0`                   |
+| `Start_time_nsec`  | Dummy base timestamp, in nanoseconds.                                                                                   | `0`                   |
+| `Rate`             | Rate at which messages are generated expressed in how many times per second.                                            | `1`                   |
+| `Interval_sec`     | Set time interval, in seconds, at which every message is generated. If set, `Rate` configuration is ignored.            | `0`                   |
+| `Interval_nsec`    | Set time interval, in nanoseconds, at which every message is generated. If set, `Rate` configuration is ignored.        | `0`                   |
+| `Samples`          | If set, the events number will be limited. For example, if Samples=3, the plugin generates only three events and stops. | _none_                |
+| `Copies`           | Number of messages to generate each time messages generate.                                                             | `1`                   |
+| `Flush_on_startup` | If set to `true`, the first dummy event is generated at startup.                                                        | `false`               |
+| `Threaded`         | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                 | `false`               |
+
+## Get started
 
 You can run the plugin from the command line or through the configuration file:
 
-### Command Line
+### Command line
+
+Run the plugin from the command line using the following command:
+
+```shell
+fluent-bit -i dummy -o stdout
+```
 
-```bash
-$ fluent-bit -i dummy -o stdout
-Fluent Bit v2.x.x
-* Copyright (C) 2015-2022 The Fluent Bit Authors
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+which returns results like the following:
 
+```text
+...
 [0] dummy.0: [[1686451466.659962491, {}], {"message"=>"dummy"}]
 [0] dummy.0: [[1686451467.659679509, {}], {"message"=>"dummy"}]
+...
 ```
 
-### Configuration File
-
-In your main configuration file append the following _Input_ & _Output_ sections:
+### Configuration file
 
+In your main configuration file append the following:
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```text
-[INPUT]
-    Name   dummy
-    Dummy {"message": "custom dummy"}
-
-[OUTPUT]
-    Name   stdout
-    Match  *
-```
-{% endtab %}
-
 {% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
   inputs:
     - name: dummy
       dummy: '{"message": "custom dummy"}'
+
   outputs:
     - name: stdout
       match: '*'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[INPUT]
+  Name   dummy
+  Dummy {"message": "custom dummy"}
+
+[OUTPUT]
+  Name   stdout
+  Match  *
+```
+
 {% endtab %}
 {% endtabs %}
diff --git a/pipeline/inputs/ebpf.md b/pipeline/inputs/ebpf.md
new file mode 100644
index 000000000..8ef357c17
--- /dev/null
+++ b/pipeline/inputs/ebpf.md
@@ -0,0 +1,105 @@
+# eBPF
+
+{% hint style="info" %}
+This plugin is experimental and might be unstable. Use it in development or testing environments only. Its features and behavior are subject to change.
+{% endhint %}
+
+The `in_ebpf` input plugin uses eBPF (extended Berkeley Packet Filter) to capture low-level system events. This plugin lets Fluent Bit monitor kernel-level activities such as process executions, file accesses, memory allocations, network connections, and signal handling. It provides valuable insights into system behavior for debugging, monitoring, and security analysis.
+
+The `in_ebpf` plugin leverages eBPF to trace kernel events in real-time. By specifying trace points, users can collect targeted system-level metrics and events, giving visibility into operating system interactions and performance characteristics.
+
+## System dependencies
+
+To enable `in_ebpf`, ensure the following dependencies are installed on your system:
+
+- **Kernel version**: 4.18 or greater, with eBPF support enabled.
+- **Required packages**:
+  - `bpftool`: Used to manage and debug eBPF programs.
+  - `libbpf-dev`: Provides the `libbpf` library for loading and interacting with eBPF programs.
+  - **CMake** 3.13 or higher: Required for building the plugin.
+
+### Installing dependencies on Ubuntu
+
+```shell
+sudo apt update
+sudo apt install libbpf-dev linux-tools-common cmake
+```
+
+## Building Fluent Bit with `in_ebpf`
+
+To enable the `in_ebpf` plugin, follow these steps to build Fluent Bit from source:
+
+1. Clone the Fluent Bit repository:
+
+   ```shell
+   git clone https://github.com/fluent/fluent-bit.git
+   cd fluent-bit
+   ```
+
+1. Configure the build with `in_ebpf`:
+
+   Create a build directory and run `cmake` with the `-DFLB_IN_EBPF=On` flag to enable the `in_ebpf` plugin:
+
+   ```shell
+   mkdir build
+   cd build
+   cmake .. -DFLB_IN_EBPF=On
+   ```
+
+1. Compile the source:
+
+   ```shell
+   make
+   ```
+
+1. Run Fluent Bit:
+
+   Run Fluent Bit with elevated permissions (for example, `sudo`). Loading eBPF programs requires root access or appropriate privileges.
+
+   ```shell
+   # For YAML configuration.
+   sudo fluent-bit --config fluent-bit.yaml
+
+   # For classic configuration.
+   sudo fluent-bit --config fluent-bit.conf
+   ```
+
+## Configuration example
+
+Here's a basic example of how to configure the plugin:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: ebpf
+      trace:
+        - trace_signal
+        - trace_malloc
+        - trace_bind
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[INPUT]
+  Name          ebpf
+  Trace         trace_signal
+  Trace         trace_malloc
+  Trace         trace_bind
+```
+
+{% endtab %}
+{% endtabs %}
+
+The configuration enables tracing for:
+
+- Signal handling events (`trace_signal`)
+- Memory allocation events (`trace_malloc`)
+- Network bind operations (`trace_bind`)
+
+You can enable multiple traces by adding multiple `Trace` directives in your configuration.
+Full list of existing traces can be seen here: [Fluent Bit eBPF Traces](https://github.com/fluent/fluent-bit/tree/master/plugins/in_ebpf/traces)
diff --git a/pipeline/inputs/elasticsearch.md b/pipeline/inputs/elasticsearch.md
index 27f659095..8dfa7d3f6 100644
--- a/pipeline/inputs/elasticsearch.md
+++ b/pipeline/inputs/elasticsearch.md
@@ -1,113 +1,116 @@
-# Elasticsearch (Bulk API)
+# Elasticsearch
 
-The **elasticsearch** input plugin handles both Elasticsearch and OpenSearch Bulk API requests.
+The _Elasticsearch_ input plugin handles both Elasticsearch and OpenSearch Bulk API requests.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description | Default value |
-| :--- | :--- | :--- |
-| buffer\_max\_size | Set the maximum size of buffer. | 4M |
-| buffer\_chunk\_size | Set the buffer chunk size. | 512K |
-| tag\_key | Specify a key name for extracting as a tag. | `NULL` |
-| meta\_key | Specify a key name for meta information. | "@meta" |
-| hostname | Specify hostname or FQDN. This parameter can be used for "sniffing" (auto-discovery of) cluster node information. | "localhost" |
-| version  | Specify Elasticsearch server version. This parameter is effective for checking a version of Elasticsearch/OpenSearch server version. | "8.0.0" |
+| Key                 | Description                                                                                                                              | Default value |
+|:--------------------|:-----------------------------------------------------------------------------------------------------------------------------------------|:--------------|
+| `buffer_max_size`   | Set the maximum size of buffer.                                                                                                          | `4M`          |
+| `buffer_chunk_size` | Set the buffer chunk size.                                                                                                               | `512K`        |
+| `tag_key`           | Specify a key name for extracting as a tag.                                                                                              | `NULL`        |
+| `meta_key`          | Specify a key name for meta information.                                                                                                 | `@meta`       |
+| `hostname`          | Specify hostname or fully qualified domain name. This parameter can be used for "sniffing" (auto-discovery of) cluster node information. | `localhost`   |
+| `version`           | Specify Elasticsearch server version. This parameter is effective for checking a version of Elasticsearch/OpenSearch server version.     | `8.0.0`       |
+| `threaded`          | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                                  | `false`       |
 
-**Note:** The Elasticsearch cluster uses "sniffing" to optimize the connections between its cluster and clients.
-Elasticsearch can build its cluster and dynamically generate a connection list which is called "sniffing".
-The `hostname` will be used for sniffing information and this is handled by the sniffing endpoint.
+The Elasticsearch cluster uses "sniffing" to optimize the connections between its cluster and clients, which means it builds its cluster and dynamically generate a connection list. The `hostname` will be used for sniffing information and this is handled by the sniffing endpoint.
 
-## Getting Started
+## Get started
 
 In order to start performing the checks, you can run the plugin from the command line or through the configuration file:
 
-### Command Line
+### Command line
 
 From the command line you can configure Fluent Bit to handle Bulk API requests with the following options:
 
-```bash
-$ fluent-bit -i elasticsearch -p port=9200 -o stdout
+```shell
+fluent-bit -i elasticsearch -p port=9200 -o stdout
 ```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+In your configuration file append the following:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: elasticsearch
+      listen: 0.0.0.0
+      port: 9200
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    name elasticsearch
-    listen 0.0.0.0
-    port 9200
+  name   elasticsearch
+  listen 0.0.0.0
+  port   9200
 
 [OUTPUT]
-    name stdout
-    match *
+  name  stdout
+  match *
 ```
+
 {% endtab %}
+{% endtabs %}
 
+As described previously, the plugin will handle ingested Bulk API requests. For large bulk ingestion, you might have to increase buffer size using the `buffer_max_size` and `buffer_chunk_size` parameters:
+
+{% tabs %}
 {% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
-    inputs:
-        - name: elasticsearch
-          listen: 0.0.0.0
-          port: 9200
-
-    outputs:
-        - name: stdout
-          match: '*'
+  inputs:
+    - name: elasticsearch
+      listen: 0.0.0.0
+      port: 9200
+      buffer_max_size: 20M
+      buffer_chunk_size: 5M
+
+  outputs:
+    - name: stdout
+      match: '*'
 ```
-{% endtab %}
-{% endtabs %}
-
-As described above, the plugin will handle ingested Bulk API requests.
-For large bulk ingestions, you may have to increase buffer size with **buffer_max_size** and **buffer_chunk_size** parameters:
 
-{% tabs %}
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    name elasticsearch
-    listen 0.0.0.0
-    port 9200
-    buffer_max_size 20M
-    buffer_chunk_size 5M
+  name              elasticsearch
+  listen            0.0.0.0
+  port              9200
+  buffer_max_size   20M
+  buffer_chunk_size 5M
 
 [OUTPUT]
-    name stdout
-    match *
+  name  stdout
+  match *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: elasticsearch
-          listen: 0.0.0.0
-          port: 9200
-          buffer_max_size: 20M
-          buffer_chunk_size: 5M
-
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
 #### Ingesting from beats series
 
-Ingesting from beats series agents is also supported.
-For example, [Filebeats](https://www.elastic.co/beats/filebeat), [Metricbeat](https://www.elastic.co/beats/metricbeat), and [Winlogbeat](https://www.elastic.co/beats/winlogbeat) are able to ingest their collected data through this plugin.
+Ingesting from beats series agents is also supported. For example, [Filebeats](https://www.elastic.co/beats/filebeat), [Metricbeat](https://www.elastic.co/beats/metricbeat), and [Winlogbeat](https://www.elastic.co/beats/winlogbeat) are able to ingest their collected data through this plugin.
 
-Note that Fluent Bit's node information is returning as Elasticsearch 8.0.0.
+The Fluent Bit node information is returning as Elasticsearch 8.0.0.
 
-So, users have to specify the following configurations on their beats configurations:
+Users must specify the following configurations on their beats configurations:
 
 ```yaml
 output.elasticsearch:
@@ -115,10 +118,7 @@ output.elasticsearch:
   ilm: false
 ```
 
-For large log ingestion on these beat plugins,
-users might have to configure rate limiting on those beats plugins
-when Fluent Bit indicates that the application is exceeding the size limit for HTTP requests:
-
+For large log ingestion on these beat plugins, users might have to configure rate limiting on those beats plugins when Fluent Bit indicates that the application is exceeding the size limit for HTTP requests:
 
 ```yaml
 processors:
diff --git a/pipeline/inputs/exec-wasi.md b/pipeline/inputs/exec-wasi.md
index b094f3a01..d8e7992ee 100644
--- a/pipeline/inputs/exec-wasi.md
+++ b/pipeline/inputs/exec-wasi.md
@@ -1,32 +1,49 @@
-# Exec Wasi
+# Exec WASI
 
-The **exec_wasi** input plugin, allows to execute WASM program that is WASI target like as external program and collects event logs from there.
+The _Exec WASI_ input plugin lets you execute Wasm programs that are WASI targets like external programs and collect event logs from there.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description |
-| :--- | :--- |
-| WASI\_Path | The place of a WASM program file. |
-| Parser | Specify the name of a parser to interpret the entry as a structured message. |
-| Accessible\_Paths | Specify the whilelist of paths to be able to access paths from WASM programs. |
-| Interval\_Sec | Polling interval \(seconds\). |
-| Interval\_NSec | Polling interval \(nanosecond\). |
-| Buf\_Size | Size of the buffer \(check [unit sizes](https://docs.fluentbit.io/manual/configuration/unit_sizes) for allowed values\) |
-| Oneshot | Only run once at startup. This allows collection of data precedent to fluent-bit's startup (bool, default: false) |
+| Key                | Description                                                                                                                                  |
+|:-------------------|:---------------------------------------------------------------------------------------------------------------------------------------------|
+| `WASI_Path`        | The location of a Wasm program file.                                                                                                         |
+| `Parser`           | Specify the name of a parser to interpret the entry as a structured message.                                                                 |
+| `Accessible_Paths` | Specify the allowed list of paths to be able to access paths from Wasm programs.                                                             |
+| `Interval_Sec`     | Polling interval (seconds).                                                                                                                  |
+| `Interval_NSec`    | Polling interval (nanosecond).                                                                                                               |
+| `Wasm_Heap_Size`   | Size of the heap size of Wasm execution. Review [unit sizes](../../administration/configuring-fluent-bit/unit-sizes.md) for allowed values.  |
+| `Wasm_Stack_Size`  | Size of the stack size of Wasm execution. Review [unit sizes](../../administration/configuring-fluent-bit/unit-sizes.md) for allowed values. |
+| `Buf_Size`         | Size of the buffer See [unit sizes](../../administration/configuring-fluent-bit/unit-sizes.md) for allowed values.                           |
+| `Oneshot`          | Only run once at startup. This allows collection of data precedent to the Fluent Bit startup (Boolean, default: `false`).                    |
+| `Threaded`         | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs). Default: `false`.                    |
 
-## Configuration Examples
+## Configuration examples
 
 Here is a configuration example.
-in\_exec\_wasi can handle parser.
-To retrieve from structured data from WASM program, you have to create parser.conf:
 
-Note that `Time_Format` should be aligned for the format of your using timestamp.
-In this documents, we assume that WASM program should write JSON style strings into stdout.
+`in_exec_wasi` can handle parsers. To retrieve from structured data from a Wasm program, you must create a `parser.conf`:
 
+The `Time_Format` should be aligned for the format of your using timestamp.
 
-```python
+This example assumes the Wasm program writes JSON style strings to `stdout`.
+
+{% tabs %}
+{% tab title="parsers.yaml" %}
+
+```yaml
+parsers:
+    - name: wasi
+      format: json
+      time_key: time
+      time_format: '%Y-%m-%dT%H:%M:%S.%L %z'
+```
+
+{% endtab %}
+{% tab title="parsers.conf" %}
+
+```text
 [PARSER]
     Name        wasi
     Format      json
@@ -34,9 +51,41 @@ In this documents, we assume that WASM program should write JSON style strings i
     Time_Format %Y-%m-%dT%H:%M:%S.%L %z
 ```
 
-Then, you can specify the above parsers.conf in the main fluent-bit configuration:
+{% endtab %}
+{% endtabs %}
+
+Then, you can specify the `parsers.conf` in the main Fluent Bit configuration:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-```python
+```yaml
+service:
+    flush: 1
+    daemon: off
+    parsers_file: parsers.yaml
+    log_level: info
+    http_server: off
+    http_listen: 0.0.0.0
+    http_port: 2020
+
+pipeline:
+    inputs:
+      - name: exec_wasi
+        tag: exec.wasi.local
+        wasi_path: /path/to/wasi/program.wasm
+        # Note: run from the 'wasi_path' location.
+        accessible_paths: /path/to/accessible
+
+    outputs:
+        - name: stdout
+          match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [SERVICE]
     Flush        1
     Daemon       Off
@@ -58,3 +107,6 @@ Then, you can specify the above parsers.conf in the main fluent-bit configuratio
     Match *
 
 ```
+
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/inputs/exec.md b/pipeline/inputs/exec.md
index 2f7a32416..10896d6e4 100644
--- a/pipeline/inputs/exec.md
+++ b/pipeline/inputs/exec.md
@@ -1,48 +1,51 @@
 # Exec
 
-The **exec** input plugin, allows to execute external program and collects event logs.
+The _Exec_ input plugin lets you execute external programs and collects event logs.
 
-**WARNING**: Because this plugin invokes commands via a shell, its inputs are
-subject to shell metacharacter substitution. Careless use of untrusted input in
-command arguments could lead to malicious command execution.
+{% hint style="warning" %}
+
+This plugin invokes commands using a shell. Its inputs are subject to shell metacharacter substitution. Careless use of untrusted input in command arguments could lead to malicious command execution.
+
+{% endhint %}
 
 ## Container support
 
-This plugin will not function in all the distroless production images as it needs a functional `/bin/sh` which is not present.
-The debug images use the same binaries so even though they have a shell, there is no support for this plugin as it is compiled out.
+This plugin needs a functional `/bin/sh` and won't function in all the distro-less production images.
+
+The debug images use the same binaries so even though they have a shell, there is no support for this plugin as it's compiled out.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description |
-| :--- | :--- |
-| Command | The command to execute, passed to [popen(...)](https://man7.org/linux/man-pages/man3/popen.3.html) without any additional escaping or processing. May include pipelines, redirection, command-substitution, etc. |
-| Parser | Specify the name of a parser to interpret the entry as a structured message. |
-| Interval\_Sec | Polling interval \(seconds\). |
-| Interval\_NSec | Polling interval \(nanosecond\). |
-| Buf\_Size | Size of the buffer \(check [unit sizes](https://docs.fluentbit.io/manual/configuration/unit_sizes) for allowed values\) |
-| Oneshot | Only run once at startup. This allows collection of data precedent to fluent-bit's startup (bool, default: false) |
-| Exit\_After\_Oneshot | Exit as soon as the one-shot command exits. This allows the exec plugin to be used as a wrapper for another command, sending the target command's output to any fluent-bit sink(s) then exiting. (bool, default: false) |
-| Propagate\_Exit\_Code | When exiting due to Exit\_After\_Oneshot, cause fluent-bit to exit with the exit code of the command exited by this plugin. Follows [shell conventions for exit code propagation](https://www.gnu.org/software/bash/manual/html_node/Exit-Status.html). (bool, default: false) |
+| Key                   | Description                                                                                                                                                                                                                                                                          |
+|:----------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `Command`             | The command to execute, passed to [popen](https://man7.org/linux/man-pages/man3/popen.3.html) without any additional escaping or processing. Can include pipelines, redirection, command-substitution, or other information.                                                         |
+| `Parser`              | Specify the name of a parser to interpret the entry as a structured message.                                                                                                                                                                                                         |
+| `Interval_Sec`        | Polling interval (seconds).                                                                                                                                                                                                                                                          |
+| `Interval_NSec`       | Polling interval (nanosecond).                                                                                                                                                                                                                                                       |
+| `Buf_Size`            | Size of the buffer. See [unit sizes](../../administration/configuring-fluent-bit/unit-sizes.md) for allowed values.                                                                                                                                                                  |
+| `Oneshot`             | Only run once at startup. This allows collection of data precedent to Fluent Bit startup (Boolean, default: `false`).                                                                                                                                                                |
+| `Exit_After_Oneshot`  | Exit as soon as the one-shot command exits. This allows the `exec` plugin to be used as a wrapper for another command, sending the target command's output to any Fluent Bit sink, then exits. (Boolean, default: `false`).                                                          |
+| `Propagate_Exit_Code` | When exiting due to `Exit_After_Oneshot`, cause Fluent Bit to exit with the exit code of the command exited by this plugin. Follows [shell conventions for exit code propagation](https://www.gnu.org/software/bash/manual/html_node/Exit-Status.html). (Boolean, default: `false`). |
+| `Threaded`            | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs). Default: `false`.                                                                                                                                                            |
 
-## Getting Started
+## Get started
 
 You can run the plugin from the command line or through the configuration file:
 
-### Command Line
+### Command line
 
 The following example will read events from the output of _ls_.
 
-```bash
-$ fluent-bit -i exec -p 'command=ls /var/log' -o stdout
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+```shell
+fluent-bit -i exec -p 'command=ls /var/log' -o stdout
+```
+
+which should return something like the following:
 
-[2018/03/21 17:46:49] [ info] [engine] started
+```text
+...
 [0] exec.0: [1521622010.013470159, {"exec"=>"ConsoleKit"}]
 [1] exec.0: [1521622010.013490313, {"exec"=>"Xorg.0.log"}]
 [2] exec.0: [1521622010.013492079, {"exec"=>"Xorg.0.log.old"}]
@@ -50,92 +53,99 @@ Fluent Bit v1.x.x
 [4] exec.0: [1521622010.013494707, {"exec"=>"anaconda.log"}]
 [5] exec.0: [1521622010.013496016, {"exec"=>"anaconda.program.log"}]
 [6] exec.0: [1521622010.013497225, {"exec"=>"anaconda.storage.log"}]
+...
 ```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+In your main configuration file append the following:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: exec
+      tag: exec_ls
+      command: ls /var/log
+      interval_sec: 1
+      interval_nsec: 0
+      buf_size: 8mb
+      oneshot: false
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name          exec
-    Tag           exec_ls
-    Command       ls /var/log
-    Interval_Sec  1
-    Interval_NSec 0
-    Buf_Size      8mb
-    Oneshot       false
+  Name          exec
+  Tag           exec_ls
+  Command       ls /var/log
+  Interval_Sec  1
+  Interval_NSec 0
+  Buf_Size      8mb
+  Oneshot       false
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: exec
-          tag: exec_ls
-          command: ls /var/log
-          interval_sec: 1
-          interval_nsec: 0
-          buf_size: 8mb
-          oneshot: false
-
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
 ## Use as a command wrapper
 
-To use `fluent-bit` with the `exec` plugin to wrap another command, use the
-`Exit_After_Oneshot` and `Propagate_Exit_Code` options, e.g.:
+To use Fluent Bit with the `exec` plugin to wrap another command, use the `Exit_After_Oneshot` and `Propagate_Exit_Code` options:
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: exec
+      tag: exec_oneshot_demo
+      command: 'for s in $(seq 1 10); do echo "count: $s"; sleep 1; done; exit 1'
+      oneshot: true
+      exit_after_oneshot: true
+      propagate_exit_code: true
+
+  outputs:
+    - name: stdout
+      match: '*'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name                exec
-    Tag                 exec_oneshot_demo
-    Command             for s in $(seq 1 10); do echo "count: $s"; sleep 1; done; exit 1
-    Oneshot             true
-    Exit_After_Oneshot  true
-    Propagate_Exit_Code true
+  Name                exec
+  Tag                 exec_oneshot_demo
+  Command             for s in $(seq 1 10); do echo "count: $s"; sleep 1; done; exit 1
+  Oneshot             true
+  Exit_After_Oneshot  true
+  Propagate_Exit_Code true
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: exec
-          tag: exec_oneshot_demo
-          command: 'for s in $(seq 1 10); do echo "count: $s"; sleep 1; done; exit 1'
-          oneshot: true
-          exit_after_oneshot: true
-          propagate_exit_code: true
-
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
-`fluent-bit` will output
+Fluent Bit will output:
 
-```
+```text
+...
 [0] exec_oneshot_demo: [[1681702172.950574027, {}], {"exec"=>"count: 1"}]
 [1] exec_oneshot_demo: [[1681702173.951663666, {}], {"exec"=>"count: 2"}]
 [2] exec_oneshot_demo: [[1681702174.953873724, {}], {"exec"=>"count: 3"}]
@@ -146,32 +156,28 @@ pipeline:
 [7] exec_oneshot_demo: [[1681702179.961715745, {}], {"exec"=>"count: 8"}]
 [8] exec_oneshot_demo: [[1681702180.963924140, {}], {"exec"=>"count: 9"}]
 [9] exec_oneshot_demo: [[1681702181.965852990, {}], {"exec"=>"count: 10"}]
+...
 ```
 
-then exit with exit code 1.
+then exits with exit code 1.
 
-Translation of command exit code(s) to `fluent-bit` exit code follows
-[the usual shell rules for exit code handling](https://www.gnu.org/software/bash/manual/html_node/Exit-Status.html).
-Like with a shell, there is no way to differentiate between the command exiting
-on a signal and the shell exiting on a signal, and no way to differentiate
-between normal exits with codes greater than 125 and abnormal or signal exits
-reported by fluent-bit or the shell. Wrapped commands should use exit codes
-between 0 and 125 inclusive to allow reliable identification of normal exit.
-If the command is a pipeline, the exit code will be the exit code of the last
-command in the pipeline unless overridden by shell options.
+Translation of command exit codes to Fluent Bit exit code follows [the usual shell rules for exit code handling](https://www.gnu.org/software/bash/manual/html_node/Exit-Status.html). Like with a shell, there is no way to differentiate between the command exiting on a signal and the shell exiting on a signal. Similarly, there is no way to differentiate between normal exits with codes greater than `125` and abnormal or signal exits reported by Fluent Bit or the shell. Wrapped commands should use exit codes between `0` and `125` inclusive to allow reliable identification of normal exit. If the command is a pipeline, the exit code will be the exit code of the last command in the pipeline unless overridden by shell options.
 
 ### Parsing command output
 
-By default the `exec` plugin emits one message per command output line, with a
-single field `exec` containing the full message. Use the `Parser` directive to
-specify the name of a parser configuration to use to process the command input.
+By default, the `exec` plugin emits one message per command output line, with a single field `exec` containing the full message. Use the `Parser` directive to specify the name of a parser configuration to use to process the command input.
 
 ### Security concerns
 
-**Take great care with shell quoting and escaping when wrapping commands**.
-A script like
+{% hint style="warning" %}
 
-```bash
+Take great care with shell quoting and escaping when wrapping commands.
+
+{% endhint %}
+
+A script like the following can ruin your day if someone passes it the argument `$(rm -rf /my/important/files; echo "deleted your stuff!")'`
+
+```shell
 #!/bin/bash
 # This is a DANGEROUS example of what NOT to do, NEVER DO THIS
 exec fluent-bit \
@@ -182,14 +188,10 @@ exec fluent-bit \
   -p command='myscript $*'
 ```
 
-can ruin your day if someone passes it the argument
-`$(rm -rf /my/important/files; echo "deleted your stuff!")'`
-
-The above script would be safer if written with:
+The previous script would be safer if written with:
 
-```bash
+```shell
   -p command='echo '"$(printf '%q' "$@")" \
 ```
 
-... but it's generally best to avoid dynamically generating the command or
-handling untrusted arguments to it at all.
+It's generally best to avoid dynamically generating the command or handling untrusted arguments.
diff --git a/pipeline/inputs/fluentbit-metrics.md b/pipeline/inputs/fluentbit-metrics.md
index 9ef8c604e..4424780c1 100644
--- a/pipeline/inputs/fluentbit-metrics.md
+++ b/pipeline/inputs/fluentbit-metrics.md
@@ -1,34 +1,56 @@
 ---
-description: >-
-  A plugin to collect Fluent Bit's own metrics
+description:  A plugin to collect Fluent Bit metrics
 ---
 
-# Fluent Bit Metrics
+# Fluent Bit metrics
 
-Fluent Bit exposes its [own metrics](../../administration/monitoring.md) to allow you to monitor the internals of your pipeline.
-The collected metrics can be processed similarly to those from the [Prometheus Node Exporter input plugin](node-exporter-metrics.md).
-They can be sent to output plugins including [Prometheus Exporter](../outputs/prometheus-exporter.md), [Prometheus Remote Write](../outputs/prometheus-remote-write.md) or  [OpenTelemetry](../outputs/opentelemetry.md)..
+Fluent Bit exposes [metrics](../../administration/monitoring.md) to let you monitor the internals of your pipeline. The collected metrics can be processed similarly to those from the [Prometheus Node Exporter input plugin](node-exporter-metrics.md). They can be sent to output plugins including [Prometheus Exporter](../outputs/prometheus-exporter.md), [Prometheus Remote Write](../outputs/prometheus-remote-write.md) or [OpenTelemetry](../outputs/opentelemetry.md).
 
-**Important note:** Metrics collected with Node Exporter Metrics flow through a separate pipeline from logs and current filters do not operate on top of metrics.
+{% hint style="info" %}
 
+Metrics collected with Node Exporter Metrics flow through a separate pipeline from logs and current filters don't operate on top of metrics.
 
-## Configuration 
+{% endhint %}
 
-| Key             | Description                                                                                               | Default   |
-| --------------- | --------------------------------------------------------------------------------------------------------- | --------- |
-| scrape_interval | The rate at which metrics are collected from the host operating system                                    | 2 seconds |
-| scrape_on_start | Scrape metrics upon start, useful to avoid waiting for 'scrape_interval' for the first round of metrics.  | false     |
+## Configuration
 
+| Key               | Description                                                                                             | Default     |
+|-------------------|---------------------------------------------------------------------------------------------------------|-------------|
+| `scrape_interval` | The rate at which metrics are collected from the host operating system.                                 | `2` seconds |
+| `scrape_on_start` | Scrape metrics upon start, use to avoid waiting for `scrape_interval` for the first round of metrics.   | `false`     |
+| `threaded`        | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs). | `false`     |
 
-## Getting Started
+## Get started
 
-### Simple Configuration File
+### Configuration file
 
-In the following configuration file, the input plugin _node_exporter_metrics collects _metrics every 2 seconds and exposes them through our [Prometheus Exporter](../outputs/prometheus-exporter.md) output plugin on HTTP/TCP port 2021.
+In the following configuration file, the input plugin `node_exporter_metrics` collects metrics every `2` seconds and exposes them through the [Prometheus Exporter](../outputs/prometheus-exporter.md) output plugin on HTTP/TCP port `2021`.
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+    
+pipeline:
+  inputs:
+    - name: fluentbit_metrics
+      tag: internal_metrics
+      scrape_interval: 2
+
+  outputs:
+    - name: prometheus_exporter
+      match: internal_metrics
+      host: 0.0.0.0
+      port: 2021
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 # Fluent Bit Metrics + Prometheus Exporter
 # -------------------------------------------
 # The following example collects Fluent Bit metrics and exposes
@@ -39,45 +61,26 @@ In the following configuration file, the input plugin _node_exporter_metrics col
 # $ curl http://127.0.0.1:2021/metrics
 #
 [SERVICE]
-    flush           1
-    log_level       info
+  flush           1
+  log_level       info
 
 [INPUT]
-    name            fluentbit_metrics
-    tag             internal_metrics
-    scrape_interval 2
+  name            fluentbit_metrics
+  tag             internal_metrics
+  scrape_interval 2
 
 [OUTPUT]
-    name            prometheus_exporter
-    match           internal_metrics
-    host            0.0.0.0
-    port            2021
-
+  name            prometheus_exporter
+  match           internal_metrics
+  host            0.0.0.0
+  port            2021
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-service:
-    flush: 1
-    log_level: info
-pipeline:
-    inputs:
-        - name: fluentbit_metrics
-          tag: internal_metrics
-          scrape_interval: 2
-
-    outputs:
-        - name: prometheus_exporter
-          match: internal_metrics
-          host: 0.0.0.0
-          port: 2021
-```
 {% endtab %}
 {% endtabs %}
 
-You can test the expose of the metrics by using _curl:_
+You can test the expose of the metrics by using `curl`:
 
-```bash
+```shell
 curl http://127.0.0.1:2021/metrics
-```
+```
\ No newline at end of file
diff --git a/pipeline/inputs/forward.md b/pipeline/inputs/forward.md
index 2878f5b8b..581ccdc46 100644
--- a/pipeline/inputs/forward.md
+++ b/pipeline/inputs/forward.md
@@ -1,145 +1,153 @@
 # Forward
 
-_Forward_ is the protocol used by [Fluent Bit](http://fluentbit.io) and [Fluentd](http://www.fluentd.org) to route messages between peers.
-This plugin implements the input service to listen for Forward messages.
+_Forward_ is the protocol used by [Fluent Bit](http://fluentbit.io) and [Fluentd](http://www.fluentd.org) to route messages between peers. This plugin implements the input service to listen for Forward messages.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key                 | Description                                                                                                                                                                                                                                                                                                                                 | Default |
-|:--------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| :--- |
-| Listen              | Listener network interface.                                                                                                                                                                                                                                                                                                                 | 0.0.0.0 |
-| Port                | TCP port to listen for incoming connections.                                                                                                                                                                                                                                                                                                | 24224 |
-| Unix_Path           | Specify the path to unix socket to receive a Forward message. If set, `Listen` and `Port` are ignored.                                                                                                                                                                                                                                      | |
-| Unix_Perm           | Set the permission of the unix socket file. If `Unix_Path` is not set, this parameter is ignored.                                                                                                                                                                                                                                      | |
-| Buffer\_Max\_Size   | Specify the maximum buffer memory size used to receive a Forward message. The value must be according to the [Unit Size](../../administration/configuring-fluent-bit/unit-sizes.md) specification.                                                                                                                                          | 6144000 |
-| Buffer\_Chunk\_Size | By default the buffer to store the incoming Forward messages, do not allocate the maximum memory allowed, instead it allocate memory when is required. The rounds of allocations are set by _Buffer\_Chunk\_Size_. The value must be according to the [Unit Size ](../../administration/configuring-fluent-bit/unit-sizes.md)specification. | 1024000 |
-| Tag_Prefix          | Prefix incoming tag with the defined value.|  |
-| Tag                 | Override the tag of the forwarded events with the defined value.|  |
-| Shared\_Key         | Shared key for secure forward authentication. |  |
-| Self\_Hostname      | Hostname for secure forward authentication.   |  |
-| Security.Users      | Specify the username and password pairs for secure forward authentication. | |
+| Key                 | Description                                                                                                                                                                                                                                                                                                                                | Default   |
+|:--------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:----------|
+| `Listen`            | Listener network interface.                                                                                                                                                                                                                                                                                                                | `0.0.0.0` |
+| `Port`              | TCP port to listen for incoming connections.                                                                                                                                                                                                                                                                                               | `24224`   |
+| `Unix_Path`         | Specify the path to Unix socket to receive a Forward message. If set, `Listen` and `Port` are ignored.                                                                                                                                                                                                                                     | _none_    |
+| `Unix_Perm`         | Set the permission of the Unix socket file. If `Unix_Path` isn't set, this parameter is ignored.                                                                                                                                                                                                                                           | _none_    |
+| `Buffer_Max_Size`   | Specify the maximum buffer memory size used to receive a Forward message. The value must be according to the [Unit Size](../../administration/configuring-fluent-bit/unit-sizes.md) specification.                                                                                                                                         | `6144000` |
+| `Buffer_Chunk_Size` | By default the buffer to store the incoming Forward messages, don't allocate the maximum memory allowed, instead it allocate memory when it's required. The rounds of allocations are set by `Buffer_Chunk_Size`. The value must be according to the [Unit Size ](../../administration/configuring-fluent-bit/unit-sizes.md)specification. | `1024000` |
+| `Tag_Prefix`        | Prefix incoming tag with the defined value.                                                                                                                                                                                                                                                                                                | _none_    |
+| `Tag`               | Override the tag of the forwarded events with the defined value.                                                                                                                                                                                                                                                                           | _none_    |
+| `Shared_Key`        | Shared key for secure forward authentication.                                                                                                                                                                                                                                                                                              | _none_    |
+| `Empty_Shared_Key`  | Use this option to connect to Fluentd with a zero-length shared key.                                                                                                                                                                                                                                                                       | `false`   |
+| `Self_Hostname`     | Hostname for secure forward authentication.                                                                                                                                                                                                                                                                                                | _none_    |
+| `Security.Users`    | Specify the username and password pairs for secure forward authentication.                                                                                                                                                                                                                                                                 |           |
+| `Threaded`          | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                                                                                                                                                                                                                                    | `false`   |
 
-## Getting Started
+## Get started
 
-In order to receive Forward messages, you can run the plugin from the command line or through the configuration file as shown in the following examples.
+To receive Forward messages, you can run the plugin from the command line or through the configuration file as shown in the following examples.
 
-### Command Line
+### Command line
 
-From the command line you can let Fluent Bit listen for _Forward_ messages with the following options:
+From the command line you can let Fluent Bit listen for Forward messages with the following options:
 
-```bash
-$ fluent-bit -i forward -o stdout
+```shell
+fluent-bit -i forward -o stdout
 ```
 
-By default the service will listen an all interfaces \(0.0.0.0\) through TCP port 24224, optionally you can change this directly, e.g:
+By default, the service listens on all interfaces (`0.0.0.0`) through TCP port `24224`. You can change this by passing parameters to the command:
 
-```bash
-$ fluent-bit -i forward -p listen="192.168.3.2" -p port=9090 -o stdout
+```shell
+fluent-bit -i forward -p listen="192.168.3.2" -p port=9090 -o stdout
 ```
 
-In the example the Forward messages will only arrive through network interface under 192.168.3.2 address and TCP Port 9090.
+In the example, the Forward messages arrive only through network interface `192.168.3.2` address and TCP Port `9090`.
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+In your main configuration file append the following:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: forward
+      listen: 0.0.0.0
+      port: 24224
+      buffer_chunk_size: 1M
+      buffer_max_size: 6M
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name              forward
-    Listen            0.0.0.0
-    Port              24224
-    Buffer_Chunk_Size 1M
-    Buffer_Max_Size   6M
+  Name              forward
+  Listen            0.0.0.0
+  Port              24224
+  Buffer_Chunk_Size 1M
+  Buffer_Max_Size   6M
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: forward
-          listen: 0.0.0.0
-          port: 24224
-          buffer_chunk_size: 1M
-          buffer_max_size: 6M
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
-## Fluent Bit + Secure Forward Setup
+## Fluent Bit and secure forward setup
 
-Since Fluent Bit v3, in\_forward can handle secure forward protocol.
+In Fluent Bit v3 or later, `in_forward` can handle secure forward protocol.
 
-For using user-password authentication, it needs to specify `secutiry.users` at least an one-pair.
-For using shared key, it needs to specify `shared_key` in both of forward output and forward input.
-`self_hostname` is not able to specify with the same hostname between fluent servers and clients.
+For using user-password authentication, specify `security.users` in at least a one-pair. For using shared key, specify `shared_key` in both of forward output and forward input. `self_hostname` isn't able to specify with the same hostname between fluent servers and clients.
 
 {% tabs %}
+{% tab title="fluent-bit-secure-forward.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: forward
+      listen: 0.0.0.0
+      port: 24224
+      buffer_chunk_size: 1M
+      buffer_max_size: 6M
+      security.users: fluentbit changeme
+      shared_key: secret
+      self_hostname: flb.server.local
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit-secure-forward.conf" %}
-```python
+
+```text
 [INPUT]
-    Name              forward
-    Listen            0.0.0.0
-    Port              24224
-    Buffer_Chunk_Size 1M
-    Buffer_Max_Size   6M
-    Security.Users fluentbit changeme
-    Shared_Key secret
-    Self_Hostname flb.server.local
+  Name              forward
+  Listen            0.0.0.0
+  Port              24224
+  Buffer_Chunk_Size 1M
+  Buffer_Max_Size   6M
+  Security.Users fluentbit changeme
+  Shared_Key secret
+  Self_Hostname flb.server.local
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit-secure-forward.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: forward
-          listen: 0.0.0.0
-          port: 24224
-          buffer_chunk_size: 1M
-          buffer_max_size: 6M
-          security.users: fluentbit changeme
-          shared_key: secret
-          self_hostname: flb.server.local
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
 ## Testing
 
-Once Fluent Bit is running, you can send some messages using the _fluent-cat_ tool \(this tool is provided by [Fluentd](http://www.fluentd.org):
+After Fluent Bit is running, you can send some messages using the `fluent-cat` tool, provided by [Fluentd](http://www.fluentd.org):
 
-```bash
-$ echo '{"key 1": 123456789, "key 2": "abcdefg"}' | fluent-cat my_tag
+```shell
+echo '{"key 1": 123456789, "key 2": "abcdefg"}' | fluent-cat my_tag
 ```
 
-In [Fluent Bit](http://fluentbit.io) we should see the following output:
+When you run the plugin with the following command:
 
-```bash
-$ bin/fluent-bit -i forward -o stdout
-Fluent-Bit v0.9.0
-Copyright (C) Treasure Data
+```shell
+fluent-bit -i forward -o stdout
+```
+
+In [Fluent Bit](http://fluentbit.io) you should see the following output:
 
-[2016/10/07 21:49:40] [ info] [engine] started
-[2016/10/07 21:49:40] [ info] [in_fw] binding 0.0.0.0:24224
+```text
+...
 [0] my_tag: [1475898594, {"key 1"=>123456789, "key 2"=>"abcdefg"}]
+...
 ```
-
diff --git a/pipeline/inputs/head.md b/pipeline/inputs/head.md
index b5f4496b4..25cac72f1 100644
--- a/pipeline/inputs/head.md
+++ b/pipeline/inputs/head.md
@@ -1,27 +1,28 @@
 # Head
 
-The **head** input plugin, allows to read events from the head of file. It's behavior is similar to the _head_ command.
+The _Head_ input plugin reads events from the head of a file. Its behavior is similar to the `head` command.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description |
-| :--- | :--- |
-| File | Absolute path to the target file, e.g: /proc/uptime |
-| Buf\_Size | Buffer size to read the file. |
-| Interval\_Sec | Polling interval \(seconds\). |
-| Interval\_NSec | Polling interval \(nanosecond\). |
-| Add\_Path | If enabled, filepath is appended to each records. Default value is _false_. |
-| Key | Rename a key. Default: head. |
-| Lines | Line number to read. If the number N is set, in\_head reads first N lines like head\(1\) -n. |
-| Split\_line | If enabled, in\_head generates key-value pair per line. |
+| Key             | Description                                                                                                               |
+|:----------------|:--------------------------------------------------------------------------------------------------------------------------|
+| `File`          | Absolute path to the target file. For example: `/proc/uptime`.                                                            |
+| `Buf_Size`      | Buffer size to read the file.                                                                                             |
+| `Interval_Sec`  | Polling interval (seconds).                                                                                               |
+| `Interval_NSec` | Polling interval (nanoseconds).                                                                                           |
+| `Add_Path`      | If enabled, the path is appended to each records. Default: `false`.                                                       |
+| `Key`           | Rename a key. Default: `head`.                                                                                            |
+| `Lines`         | Line number to read. If the number N is set, `in_head` reads first N lines like `head(1) -n`.                             |
+| `Split_line`    | If enabled, `in_head` generates key-value pair per line.                                                                  |
+| `Threaded`      | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs). Default: `false`. |
 
-### Split Line Mode
+### Split line mode
 
-This mode is useful to get a specific line. This is an example to get CPU frequency from /proc/cpuinfo.
+Use this mode to get a specific line. The following example gets CPU frequency from `/proc/cpuinfo`.
 
-/proc/cpuinfo is a special file to get cpu information.
+`/proc/cpuinfo` is a special file to get CPU information.
 
 ```text
 processor    : 0
@@ -37,11 +38,34 @@ physical id  : 0
 siblings     : 1
 ```
 
-Cpu frequency is "cpu MHz : 2791.009". We can get the line with this configuration file.
+The CPU frequency is `cpu MHz : 2791.009`. The following configuration file gets the needed line:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+    inputs:
+        - name: head
+          tag: head.cpu
+          file: /proc/cpuinfo
+          lines: 8
+          split_line: true
+          
+    filters:
+        - name: record_modifier
+          match: '*'
+          whitelist_key: line7
+          
+    outputs:
+        - name: stdout
+          match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
     Name           head
     Tag            head.cpu
@@ -59,32 +83,19 @@ Cpu frequency is "cpu MHz : 2791.009". We can get the line with this configurati
     Name           stdout
     Match          *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: head
-          tag: head.cpu
-          file: /proc/cpuinfo
-          lines: 8
-          split_line: true
-    filters:
-        - name: record_modifier
-          match: '*'
-          whitelist_key: line7
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
-Output is
+If you run the following command:
 
-```bash
-$ bin/fluent-bit -c head.conf 
+```shell
+fluent-bit -c head.conf
+```
+
+The output is something similar to;
+
+```text
 Fluent Bit v1.x.x
 * Copyright (C) 2019-2020 The Fluent Bit Authors
 * Copyright (C) 2015-2018 Treasure Data
@@ -98,16 +109,21 @@ Fluent Bit v1.x.x
 [3] head.cpu: [1498484308.008447978, {"line7"=>"cpu MHz        : 2791.009"}]
 ```
 
-## Getting Started
+## Get started
+
+To read the head of a file, you can run the plugin from the command line or through the configuration file.
+
+### Command line
 
-In order to read the head of a file, you can run the plugin from the command line or through the configuration file:
+The following example will read events from the `/proc/uptime` file, tag the records with the `uptime` name and flush them back to the `stdout` plugin:
 
-### Command Line
+```shell
+fluent-bit -i head -t uptime -p File=/proc/uptime -o stdout -m '*'
+```
 
-The following example will read events from the /proc/uptime file, tag the records with the _uptime_ name and flush them back to the _stdout_ plugin:
+The output will look similar to:
 
-```bash
-$ fluent-bit -i head -t uptime -p File=/proc/uptime -o stdout -m '*'
+```text
 Fluent Bit v1.x.x
 * Copyright (C) 2019-2020 The Fluent Bit Authors
 * Copyright (C) 2015-2018 Treasure Data
@@ -121,28 +137,13 @@ Fluent Bit v1.x.x
 [3] uptime: [1463543637, {"head"=>"133520.70 194879.72"}]
 ```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+In your main configuration file append the following:
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```python
-[INPUT]
-    Name          head
-    Tag           uptime
-    File          /proc/uptime
-    Buf_Size      256
-    Interval_Sec  1
-    Interval_NSec 0
-
-[OUTPUT]
-    Name   stdout
-    Match  *
-```
-{% endtab %}
-
 {% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
     inputs:
@@ -152,14 +153,34 @@ pipeline:
           buf_size: 256
           interval_sec: 1
           interval_nsec: 0
+          
     outputs:
         - name: stdout
           match: '*'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```shell
+[INPUT]
+    Name          head
+    Tag           uptime
+    File          /proc/uptime
+    Buf_Size      256
+    Interval_Sec  1
+    Interval_NSec 0
+
+[OUTPUT]
+    Name   stdout
+    Match  *
+```
+
 {% endtab %}
 {% endtabs %}
 
-Note: Total interval \(sec\) = Interval\_Sec + \(Interval\_Nsec / 1000000000\).
+The interval is calculated like this:
 
-e.g. 1.5s = 1s + 500000000ns
+`Total interval (sec) = Interval_Sec + (Interval_Nsec / 1000000000)`.
 
+For example: `1.5s = 1s + 500000000ns`.
\ No newline at end of file
diff --git a/pipeline/inputs/health.md b/pipeline/inputs/health.md
index 0e5694338..2501fe80c 100644
--- a/pipeline/inputs/health.md
+++ b/pipeline/inputs/health.md
@@ -1,90 +1,85 @@
 # Health
 
-_Health_ input plugin allows you to check how _healthy_ a TCP server is. It does the check by issuing a TCP connection every a certain interval of time.
+The _Health_ input plugin lets you check how healthy a TCP server is. It checks by issuing a TCP connection at regular intervals.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description |
-| :--- | :--- |
-| Host | Name of the target host or IP address to check. |
-| Port | TCP port where to perform the connection check. |
-| Interval\_Sec | Interval in seconds between the service checks. Default value is _1_. |
-| Internal\_Nsec | Specify a nanoseconds interval for service checks, it works in conjunction with the Interval\_Sec configuration key. Default value is _0_. |
-| Alert | If enabled, it will only generate messages if the target TCP service is down. By default this option is disabled. |
-| Add\_Host | If enabled, hostname is appended to each records. Default value is _false_. |
-| Add\_Port | If enabled, port number is appended to each records. Default value is _false_. |
+| Key             | Description                                                                                                        | Default |
+|:----------------|:-------------------------------------------------------------------------------------------------------------------|:--------|
+| `Host`          | Name of the target host or IP address.                                                                             | _none_  |
+| `Port`          | TCP port where to perform the connection request.                                                                  | _none_  |
+| `Interval_Sec`  | Interval in seconds between the service checks.                                                                    | `1`     |
+| `Internal_Nsec` | Specify a nanoseconds interval for service checks. Works in conjunction with the `Interval_Sec` configuration key. | `0`     |
+| `Alert`         | If enabled, it generates messages if the target TCP service is down.                                               | `false` |
+| `Add_Host`      | If enabled, hostname is appended to each records.                                                                  | `false` |
+| `Add_Port`      | If enabled, port number is appended to each records.                                                               | `false` |
+| `Threaded`      | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).            | `false` |
 
-## Getting Started
+## Get started
 
-In order to start performing the checks, you can run the plugin from the command line or through the configuration file:
+To start performing the checks, you can run the plugin from the command line or through the configuration file:
 
-### Command Line
+### Command line
 
 From the command line you can let Fluent Bit generate the checks with the following options:
 
-```bash
-$ fluent-bit -i health -p host=127.0.0.1 -p port=80 -o stdout
+```shell
+fluent-bit -i health -p host=127.0.0.1 -p port=80 -o stdout
 ```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+In your main configuration file append the following:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: health
+      host: 127.0.0.1
+      port: 80
+      interval_sec: 1
+      interval_nsec: 0
+      
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name          health
-    Host          127.0.0.1
-    Port          80
-    Interval_Sec  1
-    Interval_NSec 0
+  Name          health
+  Host          127.0.0.1
+  Port          80
+  Interval_Sec  1
+  Interval_NSec 0
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: health
-          host: 127.0.0.1
-          port: 80
-          interval_sec: 1
-          interval_nsec: 0
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
-
 ## Testing
 
 Once Fluent Bit is running, you will see some random values in the output interface similar to this:
 
-```bash
+```shell
 $ fluent-bit -i health -p host=127.0.0.1 -p port=80 -o stdout
-Fluent Bit v1.8.0
-* Copyright (C) 2019-2021 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
-
-[2021/06/20 08:39:47] [ info] [engine] started (pid=4621)
-[2021/06/20 08:39:47] [ info] [storage] version=1.1.1, initializing...
-[2021/06/20 08:39:47] [ info] [storage] in-memory
-[2021/06/20 08:39:47] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128
-[2021/06/20 08:39:47] [ info] [sp] stream processor started
+
+...
 [0] health.0: [1624145988.305640385, {"alive"=>true}]
 [1] health.0: [1624145989.305575360, {"alive"=>true}]
 [2] health.0: [1624145990.306498573, {"alive"=>true}]
 [3] health.0: [1624145991.305595498, {"alive"=>true}]
-```
-
+...
+```
\ No newline at end of file
diff --git a/pipeline/inputs/http.md b/pipeline/inputs/http.md
index 2e8afc5aa..ff5877279 100644
--- a/pipeline/inputs/http.md
+++ b/pipeline/inputs/http.md
@@ -1,221 +1,236 @@
----
-description: The HTTP input plugin allows you to send custom records to an HTTP endpoint.
----
 
 # HTTP
 
-## Configuration Parameters
+The _HTTP_ input plugin lets Fluent Bit open an HTTP port that you can then route data to in a dynamic way.
 
-| **Key**                  | Description                                                                                                                                   | default |
-|--------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------|---------|
-| listen                   | The address to listen on                                                                                                                      | 0.0.0.0 |
-| port                     | The port for Fluent Bit to listen on                                                                                                          | 9880    |
-| tag_key                  | Specify the key name to overwrite a tag. If set, the tag will be overwritten by a value of the key.                                           |         |
-| buffer_max_size          | Specify the maximum buffer size in KB to receive a JSON message.                                                                              | 4M      |
-| buffer_chunk_size        | This sets the chunk size for incoming incoming JSON messages. These chunks are then stored/managed in the space available by buffer_max_size. | 512K    |
-| successful_response_code | It allows to set successful response code. `200`, `201` and `204` are supported.                                                              | 201     |
-| success_header           | Add an HTTP header key/value pair on success. Multiple headers can be set. Example: `X-Custom custom-answer`                                  |         |
+## Configuration parameters
+
+| Key                        | Description                                                                                                                                | Default   |
+|----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------|-----------|
+| `listen`                   | The address to listen on.                                                                                                                  | `0.0.0.0` |
+| `port`                     | The port for Fluent Bit to listen on.                                                                                                      | `9880`    |
+| `tag_key`                  | Specify the key name to overwrite a tag. If set, the tag will be overwritten by a value of the key.                                        | _none_    |
+| `buffer_max_size`          | Specify the maximum buffer size in KB to receive a JSON message.                                                                           | `4M`      |
+| `buffer_chunk_size`        | This sets the chunk size for incoming JSON messages. These chunks are then stored and managed in the space available by `buffer_max_size`. | `512K`    |
+| `successful_response_code` | Allows setting successful response code. Supported values: `200`, `201`, and `204`                                                         | `201`     |
+| `success_header`           | Add an HTTP header key/value pair on success. Multiple headers can be set. For example, `X-Custom custom-answer`                           | _none_    |
+| `threaded`                 | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                                    | `false`   |
 
 ### TLS / SSL
 
-HTTP input plugin supports TLS/SSL, for more details about the properties available and general configuration, please refer to the [Transport Security](../../administration/transport-security.md) section.
+HTTP input plugin supports TLS/SSL. For more details about the properties available and general configuration, refer to [Transport Security](../../administration/transport-security.md).
 
 ### gzipped content
 
-The HTTP input plugin will accept and automatically handle gzipped content as of v2.2.1 as long as the header `Content-Encoding: gzip` is set on the received data.
+The HTTP input plugin will accept and automatically handle gzipped content in version 2.2.1 or later if the header `Content-Encoding: gzip` is set on the received data.
 
-## Getting Started
+## Get started
 
-The http input plugin allows Fluent Bit to open up an HTTP port that you can then route data to in a dynamic way. This plugin supports dynamic tags which allow you to send data with different tags through the same input. An example video and curl message can be seen below
+This plugin supports dynamic tags which let you send data with different tags through the same input. See the following for an example:
 
 [Link to video](https://asciinema.org/a/375571)
 
-#### How to set tag
+### Set a tag
 
 The tag for the HTTP input plugin is set by adding the tag to the end of the request URL. This tag is then used to route the event through the system.
-For example, in the following curl message below the tag set is `app.log**. **` because the end end path is `/app_log`:
 
-### Curl request
+For example, in the following curl message the tag set is `app.log**. **` because the end path is `/app_log`:
 
-```
+```shell
 curl -d '{"key1":"value1","key2":"value2"}' -XPOST -H "content-type: application/json" http://localhost:8888/app.log
 ```
 
-### Configuration File
+### Configuration file
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: http
+      listen: 0.0.0.0
+      port: 8888
+
+  outputs:
+    - name: stdout
+      match: app.log
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    name http
-    listen 0.0.0.0
-    port 8888
+  name http
+  listen 0.0.0.0
+  port 8888
 
 [OUTPUT]
-    name stdout
-    match app.log
+  name stdout
+  match app.log
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: http
-          listen: 0.0.0.0
-          port: 8888
-    outputs:
-        - name: stdout
-          match: app.log
-```
 {% endtab %}
 {% endtabs %}
 
-If you do not set the tag `http.0` is automatically used. If you have multiple HTTP inputs then they will follow a pattern of `http.N` where N is an integer representing the input.
+### Configuration file `http.0` example
 
-### Curl request
+If you don't set the tag, `http.0` is automatically used. If you have multiple HTTP inputs then they will follow a pattern of `http.N` where `N` is an integer representing the input.
 
-```
+```shell
 curl -d '{"key1":"value1","key2":"value2"}' -XPOST -H "content-type: application/json" http://localhost:8888
 ```
 
-### Configuration File
-
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: http
+      listen: 0.0.0.0
+      port: 8888
+
+  outputs:
+    - name: stdout
+      match: http.0
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    name http
-    listen 0.0.0.0
-    port 8888
+  name http
+  listen 0.0.0.0
+  port 8888
 
 [OUTPUT]
-    name  stdout
-    match  http.0
+  name  stdout
+  match  http.0
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: http
-          listen: 0.0.0.0
-          port: 8888
-    outputs:
-        - name: stdout
-          match: http.0
-```
 {% endtab %}
 {% endtabs %}
 
-#### How to set tag_key
+#### Set `tag_key`
 
-The tag_key configuration option allows to specify the key name that will be used to overwrite a tag. The tag's value will be replaced with the value associated with the specified key. For example, setting tag_key to "custom_tag" and the log event contains a json field with the key "custom_tag" Fluent Bit will use the value of that field as the new tag for routing the event through the system.
+The `tag_key` configuration option lets you specify the key name that will be used to overwrite a tag. The tag's value will be replaced with the value associated with the specified key. For example, setting `tag_key` to `custom_tag` and the log event contains a JSON field with the key `custom_tag`. Fluent Bit will use the value of that field as the new tag for routing the event through the system.
 
 ### Curl request
 
-```
+```shell
 curl -d '{"key1":"value1","key2":"value2"}' -XPOST -H "content-type: application/json" http://localhost:8888/app.log
 ```
 
-### Configuration File
-
+### Configuration file `tag_key` example
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: http
+      listen: 0.0.0.0
+      port: 8888
+      tag_key: key1
+
+  outputs:
+    - name: stdout
+      match: value1
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    name http
-    listen 0.0.0.0
-    port 8888
-    tag_key key1
+  name http
+  listen 0.0.0.0
+  port 8888
+  tag_key key1
 
 [OUTPUT]
-    name stdout
-    match value1
+  name stdout
+  match value1
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: http
-          listen: 0.0.0.0
-          port: 8888
-          tag_key: key1
-    outputs:
-        - name: stdout
-          match: value1
-```
 {% endtab %}
 {% endtabs %}
 
-#### How to set multiple custom HTTP header on success
+#### Set multiple custom HTTP headers on success
 
-The `success_header` parameter allows to set multiple HTTP headers on success. The format is:
+The `success_header` parameter lets you set multiple HTTP headers on success. The format is:
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```ini
-[INPUT]
-    name http
-    success_header X-Custom custom-answer
-    success_header X-Another another-answer
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: http
+      success_header:
+        - X-Custom custom-answer
+        - X-Another another-answer
 ```
+
 {% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-    inputs:
-        - name: http
-          success_header: X-Custom custom-answer
-          success_header: X-Another another-answer
+```text
+[INPUT]
+  name http
+  success_header X-Custom custom-answer
+  success_header X-Another another-answer
 ```
+
 {% endtab %}
 {% endtabs %}
 
+#### Example curl message
 
-#### Example Curl message
-
-```
+```shell
 curl -d @app.log -XPOST -H "content-type: application/json" http://localhost:8888/app.log
 ```
 
-### Configuration File
+### Configuration file example 3
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: http
+      listen: 0.0.0.0
+      port: 8888
+
+  outputs:
+    - name: stdout
+      match: '*'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    name http
-    listen 0.0.0.0
-    port 8888
+  name http
+  listen 0.0.0.0
+  port 8888
 
 [OUTPUT]
-    name stdout
-    match *
+  name stdout
+  match *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: http
-          listen: 0.0.0.0
-          port: 8888
-
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
-### Command Line
+### Command line
 
-```
-$> fluent-bit -i http -p port=8888 -o stdout
+```shell
+ fluent-bit -i http -p port=8888 -o stdout
 ```
diff --git a/pipeline/inputs/kafka.md b/pipeline/inputs/kafka.md
index e779b6f07..8aa5c4e67 100644
--- a/pipeline/inputs/kafka.md
+++ b/pipeline/inputs/kafka.md
@@ -1,77 +1,206 @@
 # Kafka
 
-The Kafka input plugin allows subscribing to one or more Kafka topics to collect messages from an [Apache Kafka](https://kafka.apache.org/) service.
-This plugin uses the official [librdkafka C library](https://github.com/edenhill/librdkafka) \(built-in dependency\).
+The _Kafka_ input plugin enables Fluent Bit to consume messages directly from one or more [Apache Kafka](https://kafka.apache.org/) topics. By subscribing to specified topics, this plugin efficiently collects and forwards Kafka messages for further processing within your Fluent Bit pipeline.
 
-## Configuration Parameters
+Starting with version 4.0.4, the Kafka input plugin supports authentication with AWS MSK IAM, enabling integration with Amazon MSK (Managed Streaming for Apache Kafka) clusters that require IAM-based access.
 
-| Key | Description | default |
-| :--- | :--- | :--- |
-| brokers | Single or multiple list of Kafka Brokers, e.g: 192.168.1.3:9092, 192.168.1.4:9092. |  |
-| topics | Single entry or list of topics separated by comma \(,\) that Fluent Bit will subscribe to. |  |
-| format | Serialization format of the messages. If set to "json", the payload will be parsed as json. | none  |
-| client\_id | Client id passed to librdkafka. | |
-| group\_id | Group id passed to librdkafka. | fluent-bit |
-| poll\_ms | Kafka brokers polling interval in milliseconds. | 500 |
-| Buffer\_Max\_Size | Specify the maximum size of buffer per cycle to poll kafka messages from subscribed topics. To increase throughput, specify larger size. | 4M |
-| poll\_ms | Kafka brokers polling interval in milliseconds. | 500 |
-| rdkafka.{property} | `{property}` can be any [librdkafka properties](https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md) |  |
+This plugin uses the official [librdkafka C library](https://github.com/edenhill/librdkafka) as a built-in dependency.
 
-## Getting Started
+## Configuration parameters
 
-In order to subscribe/collect messages from Apache Kafka, you can run the plugin from the command line or through the configuration file:
+| Key                  | Description                                                                                                                              | default      |
+|:---------------------|:-----------------------------------------------------------------------------------------------------------------------------------------|:-------------|
+| `brokers`            | Single or multiple list of Kafka Brokers. For example: `192.168.1.3:9092`, `192.168.1.4:9092`.                                           | _none_       |
+| `topics`             | Single entry or list of comma-separated topics (`,`) that Fluent Bit will subscribe to.                                                  | _none_       |
+| `format`             | Serialization format of the messages. If set to `json`, the payload will be parsed as JSON.                                              | _none_       |
+| `client_id`          | Client id passed to librdkafka.                                                                                                          | _none_       |
+| `group_id`           | Group id passed to librdkafka.                                                                                                           | `fluent-bit` |
+| `poll_ms`            | Kafka brokers polling interval in milliseconds.                                                                                          | `500`        |
+| `Buffer_Max_Size`    | Specify the maximum size of buffer per cycle to poll Kafka messages from subscribed topics. To increase throughput, specify larger size. | `4M`         |
+| `rdkafka.{property}` | `{property}` can be any [librdkafka properties](https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md)                     | _none_       |
+| `threaded`           | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                                  | `false`      |
 
-### Command Line
+## Get started
 
-The **kafka** plugin can read parameters through the **-p** argument \(property\), e.g:
+To subscribe to or collect messages from Apache Kafka, run the plugin from the command line or through the configuration file as shown in the following examples.
 
-```text
-$ fluent-bit -i kafka -o stdout -p brokers=192.168.1.3:9092 -p topics=some-topic
+### Command line
+
+The Kafka plugin can read parameters through the `-p` argument (property):
+
+```shell
+fluent-bit -i kafka -o stdout -p brokers=192.168.1.3:9092 -p topics=some-topic
 ```
 
-### Configuration File
+### Configuration file (recommended)
+
+In your main configuration file append the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: kafka
+      brokers: 192.168.1.3:9092
+      topics: some-topic
+      poll_ms: 100
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name        kafka
-    Brokers     192.168.1.3:9092
-    Topics      some-topic
-    poll_ms     100
+  Name        kafka
+  Brokers     192.168.1.3:9092
+  Topics      some-topic
+  poll_ms     100
 
 [OUTPUT]
-    Name        stdout
+  Name        stdout
+  Match       *
 ```
 
-#### Example of using kafka input/output plugins
+{% endtab %}
+{% endtabs %}
 
-The fluent-bit source repository contains a full example of using fluent-bit to process kafka records: 
+#### Example of using Kafka input and output plugins
+
+The Fluent Bit source repository contains a full example of using Fluent Bit to process Kafka records:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: kafka
+      brokers: kafka-broker:9092
+      topics: fb-source
+      poll_ms: 100
+      format: json
+
+  filters:
+    - name: lua
+      match: '*'
+      script: kafka.lua
+      call: modify_kafka_message
+
+  outputs:
+    - name: kafka
+      brokers: kafka-broker:9092
+      topics: fb-sink
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name kafka
-    brokers kafka-broker:9092
-    topics fb-source
-    poll_ms 100
-    format json
+  Name kafka
+  brokers kafka-broker:9092
+  topics fb-source
+  poll_ms 100
+  format json
 
 [FILTER]
-    Name    lua
-    Match   *
-    script  kafka.lua
-    call    modify_kafka_message
+  Name    lua
+  Match   *
+  script  kafka.lua
+  call    modify_kafka_message
 
 [OUTPUT]
-    Name kafka
-    brokers kafka-broker:9092
-    topics fb-sink
+  Name kafka
+  brokers kafka-broker:9092
+  topics fb-sink
 ```
 
-The above will connect to the broker listening on `kafka-broker:9092` and subscribe to the `fb-source` topic, polling for new messages every 100 milliseconds.
+{% endtab %}
+{% endtabs %}
+
+The previous example will connect to the broker listening on `kafka-broker:9092` and subscribe to the `fb-source` topic, polling for new messages every 100 milliseconds.
 
-Since the payload will be in json format, we ask the plugin to automatically parse the payload with `format json`.
+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.
 
-The example can be executed locally with `make start` in the `examples/kafka_filter` directory (docker/compose is used).
+The example can be executed locally with `make start` in the `examples/kafka_filter` directory (`docker/compose` is used).
+
+## AWS MSK IAM authentication
+
+Fluent Bit v4.0.4 and later supports authentication to Amazon MSK (Managed Streaming for Apache Kafka) clusters using AWS IAM. This lets you securely connect to MSK brokers with AWS credentials, leveraging IAM roles and policies for access control.
+
+### Build requirements
+
+If you are compiling Fluent Bit from source, ensure the following requirements are met to enable AWS MSK IAM support:
+
+- The packages `libsasl2` and `libsasl2-dev` must be installed on your build environment.
+
+### Runtime requirements
+
+- **Network Access:** Fluent Bit must be able to reach your MSK broker endpoints (AWS VPC setup).
+- **AWS Credentials:** Provide these AWS credentials using any supported AWS method. These credentials are discovered by default when `aws_msk_iam` flag is enabled.
+  - IAM roles (recommended for EC2, ECS, or EKS)
+  - Environment variables (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`)
+  - AWS credentials file (`~/.aws/credentials`)
+  - Instance metadata service (IMDS)
+- **IAM Permissions:** The credentials must allow access to the target MSK cluster, as shown in the following example policy.
+
+### Configuration parameters [#config-aws]
+
+| Property | Description | Required |
+| -------- | ----------- | -------- |
+| `aws_msk_iam` | If `true`, enables AWS MSK IAM authentication. Possible values: `true`, `false`. | `false` |
+| `aws_msk_iam_cluster_arn` | Full ARN of the MSK cluster for region extraction. This value is required if `aws_msk_iam` is `true`. | _none_ |
+
+### Configuration example
+
+```yaml
+pipeline:
+  inputs:
+    - name: kafka
+      brokers: my-cluster.abcdef.c1.kafka.us-east-1.amazonaws.com:9098
+      topics: my-topic
+      aws_msk_iam: true
+      aws_msk_iam_cluster_arn: arn:aws:kafka:us-east-1:123456789012:cluster/my-cluster/abcdef-1234-5678-9012-abcdefghijkl-s3
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+### Example AWS IAM policy
+
+{% hint style="info" %}
+
+IAM policies and permissions can be complex and might vary depending on your organization's security requirements. If you are unsure about the correct permissions or best practices, consult your AWS administrator or an AWS expert who is familiar with MSK and IAM security.
+
+{% endhint %}
+
+The AWS credentials used by Fluent Bit must have permission to connect to your MSK cluster. Here is a minimal example policy:
+
+```json
+{
+  "Version": "2012-10-17",
+  "Statement": [
+    {
+      "Sid": "VisualEditor0",
+      "Effect": "Allow",
+      "Action": [
+        "kafka-cluster:*",
+        "kafka-cluster:DescribeCluster",
+        "kafka-cluster:ReadData",
+        "kafka-cluster:DescribeTopic",
+        "kafka-cluster:Connect"
+      ],
+      "Resource": "*"
+    }
+  ]
+}
+```
diff --git a/pipeline/inputs/kernel-logs.md b/pipeline/inputs/kernel-logs.md
index 7fa9cf143..accc1317d 100644
--- a/pipeline/inputs/kernel-logs.md
+++ b/pipeline/inputs/kernel-logs.md
@@ -1,27 +1,28 @@
-# Kernel Logs
+# Kernel logs
 
-The **kmsg** input plugin reads the Linux Kernel log buffer since the beginning, it gets every record and parse it field as priority, sequence, seconds, useconds, and message.
+The _Kernel logs_ (`kmsg`) input plugin reads the Linux Kernel log buffer from the beginning. It gets every record and parses fields as `priority`, `sequence`, `seconds`, `useconds`, and `message`.
 
-## Configuration Parameters
+## Configuration parameters
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-| Prio_Level | The log level to filter. The kernel log is dropped if its priority is more than prio_level. Allowed values are 0-8. Default is 8. 8 means all logs are saved. | 8 |
+| Key          | Description                                                                                                                                             | Default |
+|:-------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------|:--------|
+| `Prio_Level` | The log level to filter. The kernel log is dropped if its priority is more than `prio_level`. Allowed values are `0`-`8`. `8` means all logs are saved. | `8`     |
+| `Threaded`   | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                                                 | `false` |
 
-## Getting Started
+## Get started
 
-In order to start getting the Linux Kernel messages, you can run the plugin from the command line or through the configuration file:
+To start getting the Linux Kernel messages, you can run the plugin from the command line or through the configuration file:
 
-### Command Line
+### Command line
 
-```bash
-$ bin/fluent-bit -i kmsg -t kernel -o stdout -m '*'
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+```shell
+fluent-bit -i kmsg -t kernel -o stdout -m '*'
+```
+
+Which returns output similar to:
 
+```text
+...
 [0] kernel: [1463421823, {"priority"=>3, "sequence"=>1814, "sec"=>11706, "usec"=>732233, "msg"=>"ERROR @wl_cfg80211_get_station : Wrong Mac address, mac = 34:a8:4e:d3:40:ec profile =20:3a:07:9e:4a:ac"}]
 [1] kernel: [1463421823, {"priority"=>3, "sequence"=>1815, "sec"=>11706, "usec"=>732300, "msg"=>"ERROR @wl_cfg80211_get_station : Wrong Mac address, mac = 34:a8:4e:d3:40:ec profile =20:3a:07:9e:4a:ac"}]
 [2] kernel: [1463421829, {"priority"=>3, "sequence"=>1816, "sec"=>11712, "usec"=>729728, "msg"=>"ERROR @wl_cfg80211_get_station : Wrong Mac address, mac = 34:a8:4e:d3:40:ec profile =20:3a:07:9e:4a:ac"}]
@@ -29,35 +30,38 @@ Fluent Bit v1.x.x
 ...
 ```
 
-As described above, the plugin processed all messages that the Linux Kernel reported, the output has been truncated for clarification.
+As described previously, the plugin processed all messages that the Linux Kernel reported. The output has been truncated for clarification.
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+In your main configuration file append the following:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: kmsg
+      tag: kernel
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name   kmsg
-    Tag    kernel
+  Name   kmsg
+  Tag    kernel
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: kmsg
-          tag: kernel
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
-
diff --git a/pipeline/inputs/kubernetes-events.md b/pipeline/inputs/kubernetes-events.md
index 164c4eb60..ad49ad2ba 100644
--- a/pipeline/inputs/kubernetes-events.md
+++ b/pipeline/inputs/kubernetes-events.md
@@ -1,53 +1,93 @@
 ---
-description: >-
-  Collects Kubernetes Events
+description: Collect Kubernetes events
 ---
 
-# Kubernetes Events
+# Kubernetes events
 
-Kubernetes exports it events through the API server. This input plugin allows to retrieve those events as logs and get them processed through the pipeline.
+Kubernetes exports events through the API server. This input plugin lets you retrieve those events as logs and process them through the pipeline.
 
 ## Configuration
 
 
-| Key                 | Description                                                                           | Default                                              |
-|---------------------|---------------------------------------------------------------------------------------|------------------------------------------------------|
-| db                  | Set a database file to keep track of recorded Kubernetes events                       |                                                      |
-| db.sync             | Set a database sync method. values: extra, full, normal and off                       | normal                                               |
-| interval_sec        | Set the polling interval for each channel.                                            | 0                                                    |
-| interval_nsec       | Set the polling interval for each channel (sub seconds: nanoseconds)                  | 500000000                                            | 
-| kube_url            | API Server end-point                                                                  | https://kubernetes.default.svc                       |
-| kube_ca_file        | Kubernetes TLS CA file                                                                | /var/run/secrets/kubernetes.io/serviceaccount/ca.crt |
-| kube_ca_path        | Kubernetes TLS ca path                                                                |                                                      |
-| kube_token_file     | Kubernetes authorization token file.                                                  | /var/run/secrets/kubernetes.io/serviceaccount/token  |
-| kube_token_ttl      | kubernetes token ttl, until it is reread from the token file.                         | 10m                                                  |
-| kube_request_limit  | kubernetes limit parameter for events query, no limit applied when set to 0.          | 0                                                    |
-| kube_retention_time | Kubernetes retention time for events.                                                 | 1h                                                   |
-| kube_namespace      | Kubernetes namespace to query events from. Gets events from all namespaces by default |                                                      |
-| tls.debug           | Debug level between 0 (nothing) and 4 (every detail).                                 | 0                                                    |
-| tls.verify          | Enable or disable verification of TLS peer certificate.                               | On                                                   |
-| tls.vhost           | Set optional TLS virtual host.                                                        |                                                      |
+| Key                   | Description                                                                    | Default                                                |
+|-----------------------|--------------------------------------------------------------------------------|--------------------------------------------------------|
+| `db`                  | Set a database file to keep track of recorded Kubernetes events.               | _none_                                                 |
+| `db.sync`             | Set a database sync method. Accepted values: `extra`, `full`, `normal`, `off`. | `normal`                                               |
+| `interval_sec`        | Set the reconnect interval (seconds).                                          | `0`                                                    |
+| `interval_nsec`       | Set the reconnect interval (sub seconds: nanoseconds).                         | `500000000`                                            |
+| `kube_url`            | API Server endpoint.                                                           | `https://kubernetes.default.svc`                       |
+| `kube_ca_file`        | Kubernetes TLS CA file.                                                        | `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt` |
+| `kube_ca_path`        | Kubernetes TLS ca path.                                                        | _none_                                                 |
+| `kube_token_file`     | Kubernetes authorization token file.                                           | `/var/run/secrets/kubernetes.io/serviceaccount/token`  |
+| `kube_token_ttl`      | Kubernetes token time to live, until it's read again from the token file.      | `10m`                                                  |
+| `kube_request_limit`  | Kubernetes limit parameter for events query, no limit applied when set to `0`. | `0`                                                    |
+| `kube_retention_time` | Kubernetes retention time for events.                                          | `1h`                                                   |
+| `kube_namespace`      | Kubernetes namespace to query events from.                                     | `all`                                                  |
+| `tls.debug`           | Debug level between `0` (nothing) and `4` (every detail).                      | `0`                                                    |
+| `tls.verify`          | Enable or disable verification of TLS peer certificate.                        | `On`                                                   |
+| `tls.vhost`           | Set optional TLS virtual host.                                                 | _none_                                                 |
 
-## Getting Started
+In Fluent Bit 3.1 or later, this plugin uses a Kubernetes watch stream instead of polling. In versions earlier than 3.1, the interval parameters are used for reconnecting the Kubernetes watch stream.
 
-### Simple Configuration File
+## Threading
 
-In the following configuration file, the input plugin *kubernetes_events* collects events every 5 seconds (default for *interval_nsec*) and exposes them through the [standard output plugin](../outputs/standard-output.md) on the console.
+This input always runs in its own [thread](../../administration/multithreading.md#inputs).
+
+## Get started
+
+### Kubernetes service account
+
+The Kubernetes service account used by Fluent Bit must have `get`, `list`, and `watch` permissions to `namespaces` and `pods` for the namespaces watched in the `kube_namespace` configuration parameter. If you're using the Helm chart to configure Fluent Bit, this role is included.
+
+### Basic configuration file
+
+In the following configuration file, the Kubernetes events plugin collects events every `5` seconds (default for `interval_nsec`) and exposes them through the [standard output plugin](../outputs/standard-output.md) on the console:
+
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+    
+pipeline:
+  inputs:
+    - name: kubernetes_events
+      tag: k8s_events
+      kube_url: https://kubernetes.default.svc
+      
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [SERVICE]
-flush           1
-log_level       info
+  flush           1
+  log_level       info
 
 [INPUT]
-name            kubernetes_events
-tag             k8s_events
-kube_url        https://kubernetes.default.svc
+  name            kubernetes_events
+  tag             k8s_events
+  kube_url        https://kubernetes.default.svc
 
 [OUTPUT]
-name            stdout
-match           *
+  name            stdout
+  match           *
 ```
 
-### Event Timestamp
-Event timestamp will be created from the first existing field in the following order of precendence: lastTimestamp, firstTimestamp, metadata.creationTimestamp
+{% endtab %}
+{% endtabs %}
+
+### Event timestamp
+
+Event timestamps are created from the first existing field, based on the following order of precedence:
+
+1. `lastTimestamp`
+2. `firstTimestamp`
+3. `metadata.creationTimestamp`
\ No newline at end of file
diff --git a/pipeline/inputs/memory-metrics.md b/pipeline/inputs/memory-metrics.md
index 0f380c614..e59662622 100644
--- a/pipeline/inputs/memory-metrics.md
+++ b/pipeline/inputs/memory-metrics.md
@@ -1,54 +1,65 @@
-# Memory Metrics
+# Memory metrics
 
-The **mem** input plugin, gathers the information about the memory and swap usage of the running system every certain interval of time and reports the total amount of memory and the amount of free available.
+The  _Memory_ (`mem`) input plugin gathers information about the memory and swap usage of the running system every certain interval of time and reports the total amount of memory and the amount of free available.
 
-## Getting Started
+## Get started
 
-In order to get memory and swap usage from your system, you can run the plugin from the command line or through the configuration file:
+To get memory and swap usage from your system, you can run the plugin from the command line or through the configuration file:
 
-### Command Line
+### Command line
 
-```bash
-$ fluent-bit -i mem -t memory -o stdout -m '*'
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+Run the following command from the command line, noting this is for a Linux machine:
 
-[2017/03/03 21:12:35] [ info] [engine] started
-[0] memory: [1488543156, {"Mem.total"=>1016044, "Mem.used"=>841388, "Mem.free"=>174656, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]
-[1] memory: [1488543157, {"Mem.total"=>1016044, "Mem.used"=>841420, "Mem.free"=>174624, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]
-[2] memory: [1488543158, {"Mem.total"=>1016044, "Mem.used"=>841420, "Mem.free"=>174624, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]
-[3] memory: [1488543159, {"Mem.total"=>1016044, "Mem.used"=>841420, "Mem.free"=>174624, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]
+```shell
+fluent-bit -i mem -t memory -o stdout -m '*'
 ```
 
-### Configuration File
+Which outputs information similar to:
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+```text
+...
+[0] memory: [[1751381087.225589224, {}], {"Mem.total"=>3986708, "Mem.used"=>560708, "Mem.free"=>3426000, "Swap.total"=>0, "Swap.used"=>0, "Swap.free"=>0}]
+[0] memory: [[1751381088.228411537, {}], {"Mem.total"=>3986708, "Mem.used"=>560708, "Mem.free"=>3426000, "Swap.total"=>0, "Swap.used"=>0, "Swap.free"=>0}]
+[0] memory: [[1751381089.225600084, {}], {"Mem.total"=>3986708, "Mem.used"=>561480, "Mem.free"=>3425228, "Swap.total"=>0, "Swap.used"=>0, "Swap.free"=>0}]
+[0] memory: [[1751381090.228345064, {}], {"Mem.total"=>3986708, "Mem.used"=>561480, "Mem.free"=>3425228, "Swap.total"=>0, "Swap.used"=>0, "Swap.free"=>0}]
+...
+```
+
+## Threading
+
+You can enable the `threaded` setting to run this input in its own
+[thread](../../administration/multithreading.md#inputs).
+
+### Configuration file
+
+In your main configuration file append the following:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: mem
+      tag: memory
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name   mem
-    Tag    memory
+  Name   mem
+  Tag    memory
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: mem
-          tag: memory
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
-{% endtabs %}
+{% endtabs %}
\ No newline at end of file
diff --git a/pipeline/inputs/mqtt.md b/pipeline/inputs/mqtt.md
index 5ed4295fc..e005ad2a6 100644
--- a/pipeline/inputs/mqtt.md
+++ b/pipeline/inputs/mqtt.md
@@ -1,56 +1,80 @@
 # MQTT
 
-The **MQTT** input plugin, allows to retrieve messages/data from MQTT control packets over a TCP connection. The incoming data to receive _must_ be a JSON map.
+The _MQTT_ input plugin retrieves messages and data from MQTT control packets over a TCP connection. The incoming data to receive must be a JSON map.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description |
-| :--- | :--- |
-| Listen | Listener network interface, default: 0.0.0.0 |
-| Port | TCP port where listening for connections, default: 1883 |
-| Payload_Key |　Specify the key where the payload key/value will be preserved. |
+| Key           | Description                                                                                             | Default   |
+|:--------------|:--------------------------------------------------------------------------------------------------------|:----------|
+| `Listen`      | Listener network interface.                                                                             | `0.0.0.0` |
+| `Port`        | TCP port where listening for connections.                                                               | `1883`    |
+| `Payload_Key` | Specify the key where the payload key/value will be preserved.                                          | _none_    |
+| `Threaded`    | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs). | `false`   |
 
-## Getting Started
+## Get started
 
-In order to start listening for MQTT messages, you can run the plugin from the command line or through the configuration file:
+To listen for MQTT messages, you can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-Since the **MQTT** input plugin let Fluent Bit behave as a server, we need to dispatch some messages using some MQTT client, in the following example _mosquitto_ tool is being used for the purpose:
+The MQTT input plugin lets Fluent Bit behave as a server. Dispatch some messages using a MQTT client. In the following example, the `mosquitto` tool is being used for the purpose:
 
-```bash
-$ fluent-bit -i mqtt -t data -o stdout -m '*'
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+Running the following command:
 
-[2016/05/20 14:22:52] [ info] starting engine
+```shell
+fluent-bit -i mqtt -t data -o stdout -m '*'
+```
+
+Returns a response like the following:
+
+```text
+...
 [0] data: [1463775773, {"topic"=>"some/topic", "key1"=>123, "key2"=>456}]
+...
 ```
 
-The following command line will send a message to the **MQTT** input plugin:
+The following command line will send a message to the MQTT input plugin:
 
-```bash
-$ mosquitto_pub  -m '{"key1": 123, "key2": 456}' -t some/topic
+```shell
+mosquitto_pub  -m '{"key1": 123, "key2": 456}' -t some/topic
 ```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file append the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: mqtt
+      tag: data
+      listen: 0.0.0.0
+      port: 1883
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [INPUT]
-    Name   mqtt
-    Tag    data
-    Listen 0.0.0.0
-    Port   1883
+  Name   mqtt
+  Tag    data
+  Listen 0.0.0.0
+  Port   1883
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
 
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/inputs/network-io-metrics.md b/pipeline/inputs/network-io-metrics.md
index 64fb21f26..f36aad3ec 100644
--- a/pipeline/inputs/network-io-metrics.md
+++ b/pipeline/inputs/network-io-metrics.md
@@ -1,78 +1,85 @@
-# Network I/O Metrics
+# Network I/O metrics
 
-The **netif** input plugin gathers network traffic information of the running system every certain interval of time, and reports them.
+The _Network I/O metrics_ (`netif`) input plugin gathers network traffic information of the running system at regular intervals, and reports them.
 
-The Network I/O Metrics plugin creates metrics that are log-based \(I.e. JSON payload\). If you are looking for Prometheus-based metrics please see the Node Exporter Metrics input plugin. 
+The Network I/O metrics plugin creates metrics that are log-based, such as JSON payload. For Prometheus-based metrics, see the Node Exporter metrics input plugin.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-| Interface | Specify the network interface to monitor. e.g. eth0 | |
-| Interval\_Sec | Polling interval \(seconds\). | 1 |
-| Interval\_NSec | Polling interval \(nanosecond\). | 0 |
-| Verbose | If true, gather metrics precisely. | false |
-| Test\_At\_Init | If true, testing if the network interface is valid at initialization. | false |
+| Key             | Description                                                                                             | Default |
+|:----------------|:--------------------------------------------------------------------------------------------------------|:--------|
+| `Interface`     | Specify the network interface to monitor. For example, `eth0`.                                          | _none_  |
+| `Interval_Sec`  | Polling interval (seconds).                                                                             | `1`     |
+| `Interval_NSec` | Polling interval (nanosecond).                                                                          | `0`     |
+| `Verbose`       | If true, gather metrics precisely.                                                                      | `false` |
+| `Test_At_Init`  | If true, testing if the network interface is valid at initialization.                                   | `false` |
+| `Threaded`      | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs). | `false` |
 
-## Getting Started
+## Get started
 
-In order to monitor network traffic from your system, you can run the plugin from the command line or through the configuration file:
+To monitor network traffic from your system, you can run the plugin from the command line or through the configuration file:
 
-### Command Line
+### Command line
 
-```bash
-$ bin/fluent-bit -i netif -p interface=eth0 -o stdout
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+Run Fluent Bit using a command similar to the following:
 
-[2017/07/08 23:34:18] [ info] [engine] started
+```shell
+fluent-bit -i netif -p interface=eth0 -o stdout
+```
+
+Which returns something the following:
+
+```text
+...
 [0] netif.0: [1499524459.001698260, {"eth0.rx.bytes"=>89769869, "eth0.rx.packets"=>73357, "eth0.rx.errors"=>0, "eth0.tx.bytes"=>4256474, "eth0.tx.packets"=>24293, "eth0.tx.errors"=>0}]
 [1] netif.0: [1499524460.002541885, {"eth0.rx.bytes"=>98, "eth0.rx.packets"=>1, "eth0.rx.errors"=>0, "eth0.tx.bytes"=>98, "eth0.tx.packets"=>1, "eth0.tx.errors"=>0}]
 [2] netif.0: [1499524461.001142161, {"eth0.rx.bytes"=>98, "eth0.rx.packets"=>1, "eth0.rx.errors"=>0, "eth0.tx.bytes"=>98, "eth0.tx.packets"=>1, "eth0.tx.errors"=>0}]
 [3] netif.0: [1499524462.002612971, {"eth0.rx.bytes"=>98, "eth0.rx.packets"=>1, "eth0.rx.errors"=>0, "eth0.tx.bytes"=>98, "eth0.tx.packets"=>1, "eth0.tx.errors"=>0}]
+...
 ```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+In your main configuration file append the following:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: netif
+      tag: netif
+      interval_sec: 1
+      interval_nsec: 0
+      interface: eth0
+      
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name          netif
-    Tag           netif
-    Interval_Sec  1
-    Interval_NSec 0
-    Interface     eth0
+  Name          netif
+  Tag           netif
+  Interval_Sec  1
+  Interval_NSec 0
+  Interface     eth0
+
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: netif
-          tag: netif
-          interval_sec: 1
-          interval_nsec: 0
-          interface: eth0
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
-Note: Total interval \(sec\) = Interval\_Sec + \(Interval\_Nsec / 1000000000\).
-
-e.g. 1.5s = 1s + 500000000ns
+Which calculates using the formula: `Total interval (sec) = Interval_Sec + (Interval_Nsec / 1000000000)`.
 
+For example: `1.5s = 1s + 500000000ns`
\ No newline at end of file
diff --git a/pipeline/inputs/nginx.md b/pipeline/inputs/nginx.md
index d56fc375b..ad826a0d9 100644
--- a/pipeline/inputs/nginx.md
+++ b/pipeline/inputs/nginx.md
@@ -1,123 +1,166 @@
-# NGINX Exporter Metrics
+# NGINX exporter metrics
 
-_NGINX Exporter Metrics_ input plugin scrapes metrics from the NGINX stub status handler.
+The _NGINX exporter metrics_ input plugin scrapes metrics from the NGINX stub status handler.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-| Host | Name of the target host or IP address to check. | localhost |
-| Port | Port of the target nginx service to connect to. | 80 |
-| Status_URL | The URL of the Stub Status Handler. | /status |
-| Nginx_Plus | Turn on NGINX plus mode. | true |
+| Key          | Description                                                                                             | Default     |
+|:-------------|:--------------------------------------------------------------------------------------------------------|:------------|
+| `Host`       | Name of the target host or IP address.                                                                  | `localhost` |
+| `Port`       | Port of the target Nginx service to connect to.                                                         | `80`        |
+| `Status_URL` | The URL of the stub status Handler.                                                                     | `/status`   |
+| `Nginx_Plus` | Turn on NGINX plus mode.                                                                                | `true`      |
+| `Threaded`   | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs). | `false`     |
 
-## Getting Started
+## Get started
 
 NGINX must be configured with a location that invokes the stub status handler. Here is an example configuration with such a location:
 
-```
+```text
 server {
-    listen       80;
-    listen  [::]:80;
-    server_name  localhost;
-    location / {
-        root   /usr/share/nginx/html;
-        index  index.html index.htm;
-    }
-    // configure the stub status handler.
-    location /status {
-        stub_status;
-    }
+  listen       80;
+  listen  [::]:80;
+  server_name  localhost;
+  location / {
+    root   /usr/share/nginx/html;
+    index  index.html index.htm;
+  }
+  // configure the stub status handler.
+  location /status {
+    stub_status;
+  }
 }
 ```
 
 ### Configuration with NGINX Plus REST API
 
-A much more powerful and flexible metrics API is available with NGINX Plus. A path needs to be configured 
-in NGINX Plus first.
+Another metrics API is available with NGINX Plus. You must first configure a path in NGINX Plus.
 
-```
+```text
 server {
-	listen       80;
-	listen  [::]:80;
-	server_name  localhost;
-
-	# enable /api/ location with appropriate access control in order
-	# to make use of NGINX Plus API
-	#
-	location /api/ {
-		api write=on;
-		# configure to allow requests from the server running fluent-bit
-		allow 192.168.1.*;
-		deny all;
-	}
+  listen       80;
+  listen  [::]:80;
+  server_name  localhost;
+
+  # enable /api/ location with appropriate access control in order
+  # to make use of NGINX Plus API
+  #
+  location /api/ {
+    api write=on;
+    # configure to allow requests from the server running fluent-bit
+    allow 192.168.1.*;
+    deny all;
+  }
 }
 ```
 
-### Command Line
+### Command line
 
 From the command line you can let Fluent Bit generate the checks with the following options:
 
-```bash
-$ fluent-bit -i nginx_metrics -p host=127.0.0.1 -p port=80 -p status_url=/status -p nginx_plus=off -o stdout
+```shell
+fluent-bit -i nginx_metrics -p host=127.0.0.1 -p port=80 -p status_url=/status -p nginx_plus=off -o stdout
 ```
 
-To gather metrics from the command line with the NGINX Plus REST API we need to turn on the
-nginx_plus property, like so:
+To gather metrics from the command line with the NGINX Plus REST API you need to turn on the
+`nginx_plus` property:
 
-```bash
-$ fluent-bit -i nginx_metrics -p host=127.0.0.1 -p port=80 -p nginx_plus=on -p status_url=/api -o stdout
+```shell
+fluent-bit -i nginx_metrics -p host=127.0.0.1 -p port=80 -p nginx_plus=on -p status_url=/api -o stdout
 ```
 
+### Configuration file
+
+In your main configuration file append the following:
 
-### Configuration File
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: nginx_metrics
+      nginx_plus: off
+      host: 127.0.0.1
+      port: 80
+      status_URL: /status
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```ini
+```text
 [INPUT]
-    Name          nginx_metrics
-    Host          127.0.0.1
-    Port          80
-    Status_URL    /status
-    Nginx_Plus    off
+  Name          nginx_metrics
+  Nginx_Plus    off
+  Host          127.0.0.1
+  Port          80
+  Status_URL    /status
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
 
+{% endtab %}
+{% endtabs %}
+
 And for NGINX Plus API:
 
-```ini
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: nginx_metrics
+      nginx_plus: on
+      host: 127.0.0.1
+      port: 80
+      status_URL: /api
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name          nginx_metrics
-    Nginx_Plus    on
-    Host          127.0.0.1
-    Port          80
-    Status_URL    /api
+  Name          nginx_metrics
+  Nginx_Plus    on
+  Host          127.0.0.1
+  Port          80
+  Status_URL    /api
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
 
+{% endtab %}
+{% endtabs %}
 
+## Test your configuration
 
-## Testing
+You can test against the NGINX server running on localhost by invoking it directly from the command line:
 
-You can quickly test against the NGINX server running on localhost by invoking it directly from the command line:
+```shell
+fluent-bit -i nginx_metrics -p host=127.0.0.1 -p nginx_plus=off -o stdout -p match=* -f 1
+```
 
-```bash
-$ fluent-bit -i nginx_metrics -p host=127.0.0.1 -p nginx_plus=off -o stdout -p match=* -f 1
-Fluent Bit v2.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+Which should return something like the following:
 
+```text
+...
 2021-10-14T19:37:37.228691854Z nginx_connections_accepted = 788253884
 2021-10-14T19:37:37.228691854Z nginx_connections_handled = 788253884
 2021-10-14T19:37:37.228691854Z nginx_http_requests_total = 42045501
@@ -126,116 +169,9 @@ Fluent Bit v2.x.x
 2021-10-14T19:37:37.228691854Z nginx_connections_writing = 1
 2021-10-14T19:37:37.228691854Z nginx_connections_waiting = 2008
 2021-10-14T19:37:35.229919621Z nginx_up = 1
+...
 ```
 
-## Exported Metrics
-
-This documentation is copied from the nginx prometheus exporter metrics documentation: 
-[https://github.com/nginxinc/nginx-prometheus-exporter/blob/master/README.md].
-
-### Common metrics:
-Name | Type | Description | Labels
-----|----|----|----|
-`nginx_up` | Gauge | Shows the status of the last metric scrape: `1` for a successful scrape and `0` for a failed one | [] |
-
-### Metrics for NGINX OSS:
-#### [Stub status metrics](https://nginx.org/en/docs/http/ngx_http_stub_status_module.html)
-Name | Type | Description | Labels
-----|----|----|----|
-`nginx_connections_accepted` | Counter | Accepted client connections. | [] |
-`nginx_connections_active` | Gauge | Active client connections. | [] |
-`nginx_connections_handled` | Counter | Handled client connections. | [] |
-`nginx_connections_reading` | Gauge | Connections where NGINX is reading the request header. | [] |
-`nginx_connections_waiting` | Gauge | Idle client connections. | [] |
-`nginx_connections_writing` | Gauge | Connections where NGINX is writing the response back to the client. | [] |
-`nginx_http_requests_total` | Counter | Total http requests. | [] |
-
-### Metrics for NGINX Plus:
-#### [Connections](https://nginx.org/en/docs/http/ngx_http_api_module.html#def_nginx_connections)
-Name | Type | Description | Labels
-----|----|----|----|
-`nginxplus_connections_accepted` | Counter | Accepted client connections | [] |
-`nginxplus_connections_active` | Gauge | Active client connections | [] |
-`nginxplus_connections_dropped` | Counter | Dropped client connections dropped | [] |
-`nginxplus_connections_idle` | Gauge | Idle client connections | [] |
-
-#### [HTTP](https://nginx.org/en/docs/http/ngx_http_api_module.html#http_)
-Name | Type | Description | Labels
-----|----|----|----|
-`nginxplus_http_requests_total` | Counter | Total http requests | [] |
-`nginxplus_http_requests_current` | Gauge | Current http requests | [] |
-
-#### [SSL](https://nginx.org/en/docs/http/ngx_http_api_module.html#def_nginx_ssl_object)
-Name | Type | Description | Labels
-----|----|----|----|
-`nginxplus_ssl_handshakes` | Counter | Successful SSL handshakes | [] |
-`nginxplus_ssl_handshakes_failed` | Counter | Failed SSL handshakes | [] |
-`nginxplus_ssl_session_reuses` | Counter | Session reuses during SSL handshake | [] |
-
-#### [HTTP Server Zones](https://nginx.org/en/docs/http/ngx_http_api_module.html#def_nginx_http_server_zone)
-Name | Type | Description | Labels
-----|----|----|----|
-`nginxplus_server_zone_processing` | Gauge | Client requests that are currently being processed | `server_zone` |
-`nginxplus_server_zone_requests` | Counter | Total client requests | `server_zone` |
-`nginxplus_server_zone_responses` | Counter | Total responses sent to clients | `code` (the response status code. The values are: `1xx`, `2xx`, `3xx`, `4xx` and `5xx`), `server_zone` |
-`nginxplus_server_zone_discarded` | Counter | Requests completed without sending a response | `server_zone` |
-`nginxplus_server_zone_received` | Counter | Bytes received from clients | `server_zone` |
-`nginxplus_server_zone_sent` | Counter | Bytes sent to clients | `server_zone` |
-
-#### [Stream Server Zones](https://nginx.org/en/docs/http/ngx_http_api_module.html#def_nginx_stream_server_zone)
-Name | Type | Description | Labels
-----|----|----|----|
-`nginxplus_stream_server_zone_processing` | Gauge | Client connections that are currently being processed | `server_zone` |
-`nginxplus_stream_server_zone_connections` | Counter | Total connections | `server_zone` |
-`nginxplus_stream_server_zone_sessions` | Counter | Total sessions completed | `code` (the response status code. The values are: `2xx`, `4xx`, and `5xx`), `server_zone` |
-`nginxplus_stream_server_zone_discarded` | Counter | Connections completed without creating a session | `server_zone` |
-`nginxplus_stream_server_zone_received` | Counter | Bytes received from clients | `server_zone` |
-`nginxplus_stream_server_zone_sent` | Counter | Bytes sent to clients | `server_zone` |
-
-#### [HTTP Upstreams](https://nginx.org/en/docs/http/ngx_http_api_module.html#def_nginx_http_upstream)
-
-> Note: for the `state` metric, the string values are converted to float64 using the following rule: `"up"` -> `1.0`, `"draining"` -> `2.0`, `"down"` -> `3.0`, `"unavail"` –> `4.0`, `"checking"` –> `5.0`, `"unhealthy"` -> `6.0`.
-
-Name | Type | Description | Labels
-----|----|----|----|
-`nginxplus_upstream_server_state` | Gauge | Current state | `server`, `upstream` |
-`nginxplus_upstream_server_active` | Gauge | Active connections | `server`, `upstream` |
-`nginxplus_upstream_server_limit` | Gauge | Limit for connections which corresponds to the max_conns parameter of the upstream server. Zero value means there is no limit | `server`, `upstream` |
-`nginxplus_upstream_server_requests` | Counter | Total client requests | `server`, `upstream` |
-`nginxplus_upstream_server_responses` | Counter | Total responses sent to clients | `code` (the response status code. The values are: `1xx`, `2xx`, `3xx`, `4xx` and `5xx`), `server`, `upstream` |
-`nginxplus_upstream_server_sent` | Counter | Bytes sent to this server | `server`, `upstream` |
-`nginxplus_upstream_server_received` | Counter | Bytes received to this server | `server`, `upstream` |
-`nginxplus_upstream_server_fails` | Counter | Number of unsuccessful attempts to communicate with the server | `server`, `upstream` |
-`nginxplus_upstream_server_unavail` | Counter | How many times the server became unavailable for client requests (state 'unavail') due to the number of unsuccessful attempts reaching the max_fails threshold | `server`, `upstream` |
-`nginxplus_upstream_server_header_time` | Gauge | Average time to get the response header from the server | `server`, `upstream` |
-`nginxplus_upstream_server_response_time` | Gauge | Average time to get the full response from the server | `server`, `upstream` |
-`nginxplus_upstream_keepalives` | Gauge | Idle keepalive connections | `upstream` |
-`nginxplus_upstream_zombies` | Gauge | Servers removed from the group but still processing active client requests | `upstream` |
-
-#### [Stream Upstreams](https://nginx.org/en/docs/http/ngx_http_api_module.html#def_nginx_stream_upstream)
-
-> Note: for the `state` metric, the string values are converted to float64 using the following rule: `"up"` -> `1.0`, `"down"` -> `3.0`, `"unavail"` –> `4.0`, `"checking"` –> `5.0`, `"unhealthy"` -> `6.0`.
-
-Name | Type | Description | Labels
-----|----|----|----|
-`nginxplus_stream_upstream_server_state` | Gauge | Current state | `server`, `upstream` |
-`nginxplus_stream_upstream_server_active` | Gauge | Active connections | `server` , `upstream` |
-`nginxplus_stream_upstream_server_limit` | Gauge | Limit for connections which corresponds to the max_conns parameter of the upstream server. Zero value means there is no limit | `server` , `upstream` |
-`nginxplus_stream_upstream_server_connections` | Counter | Total number of client connections forwarded to this server | `server`, `upstream` |
-`nginxplus_stream_upstream_server_connect_time` | Gauge | Average time to connect to the upstream server | `server`, `upstream`
-`nginxplus_stream_upstream_server_first_byte_time` | Gauge | Average time to receive the first byte of data | `server`, `upstream` |
-`nginxplus_stream_upstream_server_response_time` | Gauge | Average time to receive the last byte of data | `server`, `upstream` |
-`nginxplus_stream_upstream_server_sent` | Counter | Bytes sent to this server | `server`, `upstream` |
-`nginxplus_stream_upstream_server_received` | Counter | Bytes received from this server | `server`, `upstream` |
-`nginxplus_stream_upstream_server_fails` | Counter | Number of unsuccessful attempts to communicate with the server | `server`, `upstream` |
-`nginxplus_stream_upstream_server_unavail` | Counter | How many times the server became unavailable for client connections (state 'unavail') due to the number of unsuccessful attempts reaching the max_fails threshold | `server`, `upstream` |
-`nginxplus_stream_upstream_zombies` | Gauge | Servers removed from the group but still processing active client connections | `upstream`|
-
-#### [Location Zones](https://nginx.org/en/docs/http/ngx_http_api_module.html#def_nginx_http_location_zone)
-Name | Type | Description | Labels
-----|----|----|----|
-`nginxplus_location_zone_requests` | Counter | Total client requests | `location_zone` |
-`nginxplus_location_zone_responses` | Counter | Total responses sent to clients | `code` (the response status code. The values are: `1xx`, `2xx`, `3xx`, `4xx` and `5xx`), `location_zone` |
-`nginxplus_location_zone_discarded` | Counter | Requests completed without sending a response | `location_zone` |
-`nginxplus_location_zone_received` | Counter | Bytes received from clients | `location_zone` |
-`nginxplus_location_zone_sent` | Counter | Bytes sent to clients | `location_zone` |
+## Exported metrics
+
+For a list of available metrics, see the [NGINX Prometheus Exporter metrics documentation](https://github.com/nginxinc/nginx-prometheus-exporter/blob/main/README.md) on GitHub.
diff --git a/pipeline/inputs/node-exporter-metrics.md b/pipeline/inputs/node-exporter-metrics.md
index 097f1ac9c..d4d122162 100644
--- a/pipeline/inputs/node-exporter-metrics.md
+++ b/pipeline/inputs/node-exporter-metrics.md
@@ -1,95 +1,102 @@
 ---
-description: >-
-  A plugin based on Prometheus Node Exporter to collect system / host level
-  metrics
+description: A plugin based on Prometheus Node Exporter to collect system and host level metrics
 ---
 
-# Node Exporter Metrics
+# Node exporter metrics
 
-[Prometheus Node Exporter](https://github.com/prometheus/node_exporter) is a popular way to collect system level metrics from operating systems, such as CPU / Disk / Network / Process statistics. Fluent Bit 1.8.0 includes node exporter metrics plugin that builds off the Prometheus design to collect system level metrics without having to manage two separate processes or agents.
+[Prometheus Node exporter](https://github.com/prometheus/node_exporter) is a popular way to collect system level metrics from operating systems, such as CPU, disk, network, and process statistics. Fluent Bit includes a node exporter metrics plugin that builds off the Prometheus design to collect system level metrics without having to manage two separate processes or agents.
 
-The initial release of Node Exporter Metrics contains a subset of collectors and metrics available from Prometheus Node Exporter and we plan to expand them over time.
+The _Node exporter metrics_ plugin contains a subset of collectors and metrics available from Prometheus Node exporter.
 
-**Important note:** Metrics collected with Node Exporter Metrics flow through a separate pipeline from logs and current filters do not operate on top of metrics.
+{% hint style="info" %}
 
-This plugin is supported on Linux-based operating systems for the most part with macOS offering a reduced subset of metrics.
-The table below indicates which collector is supported on macOS.
+Metrics collected with Node Exporter Metrics flow through a separate pipeline from logs and current filters don't operate on top of metrics.
+This plugin is generally supported on Linux-based operating systems, with macOS offering a reduced subset of metrics.
 
+{% endhint %}
 
 ## Configuration
 
-| Key             | Description                                                            | Default   |
-| --------------- | ---------------------------------------------------------------------- | --------- |
-| scrape_interval | The rate at which metrics are collected from the host operating system | 5 seconds |
-| path.procfs     | The mount point used to collect process information and metrics        | /proc/    |
-| path.sysfs      | The path in the filesystem used to collect system metrics              | /sys/     |
-| collector.cpu.scrape\_interval | The rate in seconds at which cpu metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.cpufreq.scrape\_interval   | The rate in seconds at which cpufreq metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.meminfo.scrape\_interval   | The rate in seconds at which meminfo metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.diskstats.scrape\_interval | The rate in seconds at which diskstats metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.filesystem.scrape\_interval | The rate in seconds at which filesystem metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.uname.scrape\_interval     | The rate in seconds at which uname metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used.| 0 seconds |
-| collector.stat.scrape\_interval      | The rate in seconds at which stat metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.time.scrape\_interval      | The rate in seconds at which time metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.loadavg.scrape\_interval   | The rate in seconds at which loadavg metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.vmstat.scrape\_interval   | The rate in seconds at which vmstat metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.thermal_zone.scrape\_interval   | The rate in seconds at which thermal_zone metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.filefd.scrape\_interval   | The rate in seconds at which filefd metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.nvme.scrape\_interval | The rate in seconds at which nvme metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.processes.scrape\_interval | The rate in seconds at which system level of process metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| metrics | To specify which metrics are collected from the host operating system. These metrics depend on `/proc` or `/sys` fs. The actual values of metrics will be read from `/proc` or `/sys` when needed. cpu, cpufreq, meminfo, diskstats, filesystem, stat, loadavg, vmstat, netdev, and filefd depend on procfs. cpufreq metrics depend on sysfs. | `"cpu,cpufreq,meminfo,diskstats,filesystem,uname,stat,time,loadavg,vmstat,netdev,filefd"` |
-| filesystem.ignore\_mount\_point\_regex  | Specify the regex for the mount points to prevent collection of/ignore. | `^/(dev|proc|run/credentials/.+|sys|var/lib/docker/.+|var/lib/containers/storage/.+)($|/)`    |
-| filesystem.ignore\_filesystem\_type\_regex  | Specify the regex for the filesystem types to prevent collection of/ignore. | `^(autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs)$`    |
-| diskstats.ignore\_device\_regex | Specify the regex for the diskstats to prevent collection of/ignore. | `^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\\d+n\\d+p)\\d+$` |
-| systemd_service_restart_metrics | Determines if the collector will include service restart metrics | false |
-| systemd_unit_start_time_metrics | Determines if the collector will include unit start time metrics | false |
-| systemd_include_service_task_metrics | Determines if the collector will include service task metrics | false |
-| systemd_include_pattern | regex to determine which units are included in the metrics produced by the systemd collector | It is not applied unless explicitly set |
-| systemd_exclude_pattern | regex to determine which units are excluded in the metrics produced by the systemd collector | `.+\\.(automount|device|mount|scope|slice)"`    |
-
-
-**Note:** The plugin top-level `scrape_interval` setting is the global default with any custom settings for individual `scrape_intervals` then overriding just that specific metric scraping interval.
-Each `collector.xxx.scrape_interval` option only overrides the interval for that specific collector and updates the associated set of provided metrics.
+`scrape_interval` sets the default for all scrapes. To set granular scrape intervals, set the specific interval. For example, `collector.cpu.scrape_interval`. When using a granular scrape interval, if a value greater than `0` is used, it overrides the global default. Otherwise, the global default is used.
+
+The plugin top-level `scrape_interval` setting is the global default. Any custom settings for individual `scrape_intervals` override that specific metric scraping interval.
 
-The overridden intervals only change the collection interval, not the interval for publishing the metrics which is taken from the global setting.
-For example, if the global interval is set to 5s and an override interval of 60s is used then the published metrics will be reported every 5s but for the specific collector they will stay the same for 60s until it is collected again.
-This feature aims to help with down-sampling when collecting metrics.
+Each `collector.xxx.scrape_interval` option only overrides the interval for that specific collector and updates the associated set of provided metrics.
 
+Overridden intervals only change the collection interval, not the interval for publishing the metrics which is taken from the global setting.
+
+For example, if the global interval is set to `5` and an override interval of `60` is used, the published metrics will be reported every five seconds. However, the specific collector will stay the same for 60 seconds until it's collected again.
+
+This helps with down-sampling when collecting metrics.
+
+| Key | Description | Default |
+|---|---|---|
+| `scrape_interval` | The rate in seconds at which metrics are collected from the host operating system. | `5` |
+| `path.procfs` | The mount point used to collect process information and metrics. | `/proc/` |
+| `path.sysfs` | The path in the filesystem used to collect system metrics. | `/sys/` |
+| `collector.cpu.scrape_interval` | The rate in seconds at which `cpu` metrics are collected from the host operating system. | `0` |
+| `collector.cpufreq.scrape_interval` | The rate in seconds at which `cpufreq` metrics are collected from the host operating system. | `0` |
+| `collector.meminfo.scrape_interval` | The rate in seconds at which `meminfo` metrics are collected from the host operating system. | `0` |
+| `collector.diskstats.scrape_interval` | The rate in seconds at which `diskstats` metrics are collected from the host operating system. | `0` |
+| `collector.filesystem.scrape_interval` | The rate in seconds at which `filesystem` metrics are collected from the host operating system. | `0` |
+| `collector.uname.scrape_interval` | The rate in seconds at which `uname` metrics are collected from the host operating system. | `0` |
+| `collector.stat.scrape_interval` | The rate in seconds at which `stat` metrics are collected from the host operating system. | `0` |
+| `collector.time.scrape_interval` | The rate in seconds at which `time` metrics are collected from the host operating system. | `0` |
+| `collector.loadavg.scrape_interval` | The rate in seconds at which `loadavg` metrics are collected from the host operating system. | `0` |
+| `collector.vmstat.scrape_interval` | The rate in seconds at which `vmstat` metrics are collected from the host operating system. | `0` |
+| `collector.thermal_zone.scrape_interval` | The rate in seconds at which `thermal_zone` metrics are collected from the host operating system. | `0` |
+| `collector.filefd.scrape_interval` | The rate in seconds at which `filefd` metrics are collected from the host operating system. | `0` |
+| `collector.nvme.scrape_interval` | The rate in seconds at which `nvme` metrics are collected from the host operating system. | `0` |
+| `collector.processes.scrape_interval` | The rate in seconds at which system level `process` metrics are collected from the host operating system. | `0` |
+| `metrics` | Specify which metrics are collected from the host operating system. These metrics depend on `/procfs` or `/sysfs`. The actual values of metrics will be read from `/proc` or `/sys` when needed. `cpu`, `cpufreq`, `meminfo`, `diskstats`, `filesystem`, `stat`, `loadavg`, `vmstat`, `netdev`, and `filefd` depend on `procfs`. `cpufreq` metrics depend on `sysfs`. | `"cpu,cpufreq,meminfo,diskstats,filesystem,uname,stat,time,loadavg,vmstat,netdev,filefd"` |
+| `filesystem.ignore_mount_point_regex` | Specify the regular expression for the `mount` points to prevent collection of/ignore. | `^/(dev\|proc\|run/credentials/.+\|sys\|var/lib/docker/.+\|var/lib/containers/storage/.+)($\|/)` |
+| `filesystem.ignore_filesystem_type_regex` | Specify the regular expression for the `filesystem` types to prevent collection of or ignore. | `^(autofs\|binfmt_misc\|bpf\|cgroup2?\|configfs\|debugfs\|devpts\|devtmpfs\|fusectl\|hugetlbfs\|iso9660\|mqueue\|nsfs\|overlay\|proc\|procfs\|pstore\|rpc_pipefs\|securityfs\|selinuxfs\|squashfs\|sysfs\|tracefs)$` |
+| `diskstats.ignore_device_regex` | Specify the regular expression for the` diskstats` to prevent collection of/ignore. | `^(ram\|loop\|fd\|(h\|s\|v\|xv)d[a-z]\|nvme\\d+n\\d+p)\\d+$` |
+| `systemd_service_restart_metrics` | Determines if the collector will include service restart metrics. | `false` |
+| `systemd_unit_start_time_metrics` | Determines if the collector will include unit start time metrics. | `false` |
+| `systemd_include_service_task_metrics` | Determines if the collector will include service task metrics. | `false` |
+| `systemd_include_pattern` | Regular expression to determine which units are included in the metrics produced by the `systemd` collector. | Not applied unless explicitly set. |
+| `systemd_exclude_pattern` | Regular expression to determine which units are excluded in the metrics produced by the `systemd` collector. | `.+\\.(automount\|device\|mount\|scope\|slice)"` |
 
 ## Collectors available
 
-The following table describes the available collectors as part of this plugin. All of them are enabled by default and respects the original metrics name, descriptions, and types from Prometheus Exporter, so you can use your current dashboards without any compatibility problem.
+The following table describes the available collectors as part of this plugin. They're enabled by default and respect the original metrics name, descriptions, and types from Prometheus Exporter. You can use your current dashboards without any compatibility problem.
+
+The Version column specifies the Fluent Bit version where the collector is available.
+
+| Name                | Description                                                                                      | Operating system | Version |
+|---------------------|--------------------------------------------------------------------------------------------------|------------------|---------|
+| `cpu`               | Exposes CPU statistics.                                                                          | Linux, macOS     | 1.8     |
+| `cpufreq`           | Exposes CPU frequency statistics.                                                                | Linux            | 1.8     |
+| `diskstats`         | Exposes disk I/O statistics.                                                                     | Linux, macOS     | 1.8     |
+| `filefd`            | Exposes file descriptor statistics from `/proc/sys/fs/file-nr`.                                  | Linux            | 1.8.2   |
+| `filesystem`        | Exposes filesystem statistics from `/proc/*/mounts`.                                             | Linux            | 2.0.9   |
+| `loadavg`           | Exposes load average.                                                                            | Linux, macOS     | 1.8     |
+| `meminfo`           | Exposes memory statistics.                                                                       | Linux, macOS     | 1.8     |
+| `netdev`            | Exposes network interface statistics such as bytes transferred.                                  | Linux, macOS     | 1.8.2   |
+| `stat`              | Exposes various statistics from `/proc/stat`. This includes boot time, forks, and interruptions. | Linux            | 1.8     |
+| `time`              | Exposes the current system time.                                                                 | Linux            | v1.8    |
+| `uname`             | Exposes system information as provided by the `uname` system call.                               | Linux, macOS     | 1.8     |
+| `vmstat`            | Exposes statistics from `/proc/vmstat`.                                                          | Linux            | 1.8.2   |
+| `systemd collector` | Exposes statistics from `systemd`.                                                               | Linux            | 2.1.3   |
+| `thermal_zone`      | Expose thermal statistics from `/sys/class/thermal/thermal_zone/*`                               | Linux            | 2.2.1   |
+| `nvme`              | Exposes `nvme` statistics from `/proc`.                                                          | Linux            | 2.2.0   |
+| `processes`         | Exposes processes statistics from `/proc`.                                                       | Linux            | 2.2.0   |
 
-> note: the Version column specifies the Fluent Bit version where the collector is available.
+## Threading
 
-| Name              | Description                                                                                      | OS          | Version |
-| ----------------- | ------------------------------------------------------------------------------------------------ | ----------- | ------- |
-| cpu               | Exposes CPU statistics.                                                                          | Linux,macOS | v1.8    |
-| cpufreq           | Exposes CPU frequency statistics.                                                                | Linux       | v1.8    |
-| diskstats         | Exposes disk I/O statistics.                                                                     | Linux,macOS | v1.8    |
-| filefd            | Exposes file descriptor statistics from `/proc/sys/fs/file-nr`.                                  | Linux       | v1.8.2  |
-| filesystem        | Exposes filesystem statistics from `/proc/*/mounts`.                                             | Linux       | v2.0.9  |
-| loadavg           | Exposes load average.                                                                            | Linux,macOS | v1.8    |
-| meminfo           | Exposes memory statistics.                                                                       | Linux,macOS | v1.8    |
-| netdev            | Exposes network interface statistics such as bytes transferred.                                  | Linux,macOS | v1.8.2  |
-| stat              | Exposes various statistics from `/proc/stat`. This includes boot time, forks, and interruptions. | Linux       | v1.8    |
-| time              | Exposes the current system time.                                                                 | Linux       | v1.8    |
-| uname             | Exposes system information as provided by the uname system call.                                 | Linux,macOS | v1.8    |
-| vmstat            | Exposes statistics from `/proc/vmstat`.                                                          | Linux       | v1.8.2  |
-| systemd collector | Exposes statistics from systemd.                                                                 | Linux       | v2.1.3  |
-| thermal_zone      | Expose thermal statistics from `/sys/class/thermal/thermal_zone/*`                               | Linux       | v2.2.1  |
-| nvme              | Exposes nvme statistics from `/proc`.                                                            | Linux       | v2.2.0  |
-| processes         | Exposes processes statistics from `/proc`.                                                       | Linux       | v2.2.0  |
+This input always runs in its own [thread](../../administration/multithreading.md#inputs).
 
-## Getting Started
+## Get started
 
-### Simple Configuration File
+### Configuration file
 
-In the following configuration file, the input plugin _node_exporter_metrics collects _metrics every 2 seconds and exposes them through our [Prometheus Exporter](../outputs/prometheus-exporter.md) output plugin on HTTP/TCP port 2021.
+In the following configuration file, the input plugin `node_exporter_metrics` collects metrics every two seconds and exposes them through the [Prometheus Exporter](../outputs/prometheus-exporter.md) output plugin on HTTP/TCP port 2021.
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
 # Node Exporter Metrics + Prometheus Exporter
 # -------------------------------------------
 # The following example collect host metrics on Linux and expose
@@ -99,27 +106,28 @@ In the following configuration file, the input plugin _node_exporter_metrics col
 #
 # $ curl http://127.0.0.1:2021/metrics
 #
-[SERVICE]
-    flush           1
-    log_level       info
-
-[INPUT]
-    name            node_exporter_metrics
-    tag             node_metrics
-    scrape_interval 2
-
-[OUTPUT]
-    name            prometheus_exporter
-    match           node_metrics
-    host            0.0.0.0
-    port            2021
+service:
+  flush: 1
+  log_level: info
 
-        
+pipeline:
+  inputs:
+    - name: node_exporter_metrics
+      tag:  node_metrics
+      scrape_interval: 2
+
+  outputs:
+    - name: prometheus_exporter
+      match: node_metrics
+      host: 0.0.0.0
+      port: 2021
 ```
+
 {% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
 # Node Exporter Metrics + Prometheus Exporter
 # -------------------------------------------
 # The following example collect host metrics on Linux and expose
@@ -129,76 +137,86 @@ In the following configuration file, the input plugin _node_exporter_metrics col
 #
 # $ curl http://127.0.0.1:2021/metrics
 #
-service:
-    flush: 1
-    log_level: info
-pipeline:
-    inputs:
-        - name: node_exporter_metrics
-          tag:  node_metrics
-          scrape_interval: 2
-    outputs:
-        - name: prometheus_exporter
-          match: node_metrics
-          host: 0.0.0.0
-          port: 2021
+[SERVICE]
+  flush           1
+  log_level       info
+
+[INPUT]
+  name            node_exporter_metrics
+  tag             node_metrics
+  scrape_interval 2
+
+[OUTPUT]
+  name            prometheus_exporter
+  match           node_metrics
+  host            0.0.0.0
+  port            2021
+
+
 ```
+
 {% endtab %}
 {% endtabs %}
 
-You can test the expose of the metrics by using _curl:_
+You can test the expose of the metrics by using `curl`:
 
-```bash
+```shell
 curl http://127.0.0.1:2021/metrics
 ```
 
-### Container to Collect Host Metrics
+### Container to collect host metrics
 
-When deploying Fluent Bit in a container you will need to specify additional settings to ensure that Fluent Bit has access to the host operating system. The following docker command deploys Fluent Bit with specific mount paths and settings enabled to ensure that Fluent Bit can collect from the host. These are then exposed over port 2021.
+When deploying Fluent Bit in a container you will need to specify additional settings to ensure that Fluent Bit has access to the host operating system. The following Docker command deploys Fluent Bit with specific mount paths and settings enabled to ensure that Fluent Bit can collect from the host. These are then exposed over port `2021`.
 
-```
+```shell
 docker run -ti -v /proc:/host/proc \
-               -v /sys:/host/sys   \
-               -p 2021:2021        \
-               fluent/fluent-bit:1.8.0 \
-               /fluent-bit/bin/fluent-bit \
-                         -i node_exporter_metrics -p path.procfs=/host/proc -p path.sysfs=/host/sys \
-                         -o prometheus_exporter -p "add_label=host $HOSTNAME" \
-                         -f 1
+           -v /sys:/host/sys   \
+           -p 2021:2021        \
+           fluent/fluent-bit:1.8.0 \
+           /fluent-bit/bin/fluent-bit \
+           -i node_exporter_metrics \
+           -p path.procfs=/host/proc \
+           -p path.sysfs=/host/sys \
+           -o prometheus_exporter \
+           -p "add_label=host $HOSTNAME" \
+           -f 1
 ```
 
-### Fluent Bit + Prometheus + Grafana
+### Fluent Bit with Prometheus and Grafana
 
-If you like dashboards for monitoring, Grafana is one of the preferred options. In our Fluent Bit source code repository, we have pushed a simple **docker-compose **example. Steps:
+If you use dashboards for monitoring, Grafana is one option. The Fluent Bit source code repository contains a `docker-compose` example.
 
-#### Get a copy of Fluent Bit source code
+1. Download the Fluent Bit source code:
 
-```bash
-git clone https://github.com/fluent/fluent-bit
-cd fluent-bit/docker_compose/node-exporter-dashboard/
-```
+   ```shell
+   git clone https://github.com/fluent/fluent-bit
 
-#### Start the service and view your Dashboard
+   cd fluent-bit/docker_compose/node-exporter-dashboard/
+   ```
 
-```
-docker-compose up --force-recreate -d --build
-```
+2. Start the service and view your dashboard:
+
+   ```shell
+   docker-compose up --force-recreate -d --build
+   ```
+
+3. Open your browser and use the address `http://127.0.0.1:3000`.
 
-Now open your browser in the address **http://127.0.0.1:3000**. When asked for the credentials to access Grafana, just use the **admin **username and **admin **password**.**
+4. When asked for the credentials to access Grafana, use `admin` for the username and
+   password. See [Sign in to Grafana](https://grafana.com/docs/grafana/latest/setup-grafana/sign-in-to-grafana/).
 
-![](../../.gitbook/assets/updated.png)
+![An example Grafana dashboard](../../.gitbook/assets/updated.png)
 
-Note that by default Grafana dashboard plots the data from the last 24 hours, so just change it to **Last 5 minutes** to see the recent data being collected.
+By default, Grafana dashboard plots the data from the last 24 hours. Change it to **Last 5 minutes** to see the recent data being collected.
 
 #### Stop the Service
 
-```bash
+```shell
 docker-compose down
 ```
 
-## Enhancement Requests
+## Enhancement requests
 
-Our current plugin implements a sub-set of the available collectors in the original Prometheus Node Exporter, if you would like that we prioritize a specific collector please open a Github issue by using the following template:\
-\
-\- [in_node_exporter_metrics](https://github.com/fluent/fluent-bit/issues/new?assignees=\&labels=\&template=feature_request.md\&title=in_node_exporter_metrics:%20add%20ABC%20collector)
+The plugin implements a subset of the available collectors in the original Prometheus Node exporter. If you would like a specific collector prioritized, open a GitHub issue by using the following template:
 
+- [`in_node_exporter_metrics`](https://github.com/fluent/fluent-bit/issues/new?assignees=\&labels=\&template=feature_request.md\&title=in_node_exporter_metrics:%20add%20ABC%20collector)
diff --git a/pipeline/inputs/opentelemetry.md b/pipeline/inputs/opentelemetry.md
index b6dd0ad78..60163d9ee 100644
--- a/pipeline/inputs/opentelemetry.md
+++ b/pipeline/inputs/opentelemetry.md
@@ -1,33 +1,36 @@
 ---
-description: An input plugin to ingest OTLP Logs, Metrics, and Traces
+description: An input plugin to ingest OpenTelemetry logs, metrics, and traces
 ---
 
 # OpenTelemetry
 
-The OpenTelemetry input plugin allows you to receive data as per the OTLP specification, from various OpenTelemetry exporters, the OpenTelemetry Collector, or Fluent Bit's OpenTelemetry output plugin.
+The OpenTelemetry input plugin lets you receive data based on the OpenTelemetry specification from various OpenTelemetry exporters, the OpenTelemetry Collector, or the Fluent Bit OpenTelemetry output plugin.
 
-Our compliant implementation fully supports OTLP/HTTP and OTLP/GRPC. Note that the single `port` configured which defaults to 4318 supports both transports.
+Fluent Bit has a compliant implementation which fully supports `OTLP/HTTP` and `OTLP/GRPC`. The single `port` configured defaults to `4318` and supports both transport methods.
 
-## Configuration <a href="#configuration" id="configuration"></a>
+## Configuration
 
-| Key               | Description                                                                        | default |
-| ----------------- | -----------------------------------------------------------------------------------| ------- |
-| listen            | The network address to listen.                                                     | 0.0.0.0 |
-| port              | The port for Fluent Bit to listen for incoming connections. Note that as of Fluent Bit v3.0.2 this port is used for both transport OTLP/HTTP and OTLP/GRPC.                                                                                      | 4318    |
-| tag_key           | Specify the key name to overwrite a tag. If set, the tag will be overwritten by a value of the  |         |
-| raw_traces        | Route trace data as a log                                                          | false   |
-| buffer_max_size   | Specify the maximum buffer size in KB/MB/GB to the HTTP payload.                   | 4M      |
-| buffer_chunk_size | Initial size and allocation strategy to store the payload (advanced users only)    | 512K    |
-|successful_response_code | It allows to set successful response code. `200`, `201` and `204` are supported.| 201 |
-| tag_from_uri      | If true, tag will be created from uri. e.g. v1_metrics from /v1/metrics .                                                                      | true    |
+| Key | Description | Default |
+|---|---|---|
+| `listen` | The network address to listen on. | `0.0.0.0` |
+| `port` | The port for Fluent Bit to listen for incoming connections. In Fluent Bit 3.0.2 or later, this port is used for both transport `OTLP/HTTP` and `OTLP/GRPC`. | `4318` |
+| `tag` | Tag for all data ingested by this plugin. This will only be used if `tag_from_uri` is set to `false`. Otherwise, the tag will be created from the URI. | _none_ |
+| `tag_key` | Specify the key name to overwrite a tag. If set, the tag will be overwritten by a value of the key. | _none_ |
+| `raw_traces` | Route trace data as a log. | `false` |
+| `buffer_max_size` | Specify the maximum buffer size in `KB`, `MB`, or `GB` to the HTTP payload. | `4M` |
+| `buffer_chunk_size` | Initial size and allocation strategy to store the payload (advanced users only)` | `512K` |
+| `successful_response_code` | Allows for setting a successful response code. Supported values: `200`, `201`, or `204`. | `201` |
+| `tag_from_uri` | By default, the tag will be created from the URI. For example, `v1_metrics` from `/v1/metrics`. This must be set to false if using `tag`. | `true` |
+| `threaded` | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs). | `false` |
 
-Important note: Raw traces means that any data forwarded to the traces endpoint (`/v1/traces`) will be packed and forwarded as a log message, and will NOT be processed by Fluent Bit. The traces endpoint by default expects a valid protobuf encoded payload, but you can set the `raw_traces` option in case you want to get trace telemetry data to any of Fluent Bit's supported outputs.
+Raw traces means that any data forwarded to the traces endpoint (`/v1/traces`) will be packed and forwarded as a log message, and won't be processed by Fluent Bit. The traces endpoint by default expects a valid `protobuf` encoded payload, but you can set the `raw_traces` option in case you want to get trace telemetry data to any of the Fluent Bit supported outputs.
 
-### OTLP Transport Protocol Endpoints
+### OpenTelemetry transport protocol endpoints
 
-Fluent Bit based on the OTLP desired protocol exposes the following endpoints for data ingestion:
+Fluent Bit exposes the following endpoints for data ingestion based on the OpenTelemetry protocol:
+
+For `OTLP/HTTP`:
 
-__OTLP/HTTP__
 - Logs
   - `/v1/logs`
 - Metrics
@@ -35,7 +38,7 @@ __OTLP/HTTP__
 - Traces
   - `/v1/traces`
 
-__OTLP/GRPC__
+For `OTLP/GRPC`:
 
 - Logs
   - `/opentelemetry.proto.collector.log.v1.LogService/Export`
@@ -47,53 +50,54 @@ __OTLP/GRPC__
   - `/opentelemetry.proto.collector.trace.v1.TraceService/Export`
   - `/opentelemetry.proto.collector.traces.v1.TracesService/Export`
 
+## Get started
 
-## Getting started
-
-The OpenTelemetry plugin currently supports the following telemetry data types:
+The OpenTelemetry input plugin supports the following telemetry data types:
 
-|     Type    |    HTTP/JSON  |   HTTP/Protobuf |
-| ----------- | ------------- | --------------- |
-|    Logs     |     Stable    |      Stable     |
-|    Metrics  | Unimplemented |      Stable     |
-|    Traces   | Unimplemented |      Stable     |
-
-A sample config file to get started will look something like the following:
+| Type    | HTTP1/JSON    | HTTP1/Protobuf | HTTP2/gRPC |
+|---------|---------------|----------------|------------|
+| Logs    | Stable        | Stable         | Stable     |
+| Metrics | Unimplemented | Stable         | Stable     |
+| Traces  | Unimplemented | Stable         | Stable     |
 
+A sample configuration file to get started will look something like the following:
 
 {% tabs %}
-
 {% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
-    inputs:
-        - name: opentelemetry
-          listen: 127.0.0.1
-          port: 4318
-    outputs:
-        - name: stdout
-          match: '*'
+  inputs:
+    - name: opentelemetry
+      listen: 127.0.0.1
+      port: 4318
+
+  outputs:
+    - name: stdout
+      match: '*'
 ```
-{% endtab %}
 
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```
+
+```text
 [INPUT]
-	name opentelemetry
-	listen 127.0.0.1
-	port 4318
+  name opentelemetry
+  listen 127.0.0.1
+  port 4318
 
 [OUTPUT]
-	name stdout
-	match *
+  name stdout
+  match *
 ```
-{% endtab %}
 
+{% endtab %}
 {% endtabs %}
 
-With the above configuration, Fluent Bit will listen on port `4318` for data. You can now send telemetry data to the endpoints `/v1/metrics`, `/v1/traces`, and `/v1/logs` for metrics, traces, and logs respectively.
+With this configuration, Fluent Bit listens on port `4318` for data. You can now send telemetry data to the endpoints `/v1/metrics` for metrics, `/v1/traces` for traces, and `/v1/logs` for logs.
 
-A sample curl request to POST json encoded log data would be:
-```
+A sample curl request to POST JSON encoded log data would be:
+
+```shell
 curl --header "Content-Type: application/json" --request POST --data '{"resourceLogs":[{"resource":{},"scopeLogs":[{"scope":{},"logRecords":[{"timeUnixNano":"1660296023390371588","body":{"stringValue":"{\"message\":\"dummy\"}"},"traceId":"","spanId":""}]}]}]}'   http://0.0.0.0:4318/v1/logs
 ```
diff --git a/pipeline/inputs/podman-metrics.md b/pipeline/inputs/podman-metrics.md
index fb51e3328..6fba9ae15 100644
--- a/pipeline/inputs/podman-metrics.md
+++ b/pipeline/inputs/podman-metrics.md
@@ -1,29 +1,37 @@
----
-description: The Podman Metrics input plugin allows you to collect metrics from podman containers, so they can be exposed later as, for example, Prometheus counters and gauges.
----
+# Podman metrics
 
-# Podman Metrics
+The Podman metrics input plugin lets Fluent Bit gather Podman container metrics. The procedure for collecting container list and gathering data associated with them is based on filesystem data.
 
-## Configuration Parameters
+The metrics can be exposed later as, for example, Prometheus counters and gauges.
 
-| **Key**           | Description                                                | Default                                                        |
-| ----------------- | ---------------------------------------------------------- | -------------------------------------------------------------- |
-| scrape_interval   | Interval between each scrape of podman data (in seconds)   | 30                                                             |
-| scrape_on_start   | Should this plugin scrape podman data after it is started  | false                                                          |
-| path.config       | Custom path to podman containers configuration file        | /var/lib/containers/storage/overlay-containers/containers.json |
-| path.sysfs        | Custom path to sysfs subsystem directory                   | /sys/fs/cgroup                                                 |
-| path.procfs       | Custom path to proc subsystem directory                    | /proc                                                          |
+## Configuration parameters
 
-## Getting Started
+| Key               | Description                                                                                             | Default                                                          |
+|-------------------|---------------------------------------------------------------------------------------------------------|------------------------------------------------------------------|
+| `scrape_interval` | Interval between each scrape of Podman data (in seconds).                                               | `30`                                                             |
+| `scrape_on_start` | Sets whether this plugin scrapes Podman data on startup.                                                | `false`                                                          |
+| `path.config`     | Custom path to the Podman containers configuration file.                                                | `/var/lib/containers/storage/overlay-containers/containers.json` |
+| `path.sysfs`      | Custom path to the `sysfs` subsystem directory.                                                         | `/sys/fs/cgroup`                                                 |
+| `path.procfs`     | Custom path to the `proc` subsystem directory.                                                          | `/proc`                                                          |
+| `threaded`        | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs). | `false`                                                          |
 
-The podman metrics input plugin allows Fluent Bit to gather podman container metrics. The entire procedure of collecting container list and gathering data associated with them bases on filesystem data.This plugin does not execute podman commands or send http requests to podman api - instead it reads podman configuration file and metrics exposed by */sys* and */proc* filesystems.
+## Get started
 
-This plugin supports and automatically detects both cgroups v1 and v2.
+This plugin doesn't execute `podman` commands or send HTTP requests to Podman API. It reads a Podman configuration file and metrics exposed by the `/sys` and `/proc` filesystems.
 
-**Example Curl message for one running container**
+This plugin supports and automatically detects both `cgroups v1` and `v2`.
 
+### Example `curl` message for one running container
+
+You can run the following `curl` command:
+
+```shell
+curl 0.0.0.0:2021/metrics
 ```
-$> curl 0.0.0.0:2021/metrics
+
+Which returns information like:
+
+```text
 # HELP fluentbit_input_bytes_total Number of input bytes.
 # TYPE fluentbit_input_bytes_total counter
 fluentbit_input_bytes_total{name="podman_metrics.0"} 0
@@ -45,10 +53,10 @@ container_network_receive_bytes_total{id="858319c39f3f52cd44aa91a520aafb84ded3bc
 # HELP container_network_receive_errors_total Network received errors
 # TYPE container_network_receive_errors_total counter
 container_network_receive_errors_total{id="858319c39f3f52cd44aa91a520aafb84ded3bc4b4a1e04130ccf87043149bbbf",name="blissful_wescoff",image="docker.io/library/ubuntu:latest",interface="eth0"} 0
-# HELP container_network_transmit_bytes_total Network transmited bytes
+# HELP container_network_transmit_bytes_total Network transmitted bytes
 # TYPE container_network_transmit_bytes_total counter
 container_network_transmit_bytes_total{id="858319c39f3f52cd44aa91a520aafb84ded3bc4b4a1e04130ccf87043149bbbf",name="blissful_wescoff",image="docker.io/library/ubuntu:latest",interface="eth0"} 962
-# HELP container_network_transmit_errors_total Network transmitedd errors
+# HELP container_network_transmit_errors_total Network transmitted errors
 # TYPE container_network_transmit_errors_total counter
 container_network_transmit_errors_total{id="858319c39f3f52cd44aa91a520aafb84ded3bc4b4a1e04130ccf87043149bbbf",name="blissful_wescoff",image="docker.io/library/ubuntu:latest",interface="eth0"} 0
 # HELP fluentbit_input_storage_overlimit Is the input memory usage overlimit ?.
@@ -74,35 +82,57 @@ fluentbit_input_storage_chunks_busy{name="podman_metrics.0"} 0
 fluentbit_input_storage_chunks_busy_bytes{name="podman_metrics.0"} 0
 ```
 
-### Configuration File
+### Configuration file
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
+```yaml
+pipeline:
+  inputs:
+    - name: podman_metrics
+      scrape_interval: 10
+      scrape_on_start: true
+      
+  outputs:
+    - name: prometheus_exporter
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    name podman_metrics
-    scrape_interval 10
-    scrape_on_start true
+  name podman_metrics
+  scrape_interval 10
+  scrape_on_start true
+    
 [OUTPUT]
-    name prometheus_exporter
+  name prometheus_exporter
 ```
 
-### Command Line
+{% endtab %}
+{% endtabs %}
 
-```
-$> fluent-bit -i podman_metrics -o prometheus_exporter
+### Command line
+
+```shell
+fluent-bit -i podman_metrics -o prometheus_exporter
 ```
 
 ### Exposed metrics
 
 Currently supported counters are:
-- container_memory_usage_bytes
-- container_memory_max_usage_bytes
-- container_memory_rss
-- container_spec_memory_limit_bytes
-- container_cpu_user_seconds_total
-- container_cpu_usage_seconds_total
-- container_network_receive_bytes_total
-- container_network_receive_errors_total
-- container_network_transmit_bytes_total
-- container_network_transmit_errors_total
-
-> This plugin mimics naming convetion of docker metrics exposed by [cadvisor](https://github.com/google/cadvisor) project
+
+- `container_memory_usage_bytes`
+- `container_memory_max_usage_bytes`
+- `container_memory_rss`
+- `container_spec_memory_limit_bytes`
+- `container_cpu_user_seconds_total`
+- `container_cpu_usage_seconds_total`
+- `container_network_receive_bytes_total`
+- `container_network_receive_errors_total`
+- `container_network_transmit_bytes_total`
+- `container_network_transmit_errors_total`
+
+This plugin mimics the naming convention of Docker metrics exposed by [`cadvisor`](https://github.com/google/cadvisor).
\ No newline at end of file
diff --git a/pipeline/inputs/process-exporter-metrics.md b/pipeline/inputs/process-exporter-metrics.md
index 5c933bce2..a6f15fd9b 100644
--- a/pipeline/inputs/process-exporter-metrics.md
+++ b/pipeline/inputs/process-exporter-metrics.md
@@ -1,54 +1,90 @@
 ---
-description: >-
-  A plugin based on Process Exporter to collect process level of metrics of system
+description: A plugin based on Process Exporter to collect process level of metrics of system
   metrics
 ---
 
-# Process Exporter Metrics
+# Process exporter metrics
 
-[Prometheus Node Exporter](https://github.com/prometheus/node_exporter) is a popular way to collect system level metrics from operating systems, such as CPU / Disk / Network / Process statistics.
-Fluent Bit 2.2 onwards includes a process exporter plugin that builds off the Prometheus design to collect process level metrics without having to manage two separate processes or agents.
+[Prometheus Node exporter](https://github.com/prometheus/node_exporter) is a popular way to collect system level metrics from operating systems such as CPU, disk, network, and process statistics.
 
-The Process Exporter Metrics plugin implements collecting of the various metrics available from [the 3rd party implementation of Prometheus Process Exporter](https://github.com/ncabatoff/process-exporter) and these will be expanded over time as needed.
+Fluent Bit 2.2 and later includes a process exporter plugin that builds off the Prometheus design to collect process level metrics without having to manage two separate processes or agents.
 
-**Important note:** All metrics including those collected with this plugin flow through a separate pipeline from logs and current filters do not operate on top of metrics.
+The Process Exporter Metrics plugin implements collecting of the various metrics available from [the third party implementation of Prometheus Process Exporter](https://github.com/ncabatoff/process-exporter) and these will be expanded over time as needed.
 
-This plugin is only supported on Linux based operating systems as it uses the `proc` filesystem to access the relevant metrics.
+{% hint style="info" %}
 
-macOS does not have the `proc` filesystem so this plugin will not work for it.
+All metrics including those collected with this plugin flow through a separate pipeline from logs and current filters don't operate on top of metrics. This plugin is only supported on Linux based operating systems as it uses the `proc` filesystem to access the relevant metrics. MacOS doesn't have the `proc` filesystem so this plugin won't work for it.
 
+{% endhint %}
 
 ## Configuration
 
-| Key                       | Description                                                                            | Default   |
-| ------------------------- | -------------------------------------------------------------------------------------- | --------- |
-| scrape\_interval          | The rate at which metrics are collected.                                               | 5 seconds |
-| path.procfs               | The mount point used to collect process information and metrics. Read-only is enough   | /proc/    |
-| process\_include\_pattern | regex to determine which names of processes are included in the metrics produced by this plugin | It is applied for all process unless explicitly set. Default is `.+`. |
-| process\_exclude\_pattern | regex to determine which names of processes are excluded in the metrics produced by this plugin | It is not applied unless explicitly set. Default is `NULL`. |
-| metrics                   | To specify which process level of metrics are collected from the host operating system. These metrics depend on `/proc` fs. The actual values of metrics will be read from `/proc` when needed. cpu, io, memory, state, context\_switches, fd, start\_time, thread\_wchan, thread depend on procfs. | `cpu,io,memory,state,context_switches,fd,start_time,thread_wchan,thread` |
+| Key                       | Description                                                                                                                                                                                                                                                                           | Default                                                                  |
+|---------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------|
+| `scrape_interval`         | The rate, in seconds, at which metrics are collected.                                                                                                                                                                                                                                 | `5`                                                                      |
+| `path.procfs`             | The mount point used to collect process information and metrics. Read-only permissions are enough.                                                                                                                                                                                    | `/proc/`                                                                 |
+| `process_include_pattern` | Regular expression to determine which names of processes are included in the metrics produced by this plugin. It's applied for all process unless explicitly set.                                                                                                                     | `.+`                                                                     |
+| `process_exclude_pattern` | Regular expression to determine which names of processes are excluded in the metrics produced by this plugin. It's not applied unless explicitly set.                                                                                                                                 | `NULL`                                                                   |
+| `metrics`                 | Specify which process level of metrics are collected from the host operating system. Actual values of metrics will be read from `/proc` when needed. `cpu`, `io`, `memory`, `state`, `context_switches`, `fd,` `start_time`, `thread_wchan`, and `thread` metrics depend on `procfs`. | `cpu,io,memory,state,context_switches,fd,start_time,thread_wchan,thread` |
 
-## Metrics Available
+## Available  metrics
 
-| Name              | Description                                                                                      |
-| ----------------- | -------------------------------------------------- |
-| cpu               | Exposes CPU statistics from `/proc`.               |
-| io                | Exposes I/O statistics from `/proc`.               |
-| memory            | Exposes memory statistics from `/proc`.            |
-| state             | Exposes process state statistics from `/proc`.     |
-| context\_switches | Exposes context\_switches statistics from `/proc`. |
-| fd                | Exposes file descriptors statistics from `/proc`.  |
-| start\_time       | Exposes start\_time statistics from `/proc`.       |
-| thread\_wchan     | Exposes thread\_wchan from `/proc`.                |
-| thread            | Exposes thread statistics from `/proc`.            |
+| Name               | Description                                         |
+|--------------------|-----------------------------------------------------|
+| `cpu`              | Exposes CPU statistics from `/proc`.                |
+| `io`               | Exposes I/O statistics from `/proc`.                |
+| `memory`           | Exposes memory statistics from `/proc`.             |
+| `state`            | Exposes process state statistics from `/proc`.      |
+| `context_switches` | Exposes `context_switches` statistics from `/proc`. |
+| `fd`               | Exposes file descriptors statistics from `/proc`.   |
+| `start_time`       | Exposes `start_time` statistics from `/proc`.       |
+| `thread_wchan`     | Exposes `thread_wchan` from `/proc`.                |
+| `thread`           | Exposes thread statistics from `/proc`.             |
 
-## Getting Started
+## Threading
 
-### Simple Configuration File
+This input always runs in its own [thread](../../administration/multithreading.md#inputs).
 
-In the following configuration file, the input plugin _process\_exporter\_metrics collects _metrics every 2 seconds and exposes them through our [Prometheus Exporter](../outputs/prometheus-exporter.md) output plugin on HTTP/TCP port 2021.
+## Getting started
 
+### Configuration file
+
+In the following configuration file, the input plugin `process_exporter_metrics` collects metrics every 2 seconds and exposes them through the [Prometheus Exporter](../outputs/prometheus-exporter.md) output plugin on HTTP/TCP port 2021.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+# Process Exporter Metrics + Prometheus Exporter
+# -------------------------------------------
+# The following example collect host metrics on Linux and expose
+# them through a Prometheus HTTP end-point.
+#
+# After starting the service try it with:
+#
+# $ curl http://127.0.0.1:2021/metrics
+#
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: process_exporter_metrics
+      tag:  process_metrics
+      scrape_interval: 2
+
+  outputs:
+    - name: prometheus_exporter
+      match: process_metrics
+      host: 0.0.0.0
+      port: 2021
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 # Process Exporter Metrics + Prometheus Exporter
 # -------------------------------------------
 # The following example collect host metrics on Linux and expose
@@ -59,45 +95,49 @@ In the following configuration file, the input plugin _process\_exporter\_metric
 # $ curl http://127.0.0.1:2021/metrics
 #
 [SERVICE]
-    flush           1
-    log_level       info
+  flush           1
+  log_level       info
 
 [INPUT]
-    name            process_exporter_metrics
-    tag             process_metrics
-    scrape_interval 2
+  name            process_exporter_metrics
+  tag             process_metrics
+  scrape_interval 2
 
 [OUTPUT]
-    name            prometheus_exporter
-    match           process_metrics
-    host            0.0.0.0
-    port            2021
+  name            prometheus_exporter
+  match           process_metrics
+  host            0.0.0.0
+  port            2021
 ```
 
-You can see the metrics by using _curl:_
+{% endtab %}
+{% endtabs %}
 
-```bash
+You can see the metrics by using `curl`:
+
+```shell
 curl http://127.0.0.1:2021/metrics
 ```
 
-### Container to Collect Host Metrics
+### Container to collect host metrics
 
 When deploying Fluent Bit in a container you will need to specify additional settings to ensure that Fluent Bit has access to the process details.
-The following `docker` command deploys Fluent Bit with a specific mount path for `procfs` and settings enabled to ensure that Fluent Bit can collect from the host. 
-These are then exposed over port 2021.
 
-```
+The following `docker` command deploys Fluent Bit with a specific mount path for `procfs` and settings enabled to ensure that Fluent Bit can collect from the host. These are then exposed over port 2021.
+
+```shell
 docker run -ti -v /proc:/host/proc:ro \
-               -p 2021:2021        \
-               fluent/fluent-bit:2.2 \
-               /fluent-bit/bin/fluent-bit \
-                         -i process_exporter_metrics -p path.procfs=/host/proc  \
-                         -o prometheus_exporter \
-                         -f 1
+            -p 2021:2021        \
+            fluent/fluent-bit:2.2 \
+            /fluent-bit/bin/fluent-bit \
+            -i process_exporter_metrics \
+            -p path.procfs=/host/proc  \
+            -o prometheus_exporter \
+            -f 1
 ```
 
-## Enhancement Requests
+## Enhancement requests
+
+Development prioritises a subset of the available collectors in the [third party implementation of Prometheus Process Exporter](https://github.com/ncabatoff/process-exporter). To request others, open a GitHub issue by using the following template:
 
-Development prioritises a subset of the available collectors in the [the 3rd party implementation of Prometheus Process Exporter](https://github.com/ncabatoff/process-exporter), to request others please open a Github issue by using the following template:\
-\
-\- [in_process_exporter_metrics](https://github.com/fluent/fluent-bit/issues/new?assignees=\&labels=\&template=feature_request.md\&title=in_process_exporter_metrics:%20add%20ABC%20collector)
+- [`in_process_exporter_metrics`](https://github.com/fluent/fluent-bit/issues/new?assignees=\&labels=\&template=feature_request.md\&title=in_process_exporter_metrics:%20add%20ABC%20collector)
diff --git a/pipeline/inputs/process.md b/pipeline/inputs/process.md
index f4a618466..a9bb99841 100644
--- a/pipeline/inputs/process.md
+++ b/pipeline/inputs/process.md
@@ -1,66 +1,86 @@
-# Process Metrics
+# Process metrics
 
-_Process_ input plugin allows you to check how healthy a process is. It does so by performing a service check at every certain interval of time specified by the user.
+The _Process metrics_ input plugin lets you check how healthy a process is. It does so by performing service checks at specified intervals.
 
-The Process metrics plugin creates metrics that are log-based \(I.e. JSON payload\). If you are looking for Prometheus-based metrics please see the Node Exporter Metrics input plugin. 
+This plugin creates metrics that are log-based, such as JSON payloads. For Prometheus-based metrics, see the [Node exporter metrics](./node-exporter-metrics.md) input plugin.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description |
-| :--- | :--- |
-| Proc\_Name | Name of the target Process to check. |
-| Interval\_Sec | Interval in seconds between the service checks. Default value is _1_. |
-| Interval\_Nsec | Specify a nanoseconds interval for service checks, it works in conjunction with the Interval\_Sec configuration key. Default value is _0_. |
-| Alert | If enabled, it will only generate messages if the target process is down. By default this option is disabled. |
-| Fd | If enabled, a number of fd is appended to each records. Default value is true. |
-| Mem | If enabled, memory usage of the process is appended to each records. Default value is true. |
+| Key             | Description                                                                                                   | Default |
+|-----------------|---------------------------------------------------------------------------------------------------------------|---------|
+| `Proc_Name`     | The name of the target process to check.                                                                      | _none_  |
+| `Interval_Sec`  | Specifies the interval between service checks, in seconds.                                                    | `1`     |
+| `Interval_Nsec` | Specifies the interval between service checks, in nanoseconds. This works in conjunction with `Interval_Sec`. | `0`     |
+| `Alert`         | If enabled, the plugin will only generate messages if the target process is down.                             | `false` |
+| `Fd`            | If enabled, a number of `fd` is appended to each record.                                                      | `true`  |
+| `Mem`           | If enabled, memory usage of the process is appended to each record.                                           | `true`  |
+| `Threaded`      | Specifies whether to run this input in its own [thread](../../administration/multithreading.md#inputs).       | `false` |
 
-## Getting Started
+## Get started
 
-In order to start performing the checks, you can run the plugin from the command line or through the configuration file:
+To start performing the checks, you can run the plugin from the command line or through the configuration file:
 
-The following example will check the health of _crond_ process.
+The following example checks the health of `crond` process.
 
-```bash
-$ fluent-bit -i proc -p proc_name=crond -o stdout
+```shell
+fluent-bit -i proc -p proc_name=crond -o stdout
 ```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+In your main configuration file, append the following sections:
 
-```python
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: proc
+      proc_name: crond
+      interval_sec: 1
+      interval_nsec: 0
+      fd: true
+      mem: true
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name          proc
-    Proc_Name     crond
-    Interval_Sec  1
-    Interval_NSec 0
-    Fd            true
-    Mem           true
+  Name          proc
+  Proc_Name     crond
+  Interval_Sec  1
+  Interval_NSec 0
+  Fd            true
+  Mem           true
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ## Testing
 
-Once Fluent Bit is running, you will see the health of process:
+After Fluent Bit starts running, it outputs the health of the process:
 
-```bash
+```shell
 $ fluent-bit -i proc -p proc_name=fluent-bit -o stdout
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
 
-[2017/01/30 21:44:56] [ info] [engine] started
+...
 [0] proc.0: [1485780297, {"alive"=>true, "proc_name"=>"fluent-bit", "pid"=>10964, "mem.VmPeak"=>14740000, "mem.VmSize"=>14740000, "mem.VmLck"=>0, "mem.VmHWM"=>1120000, "mem.VmRSS"=>1120000, "mem.VmData"=>2276000, "mem.VmStk"=>88000, "mem.VmExe"=>1768000, "mem.VmLib"=>2328000, "mem.VmPTE"=>68000, "mem.VmSwap"=>0, "fd"=>18}]
 [1] proc.0: [1485780298, {"alive"=>true, "proc_name"=>"fluent-bit", "pid"=>10964, "mem.VmPeak"=>14740000, "mem.VmSize"=>14740000, "mem.VmLck"=>0, "mem.VmHWM"=>1148000, "mem.VmRSS"=>1148000, "mem.VmData"=>2276000, "mem.VmStk"=>88000, "mem.VmExe"=>1768000, "mem.VmLib"=>2328000, "mem.VmPTE"=>68000, "mem.VmSwap"=>0, "fd"=>18}]
 [2] proc.0: [1485780299, {"alive"=>true, "proc_name"=>"fluent-bit", "pid"=>10964, "mem.VmPeak"=>14740000, "mem.VmSize"=>14740000, "mem.VmLck"=>0, "mem.VmHWM"=>1152000, "mem.VmRSS"=>1148000, "mem.VmData"=>2276000, "mem.VmStk"=>88000, "mem.VmExe"=>1768000, "mem.VmLib"=>2328000, "mem.VmPTE"=>68000, "mem.VmSwap"=>0, "fd"=>18}]
 [3] proc.0: [1485780300, {"alive"=>true, "proc_name"=>"fluent-bit", "pid"=>10964, "mem.VmPeak"=>14740000, "mem.VmSize"=>14740000, "mem.VmLck"=>0, "mem.VmHWM"=>1152000, "mem.VmRSS"=>1148000, "mem.VmData"=>2276000, "mem.VmStk"=>88000, "mem.VmExe"=>1768000, "mem.VmLib"=>2328000, "mem.VmPTE"=>68000, "mem.VmSwap"=>0, "fd"=>18}]
+...
 ```
-
diff --git a/pipeline/inputs/prometheus-remote-write.md b/pipeline/inputs/prometheus-remote-write.md
index f23ecc40b..3052f6901 100644
--- a/pipeline/inputs/prometheus-remote-write.md
+++ b/pipeline/inputs/prometheus-remote-write.md
@@ -2,76 +2,101 @@
 description: An input plugin to ingest payloads of Prometheus remote write
 ---
 
-# Prometheus Remote Write
+# Prometheus remote write
 
-This input plugin allows you to ingest a payload in the Prometheus remote-write format, i.e. a remote write sender can transmit data to Fluent Bit.
+The _Prometheus remote write_ input plugin lets you ingest a payload in the Prometheus remote-write format. A remote-write sender can transmit data to Fluent Bit.
 
-## Configuration
+## Configuration parameters
 
-| Key           | Description                                                                                                                                    | default |
-| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| listen            | The address to listen on                                                                                                                       | 0.0.0.0 |
-| port              | The port for Fluent Bit to listen on                                                                                                           | 8080    |
-| buffer\_max\_size   | Specify the maximum buffer size in KB to receive a JSON message.                                                                               | 4M      |
-| buffer\_chunk\_size | This sets the chunk size for incoming incoming JSON messages. These chunks are then stored/managed in the space available by buffer_max_size.  | 512K    |
-|successful\_response\_code | It allows to set successful response code. `200`, `201` and `204` are supported.| 201 |
-| tag\_from\_uri      | If true, tag will be created from uri, e.g. api\_prom\_push from /api/prom/push, and any tag specified in the config will be ignored. If false then a tag must be provided in the config for this input. | true    |
-| uri               | Specify an optional HTTP URI for the target web server listening for prometheus remote write payloads, e.g: /api/prom/push                       | |
+| Key                        | Description                                                                                                                                                                                                                                      | Default   |
+|----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------|
+| `listen`                   | The address to listen on.                                                                                                                                                                                                                        | `0.0.0.0` |
+| `port`                     | The port to listen on.                                                                                                                                                                                                                           | `8080`    |
+| `buffer_max_size`          | Specifies the maximum buffer size in KB to receive a JSON message.                                                                                                                                                                               | `4M`      |
+| `buffer_chunk_size`        | Sets the chunk size for incoming JSON messages. These chunks are then stored and managed in the space specified by `buffer_max_size`.                                                                                                            | `512K`    |
+| `successful_response_code` | Specifies the success response code. Supported values are `200`, `201`, and `204`.                                                                                                                                                               | `201`     |
+| `tag_from_uri`             | If true, a tag will be created from the `uri` parameter (for example, `api_prom_push` from `/api/prom/push`), and any tag specified in the configuration will be ignored. If false, you must provide a tag in the configuration for this plugin. | `true`    |
+| `uri`                      | Specifies an optional HTTP URI for the target web server listening for Prometheus remote write payloads (for example, `/api/prom/push`).                                                                                                         | _none_    |
+| `threaded`                 | Specifies whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                                                                                                                                          | `false`   |
 
+## Configuration file
 
-A sample config file to get started will look something like the following:
-
+The following examples are sample configuration files for this input plugin:
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: prometheus_remote_write
+      listen: 127.0.0.1
+      port: 8080
+      uri: /api/prom/push
+
+  outputs:
+    - name: stdout
+      match: '*'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-	name prometheus_remote_write
-	listen 127.0.0.1
-	port 8080
-	uri /api/prom/push
+  name prometheus_remote_write
+  listen 127.0.0.1
+  port 8080
+  uri /api/prom/push
 
 [OUTPUT]
-	name stdout
-	match *
+  name stdout
+  match *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: prometheus_remote_write
-          listen: 127.0.0.1
-          port: 8080
-          uri: /api/prom/push
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
-With the above configuration, Fluent Bit will listen on port `8080` for data.
-You can now send payloads in Prometheus remote write format to the endpoint `/api/prom/push`.
+These sample configurations configure Fluent Bit to listen for data on port `8080`. You can send payloads in Prometheus remote-write format to the endpoint `/api/prom/push`.
 
 ## Examples
 
 ### Communicate with TLS
 
-Prometheus Remote Write input plugin supports TLS/SSL, for more details about the properties available and general configuration, please refer to the [TLS/SSL](../../administration/transport-security.md) section.
+The Prometheus remote write input plugin supports TLS and SSL. For more details about the properties available and general configuration, refer to the [Transport security](../../administration/transport-security.md) documentation.
+
+To communicate with TLS, you must use these TLS-related parameters:
 
-Communicating with TLS, you will need to use the tls related parameters:
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
+```yaml
+pipeline:
+  inputs:
+    - name: prometheus_remote_write
+      listen: 127.0.0.1
+      port: 8080
+      uri: /api/prom/push
+      tls: on
+      tls.crt_file: /path/to/certificate.crt
+      tls.key_file: /path/to/certificate.key
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-	Name prometheus_remote_write
-	Listen 127.0.0.1
-	Port 8080
-	Uri /api/prom/push
-	Tls On
-	tls.crt_file /path/to/certificate.crt
-	tls.key_file /path/to/certificate.key
+  Name prometheus_remote_write
+  Listen 127.0.0.1
+  Port 8080
+  Uri /api/prom/push
+  Tls On
+  tls.crt_file /path/to/certificate.crt
+  tls.key_file /path/to/certificate.key
 ```
 
-Now, you should be able to send data over TLS to the remote write input.
+{% endtab %}
+{% endtabs %}
+
+Now, you should be able to send data over TLS to the remote-write input.
\ No newline at end of file
diff --git a/pipeline/inputs/prometheus-scrape-metrics.md b/pipeline/inputs/prometheus-scrape-metrics.md
index d068de3ac..7c2e6e341 100644
--- a/pipeline/inputs/prometheus-scrape-metrics.md
+++ b/pipeline/inputs/prometheus-scrape-metrics.md
@@ -1,40 +1,63 @@
-# Prometheus Scrape Metrics
+# Prometheus scrape metrics
 
-Fluent Bit 1.9 includes additional metrics features to allow you to collect both logs and metrics with the same collector.&#x20;
+Fluent Bit 1.9 and later includes additional metrics features to let you collect logs and metrics from a Prometheus-based endpoint at a set interval. These metrics can be routed to metric supported endpoints such as [Prometheus Exporter](../outputs/prometheus-exporter.md), [InfluxDB](../outputs/influxdb.md) or [Prometheus Remote Write](../outputs/prometheus-remote-write.md).
 
-The initial release of the Prometheus Scrape metric allows you to collect metrics from a Prometheus-based endpoint at a set interval. These metrics can be routed to metric supported endpoints such as [Prometheus Exporter](../outputs/prometheus-exporter.md), [InfluxDB](../outputs/influxdb.md), or [Prometheus Remote Write](../outputs/prometheus-remote-write.md)
+## Configuration
 
-## Configuration <a href="#configuration" id="configuration"></a>
-
-| Key             | Description                                                                                                                                          | Default  |
-| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
-| host            | The host of the prometheus metric endpoint that you want to scrape                                                                                   |          |
-| port            | The port of the prometheus metric endpoint that you want to scrape                                                                                    |          |
-| scrape\_interval | The interval to scrape metrics                                                                                                                       | 10s      |
-| metrics\_path   | <p>The metrics URI endpoint, that must start with a forward slash.<br><br>Note: Parameters can also be added to the path by using <code>?</code></p> | /metrics |
+| Key               | Description                                                                                                             | Default    |
+|-------------------|-------------------------------------------------------------------------------------------------------------------------|------------|
+| `host`            | The host of the Prometheus metric endpoint to scrape.                                                                   | _none_     |
+| `port`            | The port of the Prometheus metric endpoint to scrape.                                                                   | _none_     |
+| `scrape_interval` | The interval to scrape metrics.                                                                                         | `10s`      |
+| `metrics_path`    | The metrics URI endpoint, which must start with a forward slash (`/`). Parameters can be added to the path by using `?` | `/metrics` |
+| `threaded`        | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                 | `false`    |
 
 ## Example
 
-If an endpoint exposes Prometheus Metrics we can specify the configuration to scrape and then output the metrics. In the following example, we retrieve metrics from the HashiCorp Vault application.
+If an endpoint exposes Prometheus Metrics you can specify the configuration to scrape and then output the metrics. The following example retrieves metrics from the HashiCorp Vault application.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: prometheus_scrape
+      host: 0.0.0.0
+      port: 8201
+      tag: vault
+      metrics_path: /v1/sys/metrics?format=prometheus
+      scrape_interval: 10s
 
+  outputs:
+    - name: stdout
+      match: '*'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    name prometheus_scrape
-    host 0.0.0.0 
-    port 8201
-    tag vault 
-    metrics_path /v1/sys/metrics?format=prometheus 
-    scrape_interval 10s
+  name prometheus_scrape
+  host 0.0.0.0
+  port 8201
+  tag vault
+  metrics_path /v1/sys/metrics?format=prometheus
+  scrape_interval 10s
 
 [OUTPUT]
-    name stdout
-    match *
-
+  name stdout
+  match *
 ```
 
-**Example Output**
+{% endtab %}
+{% endtabs %}
 
-```
+This returns output similar to:
+
+```text
+...
 2022-03-26T23:01:29.836663788Z go_memstats_alloc_bytes_total = 31891336
 2022-03-26T23:01:29.836663788Z go_memstats_frees_total = 313264
 2022-03-26T23:01:29.836663788Z go_memstats_lookups_total = 0
@@ -77,7 +100,5 @@ If an endpoint exposes Prometheus Metrics we can specify the configuration to sc
 2022-03-26T23:01:29.836663788Z vault_runtime_sys_bytes = 24724488
 2022-03-26T23:01:29.836663788Z vault_runtime_total_gc_pause_ns = 1917611
 2022-03-26T23:01:29.836663788Z vault_runtime_total_gc_runs = 19
+...
 ```
-
-
-
diff --git a/pipeline/inputs/prometheus-textfile.md b/pipeline/inputs/prometheus-textfile.md
new file mode 100644
index 000000000..264bb6877
--- /dev/null
+++ b/pipeline/inputs/prometheus-textfile.md
@@ -0,0 +1,115 @@
+# Prometheus text file
+
+The _Prometheus text file_ input plugin allows Fluent Bit to read metrics from Prometheus text format files (`.prom` files) on the local filesystem. Use this plugin to collect custom metrics that are written to files by external applications or scripts, similar to the Prometheus Node Exporter text file collector.
+
+## Configuration parameters
+
+| Key | Description | Default |
+|-----|-------------|---------|
+| `path` | File or directory path pattern. Supports glob patterns with `*` wildcard (for example, `/var/lib/prometheus/*.prom`). | _none_ |
+| `scrape_interval` | Interval in seconds between file scans. | `10s` |
+
+## Get started
+
+### Basic configuration
+
+The following configuration will monitor `/var/lib/prometheus/textfile` directory for `.prom` files every 15 seconds:
+
+```yaml
+pipeline:
+  inputs:
+    - name: prometheus_textfile
+      tag: custom_metrics
+      path: '/var/lib/prometheus/textfile/*.prom'
+      scrape_interval: 15
+  outputs:
+    - name: prometheus_exporter
+      match: custom_metrics
+      host: 192.168.100.61
+      port: 2021
+```
+
+## Prometheus text format
+
+The plugin expects files to be in the standard Prometheus text exposition format. Here's an example of a valid `.prom` file:
+
+```text
+# HELP custom_counter_total A custom counter metric
+# TYPE custom_counter_total counter
+custom_counter_total{instance="server1",job="myapp"} 42
+
+# HELP custom_gauge A custom gauge metric
+# TYPE custom_gauge gauge
+custom_gauge{environment="production"} 1.23
+
+# HELP custom_histogram_bucket A custom histogram
+# TYPE custom_histogram_bucket histogram
+custom_histogram_bucket{le="0.1"} 10
+custom_histogram_bucket{le="0.5"} 25
+custom_histogram_bucket{le="1.0"} 40
+custom_histogram_bucket{le="+Inf"} 50
+custom_histogram_sum 125.5
+custom_histogram_count 50
+```
+
+## Use cases
+
+### Custom application metrics
+
+Applications can write custom metrics to `.prom` files, and this plugin will collect them:
+
+```bash
+# Script writes metrics to file
+echo "# HELP app_requests_total Total HTTP requests" > /var/lib/prometheus/textfile/app.prom
+echo "# TYPE app_requests_total counter" >> /var/lib/prometheus/textfile/app.prom
+echo "app_requests_total{status=\"200\"} 1500" >> /var/lib/prometheus/textfile/app.prom
+echo "app_requests_total{status=\"404\"} 23" >> /var/lib/prometheus/textfile/app.prom
+```
+
+### Batch job metrics
+
+Cron jobs or batch processes can write completion metrics:
+
+```bash
+#!/bin/bash
+# Backup script writes completion metrics
+BACKUP_START=$(date +%s)
+# ... perform backup ...
+BACKUP_END=$(date +%s)
+DURATION=$((BACKUP_END - BACKUP_START))
+
+cat > /var/lib/prometheus/textfile/backup.prom << EOF
+# HELP backup_duration_seconds Time taken to complete backup
+# TYPE backup_duration_seconds gauge
+backup_duration_seconds ${DURATION}
+
+# HELP backup_last_success_timestamp_seconds Last successful backup timestamp
+# TYPE backup_last_success_timestamp_seconds gauge
+backup_last_success_timestamp_seconds ${BACKUP_END}
+EOF
+```
+
+### System integration
+
+External monitoring tools can write metrics that Fluent Bit will collect and forward.
+
+## Integration with other plugins
+
+
+### OpenTelemetry destination
+
+```yaml
+pipeline:
+  inputs:
+    - name: prometheus_textfile
+      tag: textfile_metrics
+      path: /var/lib/prometheus/textfile
+    - name: node_exporter_metrics
+      tag: system_metrics
+      scrape_interval: 15
+  outputs:
+    - name: opentelemetry
+      match: '*'
+      host: 192.168.56.4
+      port: 2021
+```
diff --git a/pipeline/inputs/random.md b/pipeline/inputs/random.md
index 73be22a82..9ea0ada7e 100644
--- a/pipeline/inputs/random.md
+++ b/pipeline/inputs/random.md
@@ -1,81 +1,80 @@
 # Random
 
-_Random_ input plugin generate very simple random value samples using the device interface _/dev/urandom_, if not available it will use a unix timestamp as value.
+The _Random_ input plugin generates random value samples using the device interface `/dev/urandom`. If that interface is unavailable, it uses a Unix timestamp as a value.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description |
-| :--- | :--- |
-| Samples | If set, it will only generate a specific number of samples. By default this value is set to _-1_, which will generate unlimited samples. |
-| Interval\_Sec | Interval in seconds between samples generation. Default value is _1_. |
-| Interval\_Nsec | Specify a nanoseconds interval for samples generation, it works in conjunction with the Interval\_Sec configuration key. Default value is _0_. |
+| Key             | Description                                                                                                      | Default |
+|-----------------|------------------------------------------------------------------------------------------------------------------|---------|
+| `Samples`       | Specifies the number of samples to generate. The default value of `-1` generates unlimited samples.              | `-1`    |
+| `Interval_Sec`  | Specifies the interval between generated samples, in seconds.                                                    | `1`     |
+| `Interval_Nsec` | Specifies the interval between generated samples, in nanoseconds. This works in conjunction with `Interval_Sec`. | `0`     |
+| `Threaded`      | Specifies whether to run this input in its own [thread](../../administration/multithreading.md#inputs).          | `false` |
 
-## Getting Started
+## Get started
 
-In order to start generating random samples, you can run the plugin from the command line or through the configuration file:
+To start generating random samples, you can either run the plugin from the command line or through a configuration file.
 
-### Command Line
+### Command line
 
-From the command line you can let Fluent Bit generate the samples with the following options:
+Use the following command line options to generate samples.
 
-```bash
-$ fluent-bit -i random -o stdout
+```shell
+fluent-bit -i random -o stdout
 ```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+The following examples are sample configuration files for this input plugin:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: random
+      samples: -1
+      interval_sec: 1
+      interval_nsec: 0
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name          random
-    Samples      -1
-    Interval_Sec  1
-    Interval_NSec 0
+  Name          random
+  Samples      -1
+  Interval_Sec  1
+  Interval_NSec 0
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: random
-          samples: -1
-          interval_sec: 1
-          interval_nsec: 0
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
-
 ## Testing
 
-Once Fluent Bit is running, you will see the reports in the output interface similar to this:
+After Fluent Bit starts running, it generates reports in the output interface:
 
-```bash
+```shell
 $ fluent-bit -i random -o stdout
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
 
-[2016/10/07 20:27:34] [ info] [engine] started
+...
 [0] random.0: [1475893654, {"rand_value"=>1863375102915681408}]
 [1] random.0: [1475893655, {"rand_value"=>425675645790600970}]
 [2] random.0: [1475893656, {"rand_value"=>7580417447354808203}]
 [3] random.0: [1475893657, {"rand_value"=>1501010137543905482}]
 [4] random.0: [1475893658, {"rand_value"=>16238242822364375212}]
-```
-
+...
+```
\ No newline at end of file
diff --git a/pipeline/inputs/serial-interface.md b/pipeline/inputs/serial-interface.md
index 01c4451a6..2f30eeabb 100644
--- a/pipeline/inputs/serial-interface.md
+++ b/pipeline/inputs/serial-interface.md
@@ -1,128 +1,164 @@
-# Serial Interface
+# Serial interface
 
-The **serial** input plugin, allows to retrieve messages/data from a _Serial_ interface.
+The _Serial_ input plugin lets you retrieve messages and data from a serial interface.
 
-## Configuration Parameters
+## Configuration parameters
 
-| Key | Description |
-| :--- | :--- |
-| File | Absolute path to the device entry, e.g: /dev/ttyS0 |
-| Bitrate | The bitrate for the communication, e.g: 9600, 38400, 115200, etc |
-| Min\_Bytes | The serial interface will expect at least _Min\_Bytes_ to be available before to process the message \(default: 1\) |
-| Separator | Allows to specify a _separator_ string that's used to determinate when a message ends. |
-| Format | Specify the format of the incoming data stream. The only option available is 'json'. Note that _Format_ and _Separator_ cannot be used at the same time. |
+This plugin has the following configuration parameters:
 
-## Getting Started
+| Key         | Description                                                                                              | Default                             |
+|:------------|:---------------------------------------------------------------------------------------------------------|-------------------------------------|
+| `File`      | Absolute path to the device entry. For example, `/dev/ttyS0`.                                            | _none_                              |
+| `Bitrate`   | The bit rate for the communication. For example: `9600`, `38400`, `115200`.                              | _none_                              |
+| `Min_Bytes` | The serial interface expects at least `Min_Bytes` to be available before processing the message.         | `1`                                 |
+| `Separator` | Specify a separator string that's used to determinate when a message ends.                               | _none_                              |
+| `Format`    | Specify the format of the incoming data stream. `Format` and `Separator` can't be used at the same time. | `json` (no other options available) |
+| `Threaded`  | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).  | `false`                             |
 
-In order to retrieve messages over the _Serial_ interface, you can run the plugin from the command line or through the configuration file:
+## Get started
 
-### Command Line
+To retrieve messages by using the Serial interface, you can run the plugin from the command line or through the configuration file:
 
-The following example loads the input _serial_ plugin where it set a Bitrate of 9600, listen from the _/dev/tnt0_ interface and use the custom tag _data_ to route the message.
+### Command line
 
-```text
-$ fluent-bit -i serial -t data -p File=/dev/tnt0 -p BitRate=9600 -o stdout -m '*'
+The following example loads the input serial plugin where it set a `Bitrate` of `9600`, listens from the `/dev/tnt0` interface, and uses the custom tag `data` to route the message.
+
+```shell
+fluent-bit -i serial -t data -p File=/dev/tnt0 -p BitRate=9600 -o stdout -m '*'
 ```
 
-The above interface \(/dev/tnt0\) is an emulation of the serial interface \(more details at bottom\), for demonstrative purposes we will write some message to the other end of the interface, in this case _/dev/tnt1_, e.g:
+The interface (`/dev/tnt0`) is an emulation of the serial interface. Further examples will write some message to the other end of the interface. For example, `/dev/tnt1`.
 
-```text
-$ echo 'this is some message' > /dev/tnt1
+```shell
+echo 'this is some message' > /dev/tnt1
 ```
 
-In Fluent Bit you should see an output like this:
+In Fluent Bit you can run the command:
+
+```shell
+fluent-bit -i serial -t data -p File=/dev/tnt0 -p BitRate=9600 -o stdout -m '*'
+```
 
-```bash
-$ fluent-bit -i serial -t data -p File=/dev/tnt0 -p BitRate=9600 -o stdout -m '*'
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+Which should produce output like:
 
-[2016/05/20 15:44:39] [ info] starting engine
+```text
+...
 [0] data: [1463780680, {"msg"=>"this is some message"}]
+...
 ```
 
-Now using the _Separator_ configuration, we could send multiple messages at once \(run this command after starting Fluent Bit\):
+Using the `Separator` configuration, you can send multiple messages at once.
 
-```text
-$ echo 'aaXbbXccXddXee' > /dev/tnt1
+Run this command after starting Fluent Bit:
+
+```shell
+echo 'aaXbbXccXddXee' > /dev/tnt1
 ```
 
-```text
-$ fluent-bit -i serial -t data -p File=/dev/tnt0 -p BitRate=9600 -p Separator=X -o stdout -m '*'
-Fluent-Bit v0.8.0
-Copyright (C) Treasure Data
+Then, run Fluent Bit:
+
+```shell
+fluent-bit -i serial -t data -p File=/dev/tnt0 -p BitRate=9600 -p Separator=X -o stdout -m '*'
+```
+
+This should produce results similar to the following:
 
-[2016/05/20 16:04:51] [ info] starting engine
+```text
+...
 [0] data: [1463781902, {"msg"=>"aa"}]
 [1] data: [1463781902, {"msg"=>"bb"}]
 [2] data: [1463781902, {"msg"=>"cc"}]
 [3] data: [1463781902, {"msg"=>"dd"}]
+...
 ```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file append the following sections:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+```yaml
+pipeline:
+  inputs:
+    - name: serial
+      tag: data
+      file: /dev/tnt0
+      bitrate: 9600
+      separator: X
 
-```python
+  outputs:
+    - name: stdout
+      match: '*'        
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name      serial
-    Tag       data
-    File      /dev/tnt0
-    BitRate   9600
-    Separator X
+  Name      serial
+  Tag       data
+  File      /dev/tnt0
+  BitRate   9600
+  Separator X
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
 
-## Emulating Serial Interface on Linux
+{% endtab %}
+{% endtabs %}
 
-The following content is some extra information that will allow you to emulate a serial interface on your Linux system, so you can test this _Serial_ input plugin locally in case you don't have such interface in your computer. The following procedure has been tested on Ubuntu 15.04 running a Linux Kernel 4.0.
+## Emulating a serial interface on Linux
 
-## Build and install the tty0tty module
+You can emulate a serial interface on your Linux system and test the serial input plugin locally when you don't have an interface in your computer. The following procedure has been tested on Ubuntu 15.04 running Linux Kernel 4.0.
 
-Download the sources
+### Build and install the `tty0tty` module
 
-```bash
-$ git clone https://github.com/freemed/tty0tty
-```
+1. Download the sources:
 
-Unpack and compile
+   ```shell
+   git clone https://github.com/freemed/tty0tty
+   ```
 
-```bash
-$ cd tty0tty/module
-$ make
-```
+2. Unpack and compile:
 
-Copy the new kernel module into the kernel modules directory
+   ```shell
+   cd tty0tty/module
+   
+   make
+   ```
 
-```bash
-$ sudo cp tty0tty.ko /lib/modules/$(uname -r)/kernel/drivers/misc/
-```
+3. Copy the new kernel module into the kernel modules directory:
 
-Load the module
+   ```shell
+   sudo cp tty0tty.ko /lib/modules/$(uname -r)/kernel/drivers/misc/
+   ```
 
-```bash
-$ sudo depmod
-$ sudo modprobe tty0tty
-```
+4. Load the module:
 
-You should see new serial ports in /dev/ \(ls /dev/tnt\*\) Give appropriate permissions to the new serial ports:
+   ```shell
+   sudo depmod
+   
+   sudo modprobe tty0tty
+   ```
 
-```bash
-$ sudo chmod 666 /dev/tnt*
-```
+   You should see new serial ports in `dev` (`ls /dev/tnt\*\`).
+
+5. Give appropriate permissions to the new serial ports:
+
+   ```shell
+   sudo chmod 666 /dev/tnt*
+   ```
 
 When the module is loaded, it will interconnect the following virtual interfaces:
 
-```bash
+```text
 /dev/tnt0 <=> /dev/tnt1
 /dev/tnt2 <=> /dev/tnt3
 /dev/tnt4 <=> /dev/tnt5
 /dev/tnt6 <=> /dev/tnt7
-```
-
+```
\ No newline at end of file
diff --git a/pipeline/inputs/splunk.md b/pipeline/inputs/splunk.md
index ae23faebb..573e55d23 100644
--- a/pipeline/inputs/splunk.md
+++ b/pipeline/inputs/splunk.md
@@ -1,56 +1,80 @@
-# Splunk (HTTP HEC)
+# Splunk
 
-The **splunk** input plugin handles [Splunk HTTP HEC](https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector) requests.
+The _Splunk_ input plugin handles [Splunk HTTP HEC](https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector) requests.
 
-## Configuration Parameters
+## Configuration parameters
 
-| **Key**                  | Description                                                                                                                                   | default |
-|--------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------|---------|
-| listen                   | The address to listen on                                                                                                                      | 0.0.0.0 |
-| port                     | The port for Fluent Bit to listen on                                                                                                          | 9880    |
-| tag_key                  | Specify the key name to overwrite a tag. If set, the tag will be overwritten by a value of the key.                                           |         |
-| buffer_max_size          | Specify the maximum buffer size in KB to receive a JSON message.                                                                              | 4M      |
-| buffer_chunk_size        | This sets the chunk size for incoming incoming JSON messages. These chunks are then stored/managed in the space available by buffer_max_size. | 512K    |
-| successful_response_code | It allows to set successful response code. `200`, `201` and `204` are supported.                                                              | 201     |
-| splunk\_token           | Add an Splunk token for HTTP HEC.`                                  |         |
+This plugin uses the following configuration parameters:
 
-## Getting Started
+| Key                        | Description                                                                                                                                                        | Default         |
+|----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------|
+| `listen`                   | The address to listen on.                                                                                                                                          | `0.0.0.0`       |
+| `port`                     | The port for Fluent Bit to listen on.                                                                                                                              | `9880`          |
+| `tag_key`                  | Specify the key name to overwrite a tag. If set, the tag will be overwritten by a value of the key.                                                                | _none_          |
+| `buffer_max_size`          | Specify the maximum buffer size in KB to receive a JSON message.                                                                                                   | `4M`            |
+| `buffer_chunk_size`        | This sets the chunk size for incoming JSON messages. These chunks are then stored and managed in the space available by `buffer_max_size`.                         | `512K`          |
+| `successful_response_code` | Set the successful response code. Allowed values: `200`, `201`, and `204`                                                                                          | `201`           |
+| `splunk_token`             | Specify a Splunk token for HTTP HEC authentication. If multiple tokens are specified (with commas and no spaces), usage will be divided across each of the tokens. | _none_          |
+| `store_token_in_metadata`  | Store Splunk HEC tokens in the Fluent Bit metadata. If set to `false`, tokens will be stored as normal key-value pairs in the record data.                         | `true`          |
+| `splunk_token_key`         | Use the specified key for storing the Splunk token for HTTP HEC. Use only when `store_token_in_metadata` is `false`.                                               | `@splunk_token` |
+| `Threaded`                 | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                                                            | `false`         |
 
-In order to start performing the checks, you can run the plugin from the command line or through the configuration file.
+## Get started
 
-#### How to set tag
+To start performing the checks, you can run the plugin from the command line or through the configuration file.
 
-The tag for the Splunk input plugin is set by adding the tag to the end of the request URL by default.
-This tag is then used to route the event through the system.
-The default behavior of the splunk input sets the tags for the following endpoints:
+### Set a tag
 
-* `/services/collector`
-* `/services/collector/event`
-* `/services/collector/raw`
+The tag for the Splunk input plugin is set by adding the tag to the end of the request URL by default. This tag is then used to route the event through the system. The default behavior of the Splunk input sets the tags for the following endpoints:
+
+- `/services/collector`
+- `/services/collector/event`
+- `/services/collector/raw`
 
 The requests for these endpoints are interpreted as `services_collector`, `services_collector_event`, and `services_collector_raw`.
 
-If you want to use the other tags for multiple instantiating input splunk plugin, you have to specify `tag` property on the each of splunk plugin configurations to prevent collisions of data pipeline.
+To use the other tags for multiple instantiating input Splunk plugins, you must specify the `tag` property on each Splunk plugin configuration to prevent data pipeline collisions.
 
-### Command Line
+### Command line
 
 From the command line you can configure Fluent Bit to handle HTTP HEC requests with the following options:
 
-```bash
-$ fluent-bit -i splunk -p port=8088 -o stdout
+```shell
+fluent-bit -i splunk -p port=8088 -o stdout
 ```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file append the following sections:
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-```python
+```yaml
+pipeline:
+  inputs:
+    - name: splunk
+      listen: 0.0.0.0
+      port: 8088
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    name splunk
-    listen 0.0.0.0
-    port 8088
+  name   splunk
+  listen 0.0.0.0
+  port   8088
 
 [OUTPUT]
-    name stdout
-    match *
+  name  stdout
+  match *
 ```
+
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/inputs/standard-input.md b/pipeline/inputs/standard-input.md
index 1259efd7f..0f2062cdf 100644
--- a/pipeline/inputs/standard-input.md
+++ b/pipeline/inputs/standard-input.md
@@ -1,206 +1,255 @@
-# Standard Input
+# Standard input
 
-The **stdin** plugin supports retrieving a message stream from the standard input interface \(stdin\) of the Fluent Bit process.
-In order to use it, specify the plugin name as the input, e.g:
+The _Standard input_ plugin supports retrieving a message stream from the standard input interface (`stdin`) of the Fluent Bit process.
+To use it, specify the plugin name as the input. For example:
 
-```bash
-$ fluent-bit -i stdin -o stdout
+```shell
+fluent-bit -i stdin -o stdout
 ```
 
-If the stdin stream is closed (end-of-file), the stdin plugin will instruct
-Fluent Bit to exit with success (0) after flushing any pending output.
+If the `stdin` stream is closed (`end-of-file`), the plugin instructs Fluent Bit to exit with success (`0`) after flushing any pending output.
+
+## Configuration parameters
+
+The plugin supports the following configuration parameters:
+
+| Key           | Description                                                                                                                                                                                         | Default |
+|:--------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------|
+| `Buffer_Size` | Set the buffer size to read data. This value is used to increase buffer size and must be set according to the [Unit Size](../../administration/configuring-fluent-bit/unit-sizes.md) specification. | `16k`   |
+| `Parser`      | The name of the parser to invoke instead of the default JSON input parser.                                                                                                                          | _none_  |
+| `Threaded`    | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                                                                                             | `false` |
 
 ## Input formats
 
-If no parser is configured for the stdin plugin, it expects *valid JSON* input data in one of the following formats:
+If no parser is configured for the `stdin` plugin, it expects valid JSON input data in one of the following formats:
 
-1. A JSON object with one or more key-value pairs: `{ "key": "value", "key2": "value2" }`
-3. A 2-element JSON array in [Fluent Bit Event](../../concepts/key-concepts.md#event-or-record) format, which may be:
-  * `[TIMESTAMP, { "key": "value" }]` where TIMESTAMP is a floating point value representing a timestamp in seconds; or
-  * from Fluent Bit v2.1.0, `[[TIMESTAMP, METADATA], { "key": "value" }]` where TIMESTAMP has the same meaning as above and and METADATA is a JSON object.
+- A JSON object with one or more key-value pairs: `{ "key": "value", "key2": "value2" }`
+- A 2-element JSON array in [Fluent Bit Event](../../concepts/key-concepts.md#event-or-record) format, which can be:
+  - `[TIMESTAMP, { "key": "value" }]` where TIMESTAMP is a floating point value representing a timestamp in seconds.
+  - From Fluent Bit v2.1.0, `[[TIMESTAMP, METADATA], { "key": "value" }]` where _`TIMESTAMP`_ has the same meaning as previous and _`METADATA`_ is a JSON object.
 
 Multi-line input JSON is supported.
 
-Any input data that is *not* in one of the above formats will cause the plugin to log errors like:
+Any input data which isn't in one of the supported formats will cause the plugin to log errors like:
 
-```
+```text
 [debug] [input:stdin:stdin.0] invalid JSON message, skipping
 [error] [input:stdin:stdin.0] invalid record found, it's not a JSON map or array
 ```
 
-To handle inputs in other formats, a parser must be explicitly specified in the configuration for the `stdin` plugin. See [parser input example](#parser-input-example) for sample configuration.
+To handle inputs in other formats, a parser must be explicitly specified in the configuration for the `stdin` plugin. See [parser input example](#parser-input) for sample configuration.
 
 ## Log event timestamps
 
-The Fluent Bit event timestamp will be set from the input record if the 2-element event input is used or a custom parser configuration supplies a timestamp. Otherwise the event timestamp will be set to the timestamp at which the record is read by the stdin plugin.
+The Fluent Bit event timestamp will be set from the input record if the two-element event input is used or a custom parser configuration supplies a timestamp. Otherwise, the event timestamp will be set to the timestamp at which the record is read by the `stdin` plugin.
 
 ## Examples
 
-### Json input example
-
-A better example to demonstrate how it works will be through a _Bash_ script that generates messages and writes them to [Fluent Bit](http://fluentbit.io). Write the following content in a file named _test.sh_:
-
-```bash
-#!/bin/sh
-
-for ((i=0; i<=5; i++)); do
-  echo -n "{\"key\": \"some value\"}"
-  sleep 1
-done
-```
-
-Now lets start the script and [Fluent Bit](http://fluentbit.io):
-
-```bash
-$ bash test.sh | fluent-bit -q -i stdin -o stdout
-[0] stdin.0: [[1684196745.942883835, {}], {"key"=>"some value"}]
-[0] stdin.0: [[1684196746.938949056, {}], {"key"=>"some value"}]
-[0] stdin.0: [[1684196747.940162493, {}], {"key"=>"some value"}]
-[0] stdin.0: [[1684196748.941392297, {}], {"key"=>"some value"}]
-[0] stdin.0: [[1684196749.942644238, {}], {"key"=>"some value"}]
-[0] stdin.0: [[1684196750.943721442, {}], {"key"=>"some value"}]
-```
-
-### Json input with timestamp example
+### JSON input
+
+To demonstrate how the plugin works, you can use a `bash` script that generates messages and writes them to [Fluent Bit](http://fluentbit.io).
+
+1. Write the following content in a file named `test.sh`:
+
+   ```bash
+   #!/bin/sh
+
+   for ((i=0; i<=5; i++)); do
+     echo -n "{\"key\": \"some value\"}"
+     sleep 1
+   done
+   ```
+
+2. Start the script and [Fluent Bit](http://fluentbit.io):
+
+   ```shell
+   bash test.sh | fluent-bit -q -i stdin -o stdout
+   ```
+
+3. The command should return output like the following:
+
+    ```text
+    [0] stdin.0: [[1684196745.942883835, {}], {"key"=>"some value"}]
+    [0] stdin.0: [[1684196746.938949056, {}], {"key"=>"some value"}]
+    [0] stdin.0: [[1684196747.940162493, {}], {"key"=>"some value"}]
+    [0] stdin.0: [[1684196748.941392297, {}], {"key"=>"some value"}]
+    [0] stdin.0: [[1684196749.942644238, {}], {"key"=>"some value"}]
+    [0] stdin.0: [[1684196750.943721442, {}], {"key"=>"some value"}]
+    ```
+
+### JSON input with timestamp
+
+1. An input event timestamp can also be supplied. Replace `test.sh` with:
+
+    ```bash
+    #!/bin/sh
+    
+    for ((i=0; i<=5; i++)); do
+      echo -n "
+        [
+          $(date '+%s.%N' -d '1 day ago'),
+          {
+            \"realtimestamp\": $(date '+%s.%N')
+          }
+        ]
+      "
+      sleep 1
+    done
+    ```
+
+2. Re-run the sample command. Timestamps output by Fluent Bit are now one day old because Fluent Bit used the input message timestamp.
+
+    ```shell
+    bash test.sh | fluent-bit -q -i stdin -o stdout
+    ```
+
+3. Which returns the following:
+
+    ```text
+    [0] stdin.0: [[1684110480.028171300, {}], {"realtimestamp"=>1684196880.030070}]
+    [0] stdin.0: [[1684110481.033753395, {}], {"realtimestamp"=>1684196881.034741}]
+    [0] stdin.0: [[1684110482.036730051, {}], {"realtimestamp"=>1684196882.037704}]
+    [0] stdin.0: [[1684110483.039903879, {}], {"realtimestamp"=>1684196883.041081}]
+    [0] stdin.0: [[1684110484.044719457, {}], {"realtimestamp"=>1684196884.046404}]
+    [0] stdin.0: [[1684110485.048710107, {}], {"realtimestamp"=>1684196885.049651}]
+    ```
+
+### JSON input with metadata
+
+1. Additional metadata is supported in Fluent Bit v2.1.0 and later by replacing the timestamp with a two-element object. For example:
+
+    ```bash
+    #!/bin/sh
+    for ((i=0; i<=5; i++)); do
+      echo -n "
+        [
+          [
+            $(date '+%s.%N' -d '1 day ago'),
+        {\"metakey\": \"metavalue\"}
+          ],
+          {
+            \"realtimestamp\": $(date '+%s.%N')
+          }
+        ]
+      "
+      sleep 1
+    done
+    ```
+
+2. Run test using the command:
+
+    ```shell
+    bash ./test.sh | fluent-bit -q -i stdin -o stdout
+    ```
+
+3. Which returns results like the following:
+
+    ```text
+    [0] stdin.0: [[1684110513.060139417, {"metakey"=>"metavalue"}], {"realtimestamp"=>1684196913.061017}]
+    [0] stdin.0: [[1684110514.063085317, {"metakey"=>"metavalue"}], {"realtimestamp"=>1684196914.064145}]
+    [0] stdin.0: [[1684110515.066210508, {"metakey"=>"metavalue"}], {"realtimestamp"=>1684196915.067155}]
+    [0] stdin.0: [[1684110516.069149971, {"metakey"=>"metavalue"}], {"realtimestamp"=>1684196916.070132}]
+    [0] stdin.0: [[1684110517.072484016, {"metakey"=>"metavalue"}], {"realtimestamp"=>1684196917.073636}]
+    [0] stdin.0: [[1684110518.075428724, {"metakey"=>"metavalue"}], {"realtimestamp"=>1684196918.076292}]
+    ```
+
+4. On older Fluent Bit versions records in this format will be discarded. If the log level permits, Fluent Bit will log:
+
+    ```text
+    [ warn] unknown time format 6
+    ```
+
+### Parser input
+
+To capture inputs in other formats, specify a parser configuration for the `stdin` plugin.
+
+For example, if you want to read raw messages line by line and forward them, you could use a separate parsers file that captures the whole message line:
 
-An input event timestamp may also be supplied. Replace `test.sh` with:
-
-```bash
-#!/bin/sh
-
-for ((i=0; i<=5; i++)); do
-  echo -n "
-    [
-      $(date '+%s.%N' -d '1 day ago'),
-      {
-        \"realtimestamp\": $(date '+%s.%N')
-      }
-    ]
-  "
-  sleep 1
-done
-```
-
-Re-run the sample command. Note that the timestamps output by Fluent Bit are now one day old because Fluent Bit used the input message timestamp.
-
-```bash
-$ bash test.sh | fluent-bit -q -i stdin -o stdout
-[0] stdin.0: [[1684110480.028171300, {}], {"realtimestamp"=>1684196880.030070}]
-[0] stdin.0: [[1684110481.033753395, {}], {"realtimestamp"=>1684196881.034741}]
-[0] stdin.0: [[1684110482.036730051, {}], {"realtimestamp"=>1684196882.037704}]
-[0] stdin.0: [[1684110483.039903879, {}], {"realtimestamp"=>1684196883.041081}]
-[0] stdin.0: [[1684110484.044719457, {}], {"realtimestamp"=>1684196884.046404}]
-[0] stdin.0: [[1684110485.048710107, {}], {"realtimestamp"=>1684196885.049651}]
-```
-
-### Json input with metadata example
-
-Additional metadata is also supported on Fluent Bit v2.1.0 and above by replacing the timestamp
-with a 2-element object, e.g.:
-
-```bash
-#!/bin/sh
-for ((i=0; i<=5; i++)); do
-  echo -n "
-    [
-      [
-        $(date '+%s.%N' -d '1 day ago'),
-	{\"metakey\": \"metavalue\"}
-      ],
-      {
-        \"realtimestamp\": $(date '+%s.%N')
-      }
-    ]
-  "
-  sleep 1
-done
-```
+{% tabs %}
+{% tab title="parsers.yaml" %}
 
-```
-$ bash ./test.sh | fluent-bit -q -i stdin -o stdout
-[0] stdin.0: [[1684110513.060139417, {"metakey"=>"metavalue"}], {"realtimestamp"=>1684196913.061017}]
-[0] stdin.0: [[1684110514.063085317, {"metakey"=>"metavalue"}], {"realtimestamp"=>1684196914.064145}]
-[0] stdin.0: [[1684110515.066210508, {"metakey"=>"metavalue"}], {"realtimestamp"=>1684196915.067155}]
-[0] stdin.0: [[1684110516.069149971, {"metakey"=>"metavalue"}], {"realtimestamp"=>1684196916.070132}]
-[0] stdin.0: [[1684110517.072484016, {"metakey"=>"metavalue"}], {"realtimestamp"=>1684196917.073636}]
-[0] stdin.0: [[1684110518.075428724, {"metakey"=>"metavalue"}], {"realtimestamp"=>1684196918.076292}]
+```yaml
+parsers:
+  - name: stringify_message
+    format: regex
+    key_name: message
+    regex: '^(?<message>.*)'
 ```
 
-On older Fluent Bit versions records in this format will be discarded. Fluent Bit will log:
+{% endtab %}
+{% tab title="parsers.conf" %}
 
+```text
+[PARSER]
+  name        stringify_message
+  format      regex
+  Key_Name    message
+  regex       ^(?<message>.*)
 ```
-[ warn] unknown time format 6
-```
-
-if the log level permits.
 
-### Parser input example <a id="parser-input-example"></a>
+{% endtab %}
+{% endtabs %}
 
-To capture inputs in other formats, specify a parser configuration for the
-`stdin` plugin.
+You can then use the parsers file in a `stdin` plugin in the main Fluent Bit configuration file as follows:
 
-For example, if you want to read raw messages line-by-line and forward them you
-could use a `parser.conf` that captures the whole message line:
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-```
-[PARSER]
-    name        stringify_message
-    format      regex
-    Key_Name    message
-    regex       ^(?<message>.*)
+```yaml
+service:
+  parsers_file: parsers.yaml
+    
+pipeline:
+  inputs:
+    - name: stdin
+      tag: stdin
+      parser: stringify_message
+       
+  outputs:
+    - name: stdout
+      match: '*'
 ```
 
-then use that in the `parser` clause of the stdin plugin in the `fluent-bit.conf`:
-
-{% tabs %}
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```
+
+```text
+[SERVICE]
+  parsers_file parsers.conf
+    
 [INPUT]
-    Name    stdin
-    Tag     stdin
-    Parser  stringify_message
+  Name    stdin
+  Tag     stdin
+  Parser  stringify_message
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: stdin
-          tag: stdin
-          parser: stringify_message
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
-Fluent Bit will now read each line and emit a single message for each input
-line:
+Fluent Bit will now read each line and emit a single message for each input line, using the following command:
 
-```
-$ seq 1 5 | /opt/fluent-bit/bin/fluent-bit -c fluent-bit.conf -R parser.conf -q
-[0] stdin: [1681358780.517029169, {"message"=>"1"}]
-[1] stdin: [1681358780.517068334, {"message"=>"2"}]
-[2] stdin: [1681358780.517072116, {"message"=>"3"}]
-[3] stdin: [1681358780.517074758, {"message"=>"4"}]
-[4] stdin: [1681358780.517077392, {"message"=>"5"}]
-$
-```
+```shell
+# For YAML configuration.
+seq 1 5 | ./fluent-bit --config fluent-bit.yaml
 
-In real-world deployments it is best to use a more realistic parser that splits
-messages into real fields and adds appropriate tags.
+# For classic configuration.
+seq 1 5 | ./fluent-bit --config fluent-bit.conf
+```
 
-## Configuration Parameters <a id="config"></a>
+Which returns output similar to:
 
-The plugin supports the following configuration parameters:
+```text
+...
+[0] stdin: [[1751545974.960182000, {}], {"message"=>"1"}]
+[1] stdin: [[1751545974.960246000, {}], {"message"=>"2"}]
+[2] stdin: [[1751545974.960255000, {}], {"message"=>"3"}]
+[3] stdin: [[1751545974.960262000, {}], {"message"=>"4"}]
+[4] stdin: [[1751545974.960268000, {}], {"message"=>"5"}]
+...
+```
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-| Buffer\_Size | Set the buffer size to read data. This value is used to increase buffer size. The value must be according to the [Unit Size](../../administration/configuring-fluent-bit/unit-sizes.md) specification. | 16k |
-| Parser | The name of the parser to invoke instead of the default JSON input parser | |
+In production deployments it's best to use a parser that splits messages into real fields and adds appropriate tags.
\ No newline at end of file
diff --git a/pipeline/inputs/statsd.md b/pipeline/inputs/statsd.md
index 80356a3a4..34af3ce80 100644
--- a/pipeline/inputs/statsd.md
+++ b/pipeline/inputs/statsd.md
@@ -1,64 +1,134 @@
 # StatsD
 
-The **statsd** input plugin allows you to receive metrics via StatsD protocol.
+The _StatsD_ input plugin lets you receive metrics using the StatsD protocol.
 
-Content:
+## Configuration parameters
 
-* [Configuration Parameters](statsd.md#config)
-* [Configuration Examples](statsd.md#config_example)
+The plugin supports the following configuration parameters:
 
-## Configuration Parameters <a id="config"></a>
+| Key        | Description                                                                                             | Default   |
+|:-----------|:--------------------------------------------------------------------------------------------------------|:----------|
+| `Listen`   | Listener network interface.                                                                             | `0.0.0.0` |
+| `Port`     | UDP port that listens for connections.                                                                  | `8125`    |
+| `Threaded` | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs). | `false`   |
+| `Metrics`  | Ingested record will be marked as a metric record rather than a log record.                             | `off`     |
 
-The plugin supports the following configuration parameters:
+When enabling `Metrics On`, Fluent Bit will also handle metrics from the DogStatsD protocol. The internal record in Fluent Bit will be handled as a metric type for downstream processing.
+
+[The full format of DogStatsD of metrics](https://docs.datadoghq.com/developers/dogstatsd/datagram_shell/?tab=metrics#the-dogstatsd-protocol) isn't supported.
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-| Listen | Listener network interface. | 0.0.0.0 |
-| Port | UDP port where listening for connections | 8125 |
+Including key-value format of tags is supported:
+`<METRIC_NAME>:<VALUE>|<TYPE>|@<SAMPLE_RATE>|#<TAG_KEY_1>:<TAG_VALUE_1>`
 
-## Configuration Examples <a id="config_example"></a>
+[Events](https://docs.datadoghq.com/developers/dogstatsd/datagram_shell/?tab=events#the-dogstatsd-protocol) and [ServiceChecks](https://docs.datadoghq.com/developers/dogstatsd/datagram_shell/?tab=servicechecks#the-dogstatsd-protocol) formats aren't supported with `Metrics On`.
+
+## Configuration example
 
 Here is a configuration example.
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: statsd
+      listen: 0.0.0.0
+      port: 8125
+      
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name   statsd
-    Listen 0.0.0.0
-    Port   8125
+  Name   statsd
+  Listen 0.0.0.0
+  Port   8125
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: statsd
-          listen: 0.0.0.0
-          port: 8125
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
 Now you can input metrics through the UDP port as follows:
 
-```bash
+```shell
 echo "click:10|c|@0.1" | nc -q0 -u 127.0.0.1 8125
+
 echo "active:99|g"     | nc -q0 -u 127.0.0.1 8125
 ```
 
 Fluent Bit will produce the following records:
 
 ```text
+...
 [0] statsd.0: [1574905088.971380537, {"type"=>"counter", "bucket"=>"click", "value"=>10.000000, "sample_rate"=>0.100000}]
 [0] statsd.0: [1574905141.863344517, {"type"=>"gauge", "bucket"=>"active", "value"=>99.000000, "incremental"=>0}]
+...
 ```
 
+## Metrics setup
+
+Here is a configuration example for metrics setup.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: statsd
+      listen: 0.0.0.0
+      port: 8125
+      metrics: On
+      
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[INPUT]
+  Name   statsd
+  Listen 0.0.0.0
+  Port   8125
+  Metrics On
+
+[OUTPUT]
+  Name   stdout
+  Match  *
+```
+
+{% endtab %}
+{% endtabs %}
+
+Now you can input metrics as metrics type of events through the UDP port as follows:
+
+```shell
+echo "click:+10|c|@0.01|#hello:tag"              | nc -q0 -u 127.0.0.1 8125
+
+echo "active:+99|g|@0.01"                        | nc -q0 -u 127.0.0.1 8125
+
+echo "inactive:29|g|@0.0125|#hi:from_fluent-bit" | nc -q0 -u 127.0.0.1 8125
+```
+
+Fluent Bit will produce the following metrics events:
+
+```text
+...
+2025-01-09T11:40:26.562424694Z click{incremental="true",hello="tag"} = 1000
+2025-01-09T11:40:28.591477424Z active{incremental="true"} = 9900
+2025-01-09T11:40:31.593118033Z inactive{hi="from_fluent-bit"} = 2320
+...
+```
\ No newline at end of file
diff --git a/pipeline/inputs/syslog.md b/pipeline/inputs/syslog.md
index cf2a8a0cc..940f7ea1d 100644
--- a/pipeline/inputs/syslog.md
+++ b/pipeline/inputs/syslog.md
@@ -1,225 +1,249 @@
 # Syslog
 
-_Syslog_ input plugins allows to collect Syslog messages through a Unix socket server \(UDP or TCP\) or over the network using TCP or UDP.
+The _Syslog_ input plugin lets you collect `syslog` messages through a Unix socket server (UDP or TCP) or over the network using TCP or UDP.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-| Mode | Defines transport protocol mode: unix\_udp \(UDP over Unix socket\), unix\_tcp \(TCP over Unix socket\), tcp or udp | unix\_udp |
-| Listen | If _Mode_ is set to _tcp_ or _udp_, specify the network interface to bind. | 0.0.0.0 |
-| Port | If _Mode_ is set to _tcp_ or _udp_, specify the TCP port to listen for incoming connections. | 5140 |
-| Path | If _Mode_ is set to _unix\_tcp_ or _unix\_udp_, set the absolute path to the Unix socket file. |  |
-| Unix\_Perm | If _Mode_ is set to _unix\_tcp_ or _unix\_udp_, set the permission of the Unix socket file. | 0644 |
-| Parser | Specify an alternative parser for the message. If _Mode_ is set to _tcp_ or _udp_ then the default parser is _syslog-rfc5424_ otherwise _syslog-rfc3164-local_ is used. If your syslog messages have fractional seconds set this Parser value to _syslog-rfc5424_ instead. |  |
-| Buffer\_Chunk\_Size | By default the buffer to store the incoming Syslog messages, do not allocate the maximum memory allowed, instead it allocate memory when is required. The rounds of allocations are set by _Buffer\_Chunk\_Size_. If not set, _Buffer\_Chunk\_Size_ is equal to 32000 bytes \(32KB\). Read considerations below when using _udp_ or _unix\_udp_ mode. |  |
-| Buffer\_Max\_Size | Specify the maximum buffer size to receive a Syslog message. If not set, the default size will be the value of _Buffer\_Chunk\_Size_. |  |
-| Receive\_Buffer\_Size | Specify the maximum socket receive buffer size. If not set, the default value is OS-dependant, but generally too low to accept thousands of syslog messages per second without loss on _udp_ or _unix\_udp_ sockets. Note that on Linux the value is capped by `sysctl net.core.rmem_max`.| |
-| Source\_Address\_Key| Specify the key where the source address will be injected. | |
+| Key                   | Description                                                                                                                                                                                                                                                                       | Default              |
+|:----------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------|
+| `Mode`                | Defines transport protocol mode: UDP over Unix socket (`unix_udp`), TCP over Unix socket (`unix_tcp`), `tcp`, or `udp`                                                                                                                                                            | `unix_udp`           |
+| `Listen`              | If `Mode` is set to `tcp` or `udp`, specify the network interface to bind.                                                                                                                                                                                                        | `0.0.0.0`            |
+| `Port`                | If `Mode` is set to `tcp` or `udp`, specify the TCP port to listen for incoming connections.                                                                                                                                                                                      | `5140`               |
+| `Path`                | If `Mode` is set to `unix_tcp` or `unix_udp`, set the absolute path to the Unix socket file.                                                                                                                                                                                      | _none_               |
+| `Unix_Perm`           | If `Mode` is set to `unix_tcp` or `unix_udp`, set the permission of the Unix socket file.                                                                                                                                                                                         | `0644`               |
+| `Parser`              | Specify an alternative parser for the message. If `Mode` is set to `tcp` or `udp` then the default parser is `syslog-rfc5424`. Otherwise, `syslog-rfc3164-local` is used. If your syslog` messages have fractional seconds set this parser value to `syslog-rfc5424` instead.     | _none_               |
+| `Buffer_Chunk_Size`   | By default, the buffer to store the incoming `syslog` messages. Doesn't allocate the maximum memory allowed, instead it allocates memory when required. The rounds of allocations are set by `Buffer_Chunk_Size`. There are considerations when using `udp` or `unix_udp` mode.   | `32KB` (set in code) |
+| `Buffer_Max_Size`     | Specify the maximum buffer size to receive a `syslog` message. If not set, the default size is the value of `Buffer_Chunk_Size`.                                                                                                                                                  | _none_               |
+| `Receive_Buffer_Size` | Specify the maximum socket receive buffer size. If not set, the default value is OS-dependant, but generally too low to accept thousands of syslog messages per second without loss on `udp` or `unix_udp` sockets. For Linux, the value is capped by `sysctl net.core.rmem_max`. | _none_               |
+| `Source_Address_Key`  | Specify the key where the source address will be injected.                                                                                                                                                                                                                        | _none_               |
+| `Threaded`            | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                                                                                                                                                                           | `false`              |
 
 ### Considerations
 
-* When using Syslog input plugin, Fluent Bit requires access to the _parsers.conf_ file, the path to this file can be specified with the option _-R_ or through the _Parsers\_File_ key on the \[SERVICE\] section \(more details below\).
-* When _udp_ or _unix\_udp_ is used, the buffer size to receive messages is configurable **only** through the _Buffer\_Chunk\_Size_ option which defaults to 32kb.
+- When using the Syslog input plugin, Fluent Bit requires access to the parsers configuration file. The path to this file can be specified with the option `-R` or through the `parsers_file` key in the service section.
+- When using `udp` or `unix_udp`, the buffer size to receive messages is configurable only through the `buffer_chunk_size` option, which defaults to 32kb.
 
-## Getting Started
+## Get started
 
-In order to receive Syslog messages, you can run the plugin from the command line or through the configuration file:
+To receive `syslog` messages, you can run the plugin from the command line or through the configuration file:
 
-### Command Line
+### Command line
 
-From the command line you can let Fluent Bit listen for _Forward_ messages with the following options:
+From the command line you can let Fluent Bit listen for `Forward` messages with the following options:
 
-```bash
-$ fluent-bit -R /path/to/parsers.conf -i syslog -p path=/tmp/in_syslog -o stdout
+```shell
+# For YAML configuration
+./fluent-bit -R /path/to/parsers.yaml -i syslog -p path=/tmp/in_syslog -o stdout
+
+# For classic configuration.
+./fluent-bit -R /path/to/parsers.conf -i syslog -p path=/tmp/in_syslog -o stdout
 ```
 
-By default the service will create and listen for Syslog messages on the unix socket _/tmp/in\_syslog_
+By default, the service will create and listen for Syslog messages on the Unix socket `/tmp/in_syslog`.
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+In your main configuration file append the following sections:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+  parsers_file: parsers.yaml
+
+pipeline:
+  inputs:
+    - name: syslog
+      path: /tmp/in_syslog
+      buffer_chunk_size: 32000
+      buffer_max_size: 64000
+      receive_buffer_size: 512000
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [SERVICE]
-    Flush               1
-    Log_Level           info
-    Parsers_File        parsers.conf
+  Flush               1
+  Log_Level           info
+  Parsers_File        parsers.conf
 
 [INPUT]
-    Name                syslog
-    Path                /tmp/in_syslog
-    Buffer_Chunk_Size   32000
-    Buffer_Max_Size     64000
-    Receive_Buffer_Size 512000
+  Name                syslog
+  Path                /tmp/in_syslog
+  Buffer_Chunk_Size   32000
+  Buffer_Max_Size     64000
+  Receive_Buffer_Size 512000
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-service:
-    flush: 1
-    log_level: info
-    parsers_file: parsers.conf
-pipeline:
-    inputs:
-        - name: syslog
-          path: /tmp/in_syslog
-          buffer_chunk_size: 32000
-          buffer_max_size: 64000
-          receive_buffer_size: 512000
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
 ### Testing
 
-Once Fluent Bit is running, you can send some messages using the _logger_ tool:
+When Fluent Bit is running, you can send some messages using the logger tool:
 
-```bash
-$ logger -u /tmp/in_syslog my_ident my_message
+```shell
+logger -u /tmp/in_syslog my_ident my_message
 ```
 
-In [Fluent Bit](http://fluentbit.io) we should see the following output:
+Then run Fluent Bit using the following command:
+
+```shell
+# For YAML configuration.
+./fluent-bit -R ../conf/parsers.yaml -i syslog -p path=/tmp/in_syslog -o stdout
+
+# For classic configuration.
+./fluent-bit -R ../conf/parsers.conf -i syslog -p path=/tmp/in_syslog -o stdout
+```
 
-```bash
-$ bin/fluent-bit -R ../conf/parsers.conf -i syslog -p path=/tmp/in_syslog -o stdout
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+You should see the following output:
 
-[2017/03/09 02:23:27] [ info] [engine] started
+```text
+...
 [0] syslog.0: [1489047822, {"pri"=>"13", "host"=>"edsiper:", "ident"=>"my_ident", "pid"=>"", "message"=>"my_message"}]
+...
 ```
 
-## Recipes
+## Examples
 
-The following content aims to provide configuration examples for different use cases to integrate Fluent Bit and make it listen for Syslog messages from your systems.
+The following configuration examples cover different use cases to integrate Fluent Bit and make it listen for Syslog messages from your systems.
 
-### Rsyslog to Fluent Bit: Network mode over TCP <a id="rsyslog_to_fluentbit_network"></a>
+### `rsyslog` to Fluent Bit: Network mode over TCP
 
-#### Fluent Bit Configuration
+#### Fluent Bit configuration [#config-tcp]
 
 Put the following content in your configuration file:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  parsers_file: parsers.yaml
+
+pipeline:
+  inputs:
+    - name: syslog
+      parser: syslog-rfc3164
+      listen: 0.0.0.0
+      port: 5140
+      mode: tcp
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
+
 ```text
 [SERVICE]
-    Flush        1
-    Parsers_File parsers.conf
+  Flush        1
+  Parsers_File parsers.conf
 
 [INPUT]
-    Name     syslog
-    Parser   syslog-rfc3164
-    Listen   0.0.0.0
-    Port     5140
-    Mode     tcp
+  Name     syslog
+  Parser   syslog-rfc3164
+  Listen   0.0.0.0
+  Port     5140
+  Mode     tcp
 
 [OUTPUT]
-    Name     stdout
-    Match    *
+  Name     stdout
+  Match    *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-service:
-    flush: 1
-    parsers_file: parsers.conf
-pipeline:
-    inputs:
-        - name: syslog
-          parser: syslog-rfc3164
-          listen: 0.0.0.0
-          port: 5140
-          mode: tcp
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
-then start Fluent Bit.
+Then, start Fluent Bit.
 
-#### RSyslog Configuration
+#### `rsyslog` configuration [#rsyslog-tcp]
 
-Add a new file to your rsyslog config rules called _60-fluent-bit.conf_ inside the directory _/etc/rsyslog.d/_ and add the following content:
+Add a new file to your `rsyslog` configuration rules called `60-fluent-bit.conf` inside the directory `/etc/rsyslog.d/` and add the following content:
 
 ```text
 action(type="omfwd" Target="127.0.0.1" Port="5140" Protocol="tcp")
 ```
 
-then make sure to restart your rsyslog daemon:
+Then, restart your `rsyslog` daemon:
 
-```bash
-$ sudo service rsyslog restart
+```shell
+sudo service rsyslog restart
 ```
 
-### Rsyslog to Fluent Bit: Unix socket mode over UDP
+### `rsyslog` to Fluent Bit: Unix socket mode over UDP
 
-#### Fluent Bit Configuration
+#### Fluent Bit configuration [#config-udp]
 
-Put the following content in your fluent-bit.conf file:
+Put the following content in your Fluent Bit configuration:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  parsers_file: parsers.yaml
+
+pipeline:
+  inputs:
+    - name: syslog
+      parser: syslog-rfc3164
+      path: /tmp/fluent-bit.sock
+      mode: unix_udp
+      unix_perm: 0644
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
+
 ```text
 [SERVICE]
-    Flush        1
-    Parsers_File parsers.conf
+  Flush        1
+  Parsers_File parsers.conf
 
 [INPUT]
-    Name      syslog
-    Parser    syslog-rfc3164
-    Path      /tmp/fluent-bit.sock
-    Mode      unix_udp
-    Unix_Perm 0644
+  Name      syslog
+  Parser    syslog-rfc3164
+  Path      /tmp/fluent-bit.sock
+  Mode      unix_udp
+  Unix_Perm 0644
 
 [OUTPUT]
-    Name      stdout
-    Match     *
+  Name      stdout
+  Match     *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-service:
-    flush: 1
-    parsers_file: parsers.conf
-pipeline:
-    inputs:
-        - name: syslog
-          parser: syslog-rfc3164
-          path: /tmp/fluent-bit.sock
-          mode: unix_udp
-          unix_perm: 0644
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
-then start Fluent Bit.
+Then, start Fluent Bit.
 
-#### RSyslog Configuration
+#### `rsyslog` configuration [#rsyslog-udp]
 
-Add a new file to your rsyslog config rules called _60-fluent-bit.conf_ inside the directory _/etc/rsyslog.d/_ and place the following content:
+Add a new file to your `rsyslog` configuration rules called `60-fluent-bit.conf` inside the directory `/etc/rsyslog.d/` containing the following content:
 
 ```text
 $ModLoad omuxsock
@@ -227,5 +251,4 @@ $OMUxSockSocket /tmp/fluent-bit.sock
 *.* :omuxsock:
 ```
 
-Make sure that the socket file is readable by rsyslog \(tweak the `Unix_Perm` option shown above\).
-
+Make sure that the socket file is readable by `rsyslog` by modifying `Unix_Perm` key.
diff --git a/pipeline/inputs/systemd.md b/pipeline/inputs/systemd.md
index b48554d2a..dda63e963 100644
--- a/pipeline/inputs/systemd.md
+++ b/pipeline/inputs/systemd.md
@@ -1,78 +1,84 @@
 # Systemd
 
-The _Systemd_ input plugin allows to collect log messages from the Journald daemon on Linux environments.
+The _Systemd_ input plugin lets you collect log messages from the `journald` daemon in Linux environments.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-| Path | Optional path to the Systemd journal directory, if not set, the plugin will use default paths to read local-only logs. |  |
-| Max\_Fields | Set a maximum number of fields \(keys\) allowed per record. | 8000 |
-| Max\_Entries | When Fluent Bit starts, the Journal might have a high number of logs in the queue. In order to avoid delays and reduce memory usage, this option allows to specify the maximum number of log entries that can be processed per round. Once the limit is reached, Fluent Bit will continue processing the remaining log entries once Journald performs the notification. | 5000 |
-| Systemd\_Filter | Allows to perform a query over logs that contains a specific Journald key/value pairs, e.g: \_SYSTEMD\_UNIT=UNIT. The Systemd\_Filter option can be specified multiple times in the input section to apply multiple filters as required. |  |
-| Systemd\_Filter\_Type | Define the filter type when _Systemd\_Filter_ is specified multiple times. Allowed values are _And_ and _Or_. With _And_ a record is matched only when all of the _Systemd\_Filter_ have a match. With _Or_ a record is matched when any of the _Systemd\_Filter_ has a match. | Or |
-| Tag | The tag is used to route messages but on Systemd plugin there is an extra functionality: if the tag includes a star/wildcard, it will be expanded with the Systemd Unit file \(`_SYSTEMD_UNIT`, e.g. host.\* =&gt; host.UNIT\_NAME\) or `unknown` \(e.g. host.unknown\) if `_SYSTEMD_UNIT` is missing. |  |
-| DB | Specify the absolute path of a database file to keep track of Journald cursor. |  |
-| DB.Sync | Set a default synchronization \(I/O\) method. values: Extra, Full, Normal, Off. This flag affects how the internal SQLite engine do synchronization to disk, for more details about each option please refer to [this section](https://www.sqlite.org/pragma.html#pragma_synchronous). note: this option was introduced on Fluent Bit v1.4.6. | Full |
-| Read\_From\_Tail | Start reading new entries. Skip entries already stored in Journald. | Off |
-| Lowercase | Lowercase the Journald field \(key\). | Off |
-| Strip\_Underscores | Remove the leading underscore of the Journald field \(key\). For example the Journald field _\_PID_ becomes the key _PID_. | Off |
-
-## Getting Started
+| Key                   | Description                                                                                                                                                                                                                                                                                                                                                   | Default |
+|:----------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------|
+| `Path`                | Optional path to the Systemd journal directory. If not set, the plugin uses default paths to read local-only logs.                                                                                                                                                                                                                                            | _none_  |
+| `Max_Fields`          | Set a maximum number of fields (keys) allowed per record.                                                                                                                                                                                                                                                                                                     | `8000`  |
+| `Max_Entries`         | When Fluent Bit starts, the Journal might have a high number of logs in the queue. To avoid delays and reduce memory usage, use this option to specify the maximum number of log entries that can be processed per round. Once the limit is reached, Fluent Bit will continue processing the remaining log entries once `journald` performs the notification. | `5000`  |
+| `Systemd_Filter`      | Perform a query over logs that contain specific `journald` key/value pairs. For example, `_SYSTEMD_UNIT=UNIT`. The `Systemd_Filter` option can be specified multiple times in the input section to apply multiple filters.                                                                                                                                    | _none_  |
+| `Systemd_Filter_Type` | Define the filter type when `Systemd_Filter` is specified multiple times. Allowed values:`And`, `Or`. With `And` a record is matched only when all of the `Systemd_Filter` have a match. With `Or` a record is matched when any `Systemd_Filter` has a match.                                                                                                 | `Or`    |
+| `Tag`                 | The tag is used to route messages but on Systemd plugin there is an additional capability: if the tag includes a wildcard (`*`), it will be expanded with the Systemd Unit file (`_SYSTEMD_UNIT`, like `host.\* =&gt; host.UNIT_NAME`) or `unknown` (`host.unknown`) if `_SYSTEMD_UNIT` is missing.                                                           | _none_  |
+| `DB`                  | Specify the absolute path of a database file to keep track of the `journald` cursor.                                                                                                                                                                                                                                                                          | _none_  |
+| `DB.Sync`             | Set a default synchronization (I/O) method. Values: `Extra`, `Full`, `Normal`, and `Off`. This flag affects how the internal SQLite engine synchronizes to disk. For more details [SQL lite documentation](https://www.sqlite.org/pragma.html#pragma_synchronous). Available in Fluent Bit v1.4.6 and later.                                                  | `Full`  |
+| `Read_From_Tail`      | Start reading new entries. Skip entries already stored in`journald`.                                                                                                                                                                                                                                                                                          | `Off`   |
+| `Lowercase`           | Lowercase the `journald` field (key).                                                                                                                                                                                                                                                                                                                         | `Off`   |
+| `Strip_Underscores`   | Remove the leading underscore of the `journald` field (key). For example, the `journald` field `_PID` becomes the key `PID`.                                                                                                                                                                                                                                  | `Off`   |
+| `Threaded`            | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                                                                                                                                                                                                                                                       | `false` |
+
+## Get started
+
+To receive Systemd messages, you can run the plugin from the command line or through the configuration file.
+
+### Command line
+
+From the command line you can let Fluent Bit listen for Systemd messages with the following options:
+
+```shell
+fluent-bit -i systemd \
+           -p systemd_filter=_SYSTEMD_UNIT=docker.service \
+           -p tag='host.*' \ 
+           -o stdout
+```
 
-In order to receive Systemd messages, you can run the plugin from the command line or through the configuration file:
+This example collects all messages coming from the Docker service.
 
-### Command Line
+### Configuration file
 
-From the command line you can let Fluent Bit listen for _Systemd_ messages with the following options:
+In your main configuration file append the following sections:
 
-```bash
-$ fluent-bit -i systemd \
-             -p systemd_filter=_SYSTEMD_UNIT=docker.service \
-             -p tag='host.*' -o stdout
-```
-
-> In the example above we are collecting all messages coming from the Docker service.
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-### Configuration File
+```yaml
+service:
+  flush: 1
+  log_level: info
+  parsers_file: parsers.yaml
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+pipeline:
+  inputs:
+    - name: systemd
+      tag: host.*
+      systemd_filter: _SYSTEMD_UNIT=docker.service
+  outputs:
+    - name: stdout
+      match: '*'
+```
 
-{% tabs %}
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
+
 ```text
 [SERVICE]
-    Flush        1
-    Log_Level    info
-    Parsers_File parsers.conf
+  Flush        1
+  Log_Level    info
+  Parsers_File parsers.conf
 
 [INPUT]
-    Name            systemd
-    Tag             host.*
-    Systemd_Filter  _SYSTEMD_UNIT=docker.service
+  Name            systemd
+  Tag             host.*
+  Systemd_Filter  _SYSTEMD_UNIT=docker.service
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-service:
-    flush: 1
-    log_level: info
-    parsers_file: parsers.conf
-pipeline:
-    inputs:
-        - name: systemd
-          tag: host.*
-          systemd_filter: _SYSTEMD_UNIT=docker.service
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
-{% endtabs %}
+{% endtabs %}
\ No newline at end of file
diff --git a/pipeline/inputs/tail.md b/pipeline/inputs/tail.md
index 5df9c9424..25b86ec35 100644
--- a/pipeline/inputs/tail.md
+++ b/pipeline/inputs/tail.md
@@ -1,166 +1,260 @@
 # Tail
 
-The **tail** input plugin allows to monitor one or several text files. It has a similar behavior like `tail -f` shell command.
+The _Tail_ input plugin lets you monitor text files. Its behavior is similar to the `tail -f` shell command.
 
-The plugin reads every matched file in the `Path` pattern and for every new line found \(separated by a newline character (\n) \), it generates a new record. Optionally a database file can be used so the plugin can have a history of tracked files and a state of offsets, this is very useful to resume a state if the service is restarted.
+The plugin reads every matched file in the `Path` pattern. For every new line found (separated by a newline character `\n`), it generates a new record. Optionally, you can use a database file so the plugin can have a history of tracked files and a state of offsets. This helps resume a state if the service is restarted.
 
-## Configuration Parameters <a id="config"></a>
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | Default |
-| :--- |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| :--- |
-| Buffer\_Chunk\_Size | Set the initial buffer size to read files data. This value is used to increase buffer size. The value must be according to the [Unit Size](../../administration/configuring-fluent-bit/unit-sizes.md) specification.                                                                                                                                                                                                                                                                                     | 32k |
-| Buffer\_Max\_Size | Set the limit of the buffer size per monitored file. When a buffer needs to be increased \(e.g: very long lines\), this value is used to restrict how much the memory buffer can grow. If reading a file exceeds this limit, the file is removed from the monitored file list. The value must be according to the [Unit Size](../../administration/configuring-fluent-bit/unit-sizes.md) specification.                                                                                                  | 32k |
-| Path | Pattern specifying a specific log file or multiple ones through the use of common wildcards. Multiple patterns separated by commas are also allowed.                                                                                                                                                                                                                                                                                                                                                     |  |
-| Path\_Key | If enabled, it appends the name of the monitored file as part of the record. The value assigned becomes the key in the map.                                                                                                                                                                                                                                                                                                                                                                              |  |
-| Exclude\_Path | Set one or multiple shell patterns separated by commas to exclude files matching certain criteria, e.g: `Exclude_Path *.gz,*.zip`                                                                                                                                                                                                                                                                                                                                                                        |  |
-| Offset\_Key | If enabled, Fluent Bit appends the offset of the current monitored file as part of the record. The value assigned becomes the key in the map                                                                                                                                                                                                                                                                                                                                                             |  |
-| Read\_from\_Head | For new discovered files on start \(without a database offset/position\), read the content from the head of the file, not tail.                                                                                                                                                                                                                                                                                                                                                                          | False |
-| Refresh\_Interval | The interval of refreshing the list of watched files in seconds.                                                                                                                                                                                                                                                                                                                                                                                                                                         | 60 |
-| Rotate\_Wait | Specify the number of extra time in seconds to monitor a file once is rotated in case some pending data is flushed.                                                                                                                                                                                                                                                                                                                                                                                      | 5 |
-| Ignore\_Older | Ignores files older than `ignore_older`. Supports m, h, d (minutes, hours, days) syntax. Default behavior is to read all.                                                                                                                                                                                                                                                                               |  |
-| Skip\_Long\_Lines | When a monitored file reaches its buffer capacity due to a very long line \(Buffer\_Max\_Size\), the default behavior is to stop monitoring that file. Skip\_Long\_Lines alter that behavior and instruct Fluent Bit to skip long lines and continue processing other lines that fits into the buffer size.                                                                                                                                                                                              | Off |
-| Skip\_Empty\_Lines | Skips empty lines in the log file from any further processing or output.                                                                                                                                                                                                                                                                                                                                                                                                                                 | Off |
-| DB | Specify the database file to keep track of monitored files and offsets.                                                                                                                                                                                                                                                                                                                                                                                                                                  |  |
-| DB.sync | Set a default synchronization \(I/O\) method. Values: Extra, Full, Normal, Off. This flag affects how the internal SQLite engine do synchronization to disk, for more details about each option please refer to [this section](https://www.sqlite.org/pragma.html#pragma_synchronous). Most of workload scenarios will be fine with `normal` mode, but if you really need full synchronization after every write operation you should set `full` mode. Note that `full` has a high I/O performance cost. | normal |
-| DB.locking | Specify that the database will be accessed only by Fluent Bit. Enabling this feature helps to increase performance when accessing the database but it restrict any external tool to query the content.                                                                                                                                                                                                                                                                                                   | false |
-| DB.journal\_mode | sets the journal mode for databases \(WAL\). Enabling WAL provides higher performance. Note that WAL is not compatible with shared network file systems.                                                                                                                                                                                                                                                                                                                                                 | WAL |
-| DB.compare_filename | This option determines whether to check both the `inode` and the `filename` when retrieving stored file information from the database. 'true' verifies both the `inode` and `filename`, while 'false' checks only the `inode` (default). To check the inode and filename in the database, refer [here](#keep_state).                                                                                                                     | false |
-| Mem\_Buf\_Limit | Set a limit of memory that Tail plugin can use when appending data to the Engine. If the limit is reach, it will be paused; when the data is flushed it resumes.                                                                                                                                                                                                                                                                                                                                         |  |
-| Exit\_On\_Eof | When reading a file will exit as soon as it reach the end of the file. Useful for bulk load and tests                                                                                                                                                                                                                                                                                                                                                                                                    | false |
-| Parser | Specify the name of a parser to interpret the entry as a structured message.                                                                                                                                                                                                                                                                                                                                                                                                                             |  |
-| Key | When a message is unstructured \(no parser applied\), it's appended as a string under the key name _log_. This option allows to define an alternative name for that key.                                                                                                                                                                                                                                                                                                                                 | log |
-| Inotify_Watcher | Set to false to use file stat watcher instead of inotify.                                                                                                                                                                                                                                                                                                                                                                                                                                                | true |
-| Tag | Set a tag \(with regex-extract fields\) that will be placed on lines read. E.g. `kube.<namespace_name>.<pod_name>.<container_name>.<container_id>`. Note that "tag expansion" is supported: if the tag includes an asterisk \(\*\), that asterisk will be replaced with the absolute path of the monitored file, with slashes replaced by dots \(also see [Workflow of Tail + Kubernetes Filter](../filters/kubernetes.md#workflow-of-tail-kubernetes-filter)\).                                                                                       |  |
-| Tag\_Regex | Set a regex to extract fields from the file name. E.g. `(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<container_id>[a-z0-9]{64})\.log$`                                                                                                                                                                                                                                                                                                                    |  |
-| Static\_Batch\_Size | Set the maximum number of bytes to process per iteration for the monitored static files (files that already exists upon Fluent Bit start).                                                                                                                                                                                                                                                                                                                                                               | 50M     |
-
-
-Note that if the database parameter `DB` is **not** specified, by default the plugin will start reading each target file from the beginning. This also might cause some unwanted behavior, for example when a line is bigger that `Buffer_Chunk_Size` and `Skip_Long_Lines` is not turned on, the file will be read from the beginning of each `Refresh_Interval` until the file is rotated.
-
-## Multiline Support
-
-Starting from Fluent Bit v1.8 we have introduced a new Multiline core functionality. For Tail input plugin, it means that now it supports the **old** configuration mechanism but also the **new** one. In order to avoid breaking changes, we will keep both but encourage our users to use the latest one. We will call the two mechanisms as:
-
-* Multiline Core
-* Old Multiline
-
-### Multiline Core \(v1.8\)
-
-The new multiline core is exposed by the following configuration:
-
-| Key | Description |
-| :--- | :--- |
-| multiline.parser | Specify one or multiple [Multiline Parser definitions](../../administration/configuring-fluent-bit/multiline-parsing.md) to apply to the content. |
-
-As stated in the [Multiline Parser documentation](../../administration/configuring-fluent-bit/multiline-parsing.md), now we provide built-in configuration modes. Note that when using a new `multiline.parser` definition, you must **disable** the old configuration from your tail section like:
-
-* parser
-* parser\_firstline
-* parser\_N
-* multiline
-* multiline\_flush
-* docker\_mode
-
-### Multiline and Containers \(v1.8\)
-
-If you are running Fluent Bit to process logs coming from containers like Docker or CRI, you can use the new built-in modes for such purposes. This will help to reassembly multiline messages originally split by Docker or CRI:
+| Key                   | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                        | Default   |
+|:----------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:----------|
+| `buffer_chunk_size`   | Set the initial buffer size to read file data. This value is used to increase buffer size. The value must be according to the [Unit Size](../../administration/configuring-fluent-bit/unit-sizes.md) specification.                                                                                                                                                                                                                                                | `32k`     |
+| `buffer_max_size`     | Set the limit of the buffer size per monitored file. When a buffer needs to be increased, this value is used to restrict the memory buffer growth. If reading a file exceeds this limit, the file is removed from the monitored file list. The value must be according to the [Unit Size](../../administration/configuring-fluent-bit/unit-sizes.md) specification.                                                                                                | `32k`     |
+| `path`                | Pattern specifying a specific log file or multiple ones through the use of common wildcards. Allows multiple patterns separated by commas.                                                                                                                                                                                                                                                                                                                         | _none_    |
+| `path_key`            | If enabled, it appends the name of the monitored file as part of the record. The value assigned becomes the key in the map.                                                                                                                                                                                                                                                                                                                                        | _none_    |
+| `exclude_path`        | Set one or multiple shell patterns separated by commas to exclude files matching certain criteria, For example, `exclude_path *.gz,*.zip`.                                                                                                                                                                                                                                                                                                                         | _none_    |
+| `offset_key`          | If enabled, Fluent Bit appends the offset of the current monitored file as part of the record. The value assigned becomes the key in the map.                                                                                                                                                                                                                                                                                                                      | _none_    |
+| `read_from_head`      | For new discovered files on start (without a database offset/position), read the content from the head of the file, not tail.                                                                                                                                                                                                                                                                                                                                      | `false`   |
+| `refresh_interval`    | The interval of refreshing the list of watched files in seconds.                                                                                                                                                                                                                                                                                                                                                                                                   | `60`      |
+| `rotate_wait`         | Specify the number of extra time in seconds to monitor a file once is rotated in case some pending data is flushed.                                                                                                                                                                                                                                                                                                                                                | `5`       |
+| `ignore_older`        | Ignores files older than `ignore_older`. Supports `m`, `h`, `d` (minutes, hours, days) syntax.                                                                                                                                                                                                                                                                                                                                                                     | Read all. |
+| `skip_long_lines`     | When a monitored file reaches its buffer capacity due to a very long line (`buffer_max_size`), the default behavior is to stop monitoring that file. `skip_long_lines` alter that behavior and instruct Fluent Bit to skip long lines and continue processing other lines that fit into the buffer size.                                                                                                                                                           | `off`     |
+| `skip_empty_lines`    | Skips empty lines in the log file from any further processing or output.                                                                                                                                                                                                                                                                                                                                                                                           | `off`     |
+| `db`                  | Specify the database file to keep track of monitored files and offsets.                                                                                                                                                                                                                                                                                                                                                                                            | _none_    |
+| `db.sync`             | Set a default synchronization (I/O) method. This flag affects how the internal SQLite engine do synchronization to disk, for more details about each option see [the SQLite documentation](https://www.sqlite.org/pragma.html#pragma_synchronous). Most scenarios will be fine with `normal` mode. If you need full synchronization after every write operation set `full` mode. `full` has a high I/O performance cost. Values: `extra`, `full`, `normal`, `off`. | `normal`  |
+| `db.locking`          | Specify that the database will be accessed only by Fluent Bit. Enabling this feature helps increase performance when accessing the database but restricts externals tool from querying the content.                                                                                                                                                                                                                                                                | `false`   |
+| `db.journal_mode`     | Sets the journal mode for databases (`wal`). Enabling `wal` provides higher performance. `wal` isn't compatible with shared network file systems.                                                                                                                                                                                                                                                                                                                  | `wal`     |
+| `db.compare_filename` | This option determines whether to review both `inode` and `filename` when retrieving stored file information from the database. `true` verifies both `inode` and `filename`, while `false` checks only the `inode`. To review the `inode` and `filename` in the database, refer [see `keep_state`](#tailing-files-keeping-state).                                                                                                                                  | `false`   |
+| `mem_buf_limit`       | Set a memory limit that Tail plugin can use when appending data to the engine. If the limit is reached, it will be paused. When the data is flushed it resumes.                                                                                                                                                                                                                                                                                                    | _none_    |
+| `exit_on_eof`         | When reading a file will exit as soon as it reach the end of the file. Used for bulk load and tests.                                                                                                                                                                                                                                                                                                                                                               | `false`   |
+| `parser`              | Specify the name of a parser to interpret the entry as a structured message.                                                                                                                                                                                                                                                                                                                                                                                       | _none_    |
+| `key`                 | When a message is unstructured (no parser applied), it's appended as a string under the key name `log`. This option lets you define an alternative name for that key.                                                                                                                                                                                                                                                                                              | `log`     |
+| `inotify_watcher`     | Set to `false` to use file stat watcher instead of `inotify`.                                                                                                                                                                                                                                                                                                                                                                                                      | `true`    |
+| `tag`                 | Set a tag with `regexextract` fields that will be placed on lines read. For example, `kube.<namespace_name>.<pod_name>.<container_name>.<container_id>`. Tag expansion is supported: if the tag includes an asterisk (`*`), that asterisk will be replaced with the absolute path of the monitored file, with slashes replaced by dots. See [Workflow of Tail + Kubernetes Filter](../filters/kubernetes.md#workflow-of-tail--kubernetes-filter).                  | _none_    |
+| `tag_regex`           | Set a regular expression to extract fields from the filename. For example: `(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<container_id>[a-z0-9]{64})\.log$`.                                                                                                                                                                                                                 | _none_    |
+| `static_batch_size`   | Set the maximum number of bytes to process per iteration for the monitored static files (files that already exist upon Fluent Bit start).                                                                                                                                                                                                                                                                                                                          | `50M`     |
+| `file_cache_advise`   | Set the `posix_fadvise` in `POSIX_FADV_DONTNEED` mode. This reduces the usage of the kernel file cache. This option is ignored if not running on Linux.                                                                                                                                                                                                                                                                                                            | `on`      |
+| `threaded`            | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                                                                                                                                                                                                                                                                                                                                                            | `false`   |
+
+## Buffers and memory management
+
+The Tail plugin uses buffers to efficiently read and process log files. Understanding how these buffers work helps optimize memory usage and performance.
+
+### File buffers versus Fluent Bit chunks
+
+When a file is opened for monitoring, the Tail plugin allocates a buffer in memory of `buffer_chunk_size` bytes (defaults to 32&nbsp;KB). This buffer is used to read data from the file. If a single record (line) is longer than `buffer_chunk_size`, the buffer will grow up to `buffer_max_size` to accommodate it.
+
+{% hint style="info" %}
+
+These buffers are per-file. If you're monitoring many files, each file gets its own buffer, which can significantly increase memory usage.
+
+{% endhint %}
+
+### From buffers to chunks
+
+Inside each file buffer, multiple lines or records might exist. The plugin processes these records and converts them to MessagePack format (binary serialization). This MessagePack data is then appended to what Fluent Bit calls a _chunk_, which is a collection of serialized records that belong to the same tag.
+
+Although Fluent Bit has a soft limit of 2&nbsp;MB for chunks, input plugins like Tail can generate MessagePack buffers larger than 2&nbsp;MB, and the final chunk can exceed this soft limit.
+
+### Memory protection with `mem_buf_limit`
+
+If Fluent Bit isn't configured to use filesystem buffering, it needs mechanisms to protect against high memory consumption during backpressure scenarios (for example, when destination endpoints are down or network issues occur). The `mem_buf_limit` option restricts how much memory in chunks an input plugin can use.
+
+When filesystem buffering is enabled, memory management works differently. For more details, see [Buffering and Storage](../../administration/buffering-and-storage.md).
+
+## Database file
+
+File positioning behavior varies based on the presence or absence of a database file.
+
+If a database file is present, the plugin restores the last known position (offset) from the database. If no previous position exists and `read_from_head` is `false`, it starts monitoring from the end of the file.
+
+If no database file is present, positioning behavior depends on the value of `read_from_head`:
+
+- When `read_from_head` is `true`, the plugin reads from the beginning of the file.
+- When `read_from_head` is `false`, the plugin starts monitoring from the end of the file (classic "tail" behavior). This means that only new content written after Fluent Bit starts will be monitored.
+
+## Monitor a large number of files
+
+To monitor a large number of files, you can increase the `inotify` settings in your Linux environment by modifying the following `sysctl` parameters:
+
+```text
+sysctl fs.inotify.max_user_watches=LIMIT1
+sysctl fs.inotify.max_user_instances=LIMIT2
+```
+
+Replace _`LIMIT1`_ and _`LIMIT2`_ with the integer values of your choosing. Higher values raise your `inotify` limit accordingly.
+
+These changes revert upon reboot unless you write them to the appropriate `inotify.conf` file. Writing to the file ensures the settings persist across reboots. The specific filename can vary depending on how you built and installed Fluent Bit. For example, to write changes to a file named `fluent-bit_fs_inotify.conf`, run the following commands:
+
+```shell
+mkdir -p /etc/sysctl.d
+echo fs.inotify.max_user_watches = LIMIT1 >> /etc/sysctl.d/fluent-bit_fs_inotify.conf
+echo fs.inotify.max_user_instances = LIMIT2 >> /etc/sysctl.d/fluent-bit_fs_inotify.conf
+```
+
+Replace _`LIMIT1`_ and _`LIMIT2`_ with the integer values of your choosing.
+
+You can also provide a custom systemd configuration file that overrides the default systemd settings for Fluent Bit. This override file must be located at `/etc/systemd/system/fluent-bit.service.d/override.conf` or `/etc/systemd/system/fluent-bit.service.d/override.yaml` depending on the configuration you choose. For example, you can add one of these snippets to your override file to raise the number of files that the Tail plugin can monitor:
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
+{% tab title="override.yaml" %}
+
+```yaml
+service:
+  limitnofile: LIMIT
+```
+
+{% endtab %}
+{% tab title="override.conf" %}
+
 ```text
-[INPUT]
-    name              tail
-    path              /var/log/containers/*.log
-    multiline.parser  docker, cri
+[Service]
+  LimitNOFILE=LIMIT
 ```
+
 {% endtab %}
+{% endtabs %}
+
+Replace _`LIMIT`_ with the integer value of your choosing.
+
+If you don't already have an override file, you can use the following command to create one in the correct directory:
+
+```shell
+systemctl edit fluent-bit.service
+```
+
+## Multiline support
+
+Fluent Bit 1.8 and later supports multiline core capabilities for the Tail input plugin. Fluent Bit supports the both the old and new configuration mechanisms. To avoid breaking changes, users are encouraged to use the latest one. The two mechanisms are:
+
+- Multiline core
+- Old multiline
+
+### Multiline core
+
+Multiline core is exposed by the following configuration:
+
+| Key                | Description                                                                                                                                       |
+|:-------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------|
+| `multiline.parser` | Specify one or multiple [Multiline Parser definitions](../../administration/configuring-fluent-bit/multiline-parsing.md) to apply to the content. |
+
+[Multiline Parser](../../administration/configuring-fluent-bit/multiline-parsing.md) provides built-in configuration modes. When using a new `multiline.parser` definition, you must disable the old configuration from your tail section like:
 
+- `parser`
+- `parser_firstline`
+- `parser_N`
+- `multiline`
+- `multiline_flush`
+- `docker_mode`
+
+### Multiline and containers
+
+If you are running Fluent Bit to process logs coming from containers like Docker or CRI, you can use the built-in modes. This helps reassemble multiline messages originally split by Docker or CRI:
+
+{% tabs %}
 {% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
   inputs:
-    - tail:
+    - name: tail
       path: /var/log/containers/*.log
       multiline.parser: docker, cri
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[INPUT]
+  name              tail
+  path              /var/log/containers/*.log
+  multiline.parser  docker, cri
+```
+
 {% endtab %}
 {% endtabs %}
 
-The two options separated by a comma means multi-format: try `docker` and `cri` multiline formats.
+The two options separated by a comma mean Fluent Bit will try each parser in the list in order, applying the first one that matches the log.
+
+It will use the first parser which has a `start_state` that matches the log.
 
-We are **still working** on extending support to do multiline for nested stack traces and such. Over the Fluent Bit v1.8.x release cycle we will be updating the documentation.
+For example, it will first try `docker`, and if `docker` doesn't match, it will then try `cri`.
 
-### Old Multiline Configuration Parameters <a id="multiline"></a>
+### Old multiline configuration parameters
 
-For the old multiline configuration, the following options exist to configure the handling of multilines logs:
+For the old multiline configuration, the following options exist to configure the handling of multiline logs:
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-| Multiline | If enabled, the plugin will try to discover multiline messages and use the proper parsers to compose the outgoing messages. Note that when this option is enabled the Parser option is not used. | Off |
-| Multiline\_Flush | Wait period time in seconds to process queued multiline messages | 4 |
-| Parser\_Firstline | Name of the parser that matches the beginning of a multiline message. Note that the regular expression defined in the parser must include a group name \(named capture\), and the value of the last match group must be a string |  |
-| Parser\_N | Optional-extra parser to interpret and structure multiline entries. This option can be used to define multiple parsers, e.g: Parser\_1 ab1,  Parser\_2 ab2, Parser\_N abN. |  |
+| Key                | Description                                                                                                                                                                                                             | Default |
+|:-------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------|
+| `multiline`        | If enabled, the plugin will try to discover multiline messages and use the proper parsers to compose the outgoing messages. When this option is enabled the Parser option isn't used.                                   | `off`   |
+| `multiline_flush`  | Wait period time in seconds to process queued multiline messages.                                                                                                                                                       | `4`     |
+| `parser_firstline` | Name of the parser that matches the beginning of a multiline message. The regular expression defined in the parser must include a group name (named `capture`), and the value of the last match group must be a string. | _none_  |
+| `parser_N`         | Optional. Extra parser to interpret and structure multiline entries. This option can be used to define multiple parsers. For example, `parser_1 ab1`, `parser_2 ab2`, `parser_N abN`.                                   | _none_  |
 
-### Old Docker Mode Configuration Parameters <a id="docker_mode"></a>
+### Old Docker mode configuration parameters
 
 Docker mode exists to recombine JSON log lines split by the Docker daemon due to its line length limit. To use this feature, configure the tail plugin with the corresponding parser and then enable Docker mode:
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-| Docker\_Mode | If enabled, the plugin will recombine split Docker log lines before passing them to any parser as configured above. This mode cannot be used at the same time as Multiline. | Off |
-| Docker\_Mode\_Flush | Wait period time in seconds to flush queued unfinished split lines. | 4 |
-| Docker\_Mode\_Parser | Specify an optional parser for the first line of the docker multiline mode. The parser name to be specified must be registered in the `parsers.conf` file. |  |
+| Key                  | Description                                                                                                                                                | Default |
+|:---------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------|:--------|
+| `docker_mode`        | If enabled, the plugin will recombine split Docker log lines before passing them to any parser. This mode can't be used at the same time as Multiline.     | `Off`   |
+| `docker_mode_flush`  | Wait period time in seconds to flush queued unfinished split lines.                                                                                        | `4`     |
+| `docker_mode_parser` | Specify an optional parser for the first line of the Docker multiline mode. The parser name to be specified must be registered in the `parsers.conf` file. | _none_  |
 
-## Getting Started <a id="getting_started"></a>
+## Get started
 
-In order to tail text or log files, you can run the plugin from the command line or through the configuration file:
+To tail text or log files, you can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
 From the command line you can let Fluent Bit parse text files with the following options:
 
-```bash
-$ fluent-bit -i tail -p path=/var/log/syslog -o stdout
+```shell
+fluent-bit -i tail -p path=/var/log/syslog -o stdout
 ```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections. 
+Append the following in your main configuration file:
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```python
-[INPUT]
-    Name        tail
-    Path        /var/log/syslog
-
-[OUTPUT]
-    Name   stdout
-    Match  *
-```
-{% endtab %}
-
 {% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
   inputs:
-    - tail:
+    - name: tail
       path: /var/log/syslog
-      
+
   outputs:
     - stdout:
       match: *
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[INPUT]
+  Name    tail
+  Path    /var/log/syslog
+
+[OUTPUT]
+  Name   stdout
+  Match  *
+```
+
 {% endtab %}
 {% endtabs %}
 
-![](../../.gitbook/assets/image%20%286%29.png)
+### Old multiline example
 
-### Old Multi-line example
+When using multiline configuration you need to first specify `Multiline On` in the configuration and use the `Parser_Firstline` and additional parser parameters `Parser_N` if needed.
 
-When using multi-line configuration you need to first specify `Multiline On` in the configuration and use the `Parser_Firstline` and additional parser parameters `Parser_N` if needed. If we are trying to read the following Java Stacktrace as a single event
+For example, you might be trying to read the following Java stack trace as a single event:
 
 ```text
 Dec 14 06:41:08 Exception in thread "main" java.lang.RuntimeException: Something has gone wrong, aborting!
@@ -171,42 +265,90 @@ Dec 14 06:41:08 Exception in thread "main" java.lang.RuntimeException: Something
     at com.myproject.module.MyProject.main(MyProject.java:6)
 ```
 
-We need to specify a `Parser_Firstline` parameter that matches the first line of a multi-line event. Once a match is made Fluent Bit will read all future lines until another match with `Parser_Firstline` is made .
+Specify a `parser_firstline` parameter that matches the first line of a multiline event. When a match is made, Fluent Bit reads all future lines until another match with `parser_firstline` is made.
 
-In the case above we can use the following parser, that extracts the Time as `time` and the remaining portion of the multiline as `log`
+In this case you can use the following parser, which extracts the time as `time` and the remaining portion of the multiline as `log`.
+
+{% tabs %}
+{% tab title="parsers.yaml" %}
+
+```yaml
+parsers:
+  - name: multiline
+    format: regex
+    regex: '/(?<time>[A-Za-z]+ \d+ \d+\:\d+\:\d+)(?<message>.*)/'
+    time_key: time
+    time_format: '%b %d %H:%M:%S'
+```
+
+{% endtab %}
+{% tab title="parsers.conf" %}
 
 ```text
 [PARSER]
-    Name multiline
-    Format regex
-    Regex /(?<time>[A-Za-z]+ \d+ \d+\:\d+\:\d+)(?<message>.*)/
-    Time_Key  time
-    Time_Format %b %d %H:%M:%S
+  Name multiline
+  Format regex
+  Regex /(?<time>[A-Za-z]+ \d+ \d+\:\d+\:\d+)(?<message>.*)/
+  Time_Key  time
+  Time_Format %b %d %H:%M:%S
+```
+
+{% endtab %}
+{% endtabs %}
+
+To further parse the entire event, you can add additional parsers with `Parser_N` where N is an integer. The final Fluent Bit configuration looks like the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+parsers:
+  - name: multiline
+    format: regex
+    regex: '/(?<time>[A-Za-z]+ \d+ \d+\:\d+\:\d+)(?<message>.*)/'
+    time_key: time
+    time_format: '%b %d %H:%M:%S'
+
+pipeline:
+  inputs:
+      - name:  tail
+        multiline: on
+        read_from_head: true
+        parser_firstline: multiline
+        path: /var/log/java.log
+
+  outputs:
+      - name: stdout
+        match: '*'
 ```
 
-If we want to further parse the entire event we can add additional parsers with `Parser_N` where N is an integer. The final Fluent Bit configuration looks like the following:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 # Note this is generally added to parsers.conf and referenced in [SERVICE]
 [PARSER]
-    Name multiline
-    Format regex
-    Regex /(?<time>[A-Za-z]+ \d+ \d+\:\d+\:\d+)(?<message>.*)/
-    Time_Key  time
-    Time_Format %b %d %H:%M:%S
+  Name multiline
+  Format regex
+  Regex /(?<time>[A-Za-z]+ \d+ \d+\:\d+\:\d+)(?<message>.*)/
+  Time_Key  time
+  Time_Format %b %d %H:%M:%S
 
 [INPUT]
-    Name             tail
-    Multiline        On
-    Parser_Firstline multiline
-    Path             /var/log/java.log
+  Name             tail
+  Multiline        On
+  Parser_Firstline multiline
+  Path             /var/log/java.log
 
 [OUTPUT]
-    Name             stdout
-    Match            *
+  Name             stdout
+  Match            *
 ```
 
-Our output will be as follows.
+{% endtab %}
+{% endtabs %}
+
+The output will be as follows:
 
 ```text
 [0] tail.0: [1607928428.466041977, {"message"=>"Exception in thread "main" java.lang.RuntimeException: Something has gone wrong, aborting!
@@ -216,19 +358,26 @@ Our output will be as follows.
     at com.myproject.module.MyProject.someMethod(MyProject.java:10)", "message"=>"at com.myproject.module.MyProject.main(MyProject.java:6)"}]
 ```
 
-## Tailing files keeping state <a id="keep_state"></a>
+## Tailing files keeping state
+
+The _tail_ input plugin a feature to save the state of the tracked files, is strongly suggested you enabled this. For this purpose the `db` property is available.
+
+For example:
 
-The _tail_ input plugin a feature to save the state of the tracked files, is strongly suggested you enabled this. For this purpose the **db** property is available, e.g:
+```shell
+fluent-bit -i tail -p path=/var/log/syslog -p db=/path/to/logs.db -o stdout
+```
+
+When Fluent Bit runs, the database file `_/path/to/logs.db` will be created. This database is backed by SQLite3. If you are interested in exploring the content, you can open it with the SQLite client tool:
 
-```bash
-$ fluent-bit -i tail -p path=/var/log/syslog -p db=/path/to/logs.db -o stdout
+```shell
+sqlite3 tail.db
 ```
 
-When running, the database file _/path/to/logs.db_ will be created, this database is backed by SQLite3 so if you are interested into explore the content, you can open it with the SQLite client tool, e.g:
+Which returns results like:
 
 ```text
-$ sqlite3 tail.db
--- Loading resources from /home/edsiper/.sqliterc
+-- Loading resources from /home/myusername/.sqliterc
 
 SQLite version 3.14.1 2016-08-11 18:53:32
 Enter ".help" for usage hints.
@@ -239,11 +388,11 @@ id     name                              offset        inode         created
 sqlite>
 ```
 
-> Make sure to explore when Fluent Bit is not hard working on the database file, otherwise you will see some _Error: database is locked_ messages.
+When exploring, ensure Fluent Bit isn't hard working on the database file, or you will see `Error: database is locked` messages.
 
-#### Formatting SQLite
+### Formatting SQLite
 
-By default SQLite client tool do not format the columns in a human read-way, so to explore _in\_tail\_files_ table you can create a config file in **~/.sqliterc** with the following content:
+By default, SQLite client tools don't format the columns in a human-readable way. To explore the `in_tail_files` table, you can create a configuration file in `~/.sqliterc` with the following content:
 
 ```text
 .headers on
@@ -251,32 +400,58 @@ By default SQLite client tool do not format the columns in a human read-way, so
 .width 5 32 12 12 10
 ```
 
-## SQLite and Write Ahead Logging
+## SQLite and write-ahead logging
 
-Fluent Bit keep the state or checkpoint of each file through using a SQLite database file, so if the service is restarted, it can continue consuming files from it last checkpoint position \(offset\). The default options set are enabled for high performance and corruption-safe.
+Fluent Bit keeps the state or checkpoint of each file through using a SQLite database file. If the service is restarted, it can continue consuming files from it last checkpoint position (offset). The default options set are enabled for high performance and corruption-safe.
 
-The SQLite journaling mode enabled is `Write Ahead Log` or `WAL`. This allows to improve performance of read and write operations to disk. When enabled, you will see in your file system additional files being created, consider the following configuration statement:
+The SQLite journal mode enabled is write-ahead logging or `WAL`. This allows improved performance of read and write operations to disk. When enabled, you will see in your file system additional files being created, consider the following configuration statement:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name:  tail
+      path: /var/log/containers/*.log
+      db: test.db
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    name    tail
-    path    /var/log/containers/*.log
-    db      test.db
+  name    tail
+  path    /var/log/containers/*.log
+  db      test.db
 ```
 
-The above configuration enables a database file called `test.db` and in the same path for that file SQLite will create two additional files:
+{% endtab %}
+{% endtabs %}
+
+The previous configuration enables a database file called `test.db` and in the same path for that file SQLite will create two additional files:
+
+- `test.db-shm`
+- `test.db-wal`
+
+These two files support the `WAL` mechanism that helps improve performance and reduce the number system calls required. The `-wal` file refers to the file that stores the new changes to be committed. At some point the `WAL` file transactions are moved back to the real database file. The `-shm` file is a shared-memory type to allow concurrent-users to the `WAL` file.
+
+### Write-ahead logging (`WAL`) and memory usage
 
-* test.db-shm
-* test.db-wal
+The `WAL` mechanism gives higher performance but also might increase the memory usage by Fluent Bit. Most of this usage comes from the memory mapped and cached pages. In some cases you might see that memory usage keeps a bit high giving the impression of a memory leak, but actually isn't relevant unless you want your memory metrics back to normal. Fluent Bit 1.7.3 introduced the new option `db.journal_mode` that sets the journal mode for databases. By default, this mode is set to `WAL`. Allowed configurations for `db.journal_mode` are `DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF` .
 
-Those two files aims to support the `WAL` mechanism that helps to improve performance and reduce the number system calls required. The `-wal` file refers to the file that stores the new changes to be committed, at some point the `WAL` file transactions are moved back to the real database file. The `-shm` file is a shared-memory type to allow concurrent-users to the `WAL` file.
+## File rotation
 
-### WAL and Memory Usage
+File rotation is properly handled, including `logrotate`'s `copytruncate` mode.
 
-The `WAL` mechanism give us higher performance but also might increase the memory usage by Fluent Bit. Most of this usage comes from the memory mapped and cached pages. In some cases you might see that memory usage keeps a bit high giving the impression of a memory leak, but actually is not relevant unless you want your memory metrics back to normal. Starting from Fluent Bit v1.7.3 we introduced the new option `db.journal_mode` mode that sets the journal mode for databases, by default it will be `WAL (Write-Ahead Logging)`, currently allowed configurations for `db.journal_mode` are `DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF` .
+{% hint style="warning" %}
 
-## File Rotation
+While file rotation is handled, there are risks of potential log loss when using `logrotate` with `copytruncate` mode:
 
-File rotation is properly handled, including logrotate's _copytruncate_ mode.
+- Race conditions: logs can be lost in the brief window between copying and truncating the file.
+- Backpressure: if Fluent Bit is under backpressure, logs might be dropped if `copyttruncate` occurs before they can be processed and sent.
+- See `logroate man page`: there is a very small-time slice between copying the file and truncating it, so some logging data might be lost.
+- Final note: the `Path` patterns can't match the rotated files. Otherwise, the rotated file would be read again and lead to duplicate records.
 
-Note that the `Path` patterns **cannot** match the rotated files. Otherwise, the rotated file would be read again and lead to duplicate records.
+{% endhint %}
diff --git a/pipeline/inputs/tcp.md b/pipeline/inputs/tcp.md
index ac3375c90..b2643ff34 100644
--- a/pipeline/inputs/tcp.md
+++ b/pipeline/inputs/tcp.md
@@ -1,106 +1,107 @@
 # TCP
 
-The **tcp** input plugin allows to retrieve structured JSON or raw messages over a TCP network interface (TCP port).
+The _TCP_ input plugin lets you retrieve structured JSON or raw messages over a TCP network interface (TCP port).
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key          | Description                                                                                                                                                                                                                                                    | Default |
-| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| Listen       | Listener network interface.                                                                                                                                                                                                                                    | 0.0.0.0 |
-| Port         | TCP port where listening for connections                                                                                                                                                                                                                       | 5170    |
-| Buffer\_Size | Specify the maximum buffer size in KB to receive a JSON message. If not set, the default size will be the value of _Chunk\_Size_.                                                                                                                              |         |
-| Chunk\_Size  | By default the buffer to store the incoming JSON messages, do not allocate the maximum memory allowed, instead it allocate memory when is required. The rounds of allocations are set by _Chunk\_Size_ in KB. If not set, _Chunk\_Size_ is equal to 32 (32KB). | 32      |
-| Format       | Specify the expected payload format. It support the options _json_ and _none_. When using _json_, it expects JSON maps, when is set to _none_, it will split every record using the defined _Separator_ (option below).                                        | json    |
-| Separator    | When the expected _Format_ is set to _none_, Fluent Bit needs a separator string to split the records. By default it uses the breakline character  (LF or 0x10).                                                                                               |         |
-| Source\_Address\_Key| Specify the key where the source address will be injected.                                                                                                                                                                                              |         |
+| Key                  | Description                                                                                                                                                                                                                                           | Default                     |
+|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------|
+| `Listen`             | Listener network interface.                                                                                                                                                                                                                           | `0.0.0.0`                   |
+| `Port`               | TCP port to listen for connections.                                                                                                                                                                                                                   | `5170`                      |
+| `Buffer_Size`        | Specify the maximum buffer size in KB to receive a JSON message. If not set, the default is the value of `Chunk_Size`.                                                                                                                                | `Chunk_Size`                |
+| `Chunk_Size`         | The default buffer to store the incoming JSON messages. It doesn't allocate the maximum memory allowed; instead it allocates memory when required. The rounds of allocations are set by `Chunk_Size`. If not set, `Chunk_Size` is equal to 32 (32&nbsp;KB). | `32`                        |
+| `Format`             | Specify the expected payload format. Supported values: `json` and `none`. When set to `json` it expects JSON maps. When set to `none`, every record splits using the defined `Separator`.                                                             | `json`                      |
+| `Separator`          | When `Format` is set to `none`, Fluent Bit needs a separator string to split the records.                                                                                                                                                             | `LF` or `0x10` (break line) |
+| `Source_Address_Key` | Specify the key to inject the source address.                                                                                                                                                                                                         | _none_                      |
+| `Threaded`           | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                                                                                                                                               | `false`                     |
 
-## Getting Started
+## Get started
 
-In order to receive JSON messages over TCP, you can run the plugin from the command line or through the configuration file:
+To receive JSON messages over TCP, you can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-From the command line you can let Fluent Bit listen for _JSON_ messages with the following options:
+From the command line you can let Fluent Bit listen for JSON messages with the following options:
 
-```bash
-$ fluent-bit -i tcp -o stdout
+```shell
+fluent-bit -i tcp -o stdout
 ```
 
-By default the service will listen an all interfaces (0.0.0.0) through TCP port 5170, optionally you can change this directly, e.g:
+By default, the service will listen an all interfaces (`0.0.0.0`) through TCP port `5170`. Optionally you can change this directly:
 
-```bash
-$ fluent-bit -i tcp://192.168.3.2:9090 -o stdout
+```shell
+fluent-bit -i tcp://192.168.3.2:9090 -o stdout
 ```
 
-In the example the JSON messages will only arrive through network interface under 192.168.3.2 address and TCP Port 9090.
+In the example the JSON messages will only arrive through the network interface at `192.168.3.2` address and TCP Port `9090`.
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+In your main configuration file append the following sections:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: tcp
+      listen: 0.0.0.0
+      port: 5170
+      chunk_size: 32
+      buffer_size: 64
+      format: json
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name        tcp
-    Listen      0.0.0.0
-    Port        5170
-    Chunk_Size  32
-    Buffer_Size 64
-    Format      json
+  Name        tcp
+  Listen      0.0.0.0
+  Port        5170
+  Chunk_Size  32
+  Buffer_Size 64
+  Format      json
 
 [OUTPUT]
-    Name        stdout
-    Match       *
+  Name        stdout
+  Match       *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: tcp
-          listen: 0.0.0.0
-          port: 5170
-          chunk_size: 32
-          buffer_size: 64
-          format: json
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
-## Testing
+## Test the configuration
 
-Once Fluent Bit is running, you can send some messages using the _netcat_:
+When Fluent Bit is running, you can send some messages using `netcat`:
 
-```bash
-$ echo '{"key 1": 123456789, "key 2": "abcdefg"}' | nc 127.0.0.1 5170
+```shell
+echo '{"key 1": 123456789, "key 2": "abcdefg"}' | nc 127.0.0.1 5170
 ```
 
-In [Fluent Bit](http://fluentbit.io) we should see the following output:
-
-```bash
-$ bin/fluent-bit -i tcp -o stdout -f 1
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
-
-[2019/10/03 09:19:34] [ info] [storage] initializing...
-[2019/10/03 09:19:34] [ info] [storage] in-memory
-[2019/10/03 09:19:34] [ info] [engine] started (pid=14569)
-[2019/10/03 09:19:34] [ info] [in_tcp] binding 0.0.0.0:5170
-[2019/10/03 09:19:34] [ info] [sp] stream processor started
+Run Fluent Bit:
+
+```shell
+fluent-bit -i tcp -o stdout -f 1
+```
+
+You should see the following output:
+
+```text
+...
 [0] tcp.0: [1570115975.581246030, {"key 1"=>123456789, "key 2"=>"abcdefg"}]
+...
 ```
 
-## Performance Considerations
+## Performance considerations
 
 When receiving payloads in JSON format, there are high performance penalties. Parsing JSON is a very expensive task so you could expect your CPU usage increase under high load environments.
 
diff --git a/pipeline/inputs/thermal.md b/pipeline/inputs/thermal.md
index 4c6447e2a..bb622809b 100644
--- a/pipeline/inputs/thermal.md
+++ b/pipeline/inputs/thermal.md
@@ -1,86 +1,94 @@
 # Thermal
 
-The **thermal** input plugin reports system temperatures periodically -- each second by default. Currently this plugin is only available for Linux.
+The _Thermal_ input plugin reports system temperatures. This plugin is available only for Linux.
 
-The following tables describes the information generated by the plugin.
+The following table describes the information generated by the plugin:
 
-| key | description |
-| :--- | :--- |
-| name | The name of the thermal zone, such as _thermal\_zone0_ |
-| type | The type of the thermal zone, such as _x86\_pkg\_temp_ |
-| temp | Current temperature in celsius |
+| Key    | Description                                            |
+|:-------|:-------------------------------------------------------|
+| `name` | The name of the thermal zone, such as `thermal_zone0`. |
+| `type` | The type of the thermal zone, such as `x86_pkg_temp`.  |
+| `temp` | Current temperature in Celsius.                        |
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description |
-| :--- | :--- |
-| Interval\_Sec | Polling interval \(seconds\).  default: 1 |
-| Interval\_NSec | Polling interval \(nanoseconds\).  default: 0 |
-| name\_regex | Optional name filter regex.  default: None |
-| type\_regex | Optional type filter regex.  default: None |
+| Key             | Description                                                                                             | Default  |
+|:----------------|:--------------------------------------------------------------------------------------------------------|:---------|
+| `Interval_Sec`  | Polling interval (seconds).                                                                             | `1`      |
+| `Interval_NSec` | Polling interval (nanoseconds).                                                                         | `0`      |
+| `name_regex`    | Optional name filter regular expression.                                                                | _none_   |
+| `type_regex`    | Optional type filter regular expression.                                                                | _none_   |
+| `Threaded`      | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs). | `false`. |
 
-## Getting Started
+## Get started
 
-In order to get temperature\(s\) of your system, you can run the plugin from the command line or through the configuration file:
+To get the temperature of your system, you can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-```bash
-$ bin/fluent-bit -i thermal -t my_thermal -o stdout -m '*'
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+Run Fluent Bit from the command line with the following command:
 
-[2019/08/18 13:39:43] [ info] [storage] initializing...
+```shell
+fluent-bit -i thermal -t my_thermal -o stdout -m '*'
+```
+
+You should see output similar to the following:
+
+```text
 ...
 [0] my_thermal: [1566099584.000085820, {"name"=>"thermal_zone0", "type"=>"x86_pkg_temp", "temp"=>60.000000}]
 [1] my_thermal: [1566099585.000136466, {"name"=>"thermal_zone0", "type"=>"x86_pkg_temp", "temp"=>59.000000}]
 [2] my_thermal: [1566099586.000083156, {"name"=>"thermal_zone0", "type"=>"x86_pkg_temp", "temp"=>59.000000}]
+...
 ```
 
-Some systems provide multiple thermal zones. In this example monitor only _thermal\_zone0_ by name, once per minute.
+Some systems provide multiple thermal zones. This example monitors only `thermal_zone0` by name, once per minute:
+
+```shell
+fluent-bit -i thermal -t my_thermal -p "interval_sec=60" -p "name_regex=thermal_zone0" -o stdout -m '*'
+```
 
-```bash
-$ bin/fluent-bit -i thermal -t my_thermal -p "interval_sec=60" -p "name_regex=thermal_zone0" -o stdout -m '*'
-Fluent Bit v1.3.0
-Copyright (C) Treasure Data
+Which returns output similar to:
 
-[2019/08/18 13:39:43] [ info] [storage] initializing...
+```text
 ...
 [0] my_temp: [1565759542.001053749, {"name"=>"thermal_zone0", "type"=>"pch_skylake", "temp"=>48.500000}]
 [0] my_temp: [1565759602.001661061, {"name"=>"thermal_zone0", "type"=>"pch_skylake", "temp"=>48.500000}]
+...
 ```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+In your main configuration file append the following:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: thermal
+      tag: my_thermal
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name thermal
-    Tag  my_thermal
+  Name thermal
+  Tag  my_thermal
 
 [OUTPUT]
-    Name  stdout
-    Match *
+  Name  stdout
+  Match *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: thermal
-          tag: my_thermal
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
\ No newline at end of file
diff --git a/pipeline/inputs/udp.md b/pipeline/inputs/udp.md
index 888e5d257..4a2660c1e 100644
--- a/pipeline/inputs/udp.md
+++ b/pipeline/inputs/udp.md
@@ -1,109 +1,108 @@
 # UDP
 
-The **udp** input plugin allows to retrieve structured JSON or raw messages over a UDP network interface (UDP port).
+The _UDP_ input plugin lets you retrieve structured JSON or raw messages over a UDP network interface (UDP port).
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key          | Description                                                                                                                                                                                                                                                    | Default |
-| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| Listen       | Listener network interface.                                                                                                                                                                                                                                    | 0.0.0.0 |
-| Port         | UDP port where listening for connections                                                                                                                                                                                                                       | 5170    |
-| Buffer\_Size | Specify the maximum buffer size in KB to receive a JSON message. If not set, the default size will be the value of _Chunk\_Size_.                                                                                                                              |         |
-| Chunk\_Size  | By default the buffer to store the incoming JSON messages, do not allocate the maximum memory allowed, instead it allocate memory when is required. The rounds of allocations are set by _Chunk\_Size_ in KB. If not set, _Chunk\_Size_ is equal to 32 (32KB). | 32      |
-| Format       | Specify the expected payload format. It support the options _json_ and _none_. When using _json_, it expects JSON maps, when is set to _none_, it will split every record using the defined _Separator_ (option below).                                        | json    |
-| Separator    | When the expected _Format_ is set to _none_, Fluent Bit needs a separator string to split the records. By default it uses the breakline character  (LF or 0x10).                                                                                               |         |
-| Source\_Address\_Key| Specify the key where the source address will be injected.                                                                                                                                                                                              |         |
+| Key                  | Description                                                                                                                                                                                          | Default                     |
+|----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------|
+| `Listen`             | Listener network interface.                                                                                                                                                                          | `0.0.0.0`                   |
+| `Port`               | UDP port used to listen for connections.                                                                                                                                                             | `5170`                      |
+| `Buffer_Size `       | Specify the maximum buffer size in KB to receive a JSON message. If not set, the default size will be the value of `Chunk_Size`.                                                                     | `Chunk_Size` (value)        |
+| `Chunk_Size`         | The default buffer to store incoming JSON messages. Doesn't allocate the maximum memory allowed; instead it allocates memory when required. The rounds of allocations are set by `Chunk_Size` in KB. | `32`                        |
+| `Format`             | Specify the expected payload format. Supported values: `json` and `none`. `json` expects JSON maps. `none` splits every record using the defined `Separator`.                                        | `json`                      |
+| `Separator`          | When `Format` is set to `none`, Fluent Bit needs a separator string to split the records.                                                                                                            | `LF` or `0x10` (break line) |
+| `Source_Address_Key` | Specify the key where the source address will be injected.                                                                                                                                           | _none_                      |
+| `Threaded`           | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                                                                                              | `false`                     |
 
-## Getting Started
+## Get started
 
-In order to receive JSON messages over UDP, you can run the plugin from the command line or through the configuration file:
+To receive JSON messages over UDP, you can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-From the command line you can let Fluent Bit listen for _JSON_ messages with the following options:
+From the command line you can let Fluent Bit listen for JSON messages with the following options:
 
-```bash
-$ fluent-bit -i udp -o stdout
+```shell
+fluent-bit -i udp -o stdout
 ```
 
-By default the service will listen an all interfaces (0.0.0.0) through UDP port 5170, optionally you can change this directly, e.g:
+By default, the service listens on all interfaces (`0.0.0.0`) using UDP port `5170`. Optionally. you can change this directly.
 
-```bash
-$ fluent-bit -i udp -pport=9090 -o stdout
-```
+In this example the JSON messages will only arrive through network interface at `192.168.3.2` address and UDP Port `9090`.
 
-In the example the JSON messages will only arrive through network interface under 192.168.3.2 address and UDP Port 9090.
+```shell
+fluent-bit -i udp -pport=9090 -o stdout
+```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+In your main configuration file append the following:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: udp
+      listen: 0.0.0.0
+      port: 5170
+      chunk_size: 32
+      buffer_size: 64
+      format: json
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name        udp
-    Listen      0.0.0.0
-    Port        5170
-    Chunk_Size  32
-    Buffer_Size 64
-    Format      json
+  Name        udp
+  Listen      0.0.0.0
+  Port        5170
+  Chunk_Size  32
+  Buffer_Size 64
+  Format      json
 
 [OUTPUT]
-    Name        stdout
-    Match       *
+  Name        stdout
+  Match       *
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: udp
-          listen: 0.0.0.0
-          port: 5170
-          chunk_size: 32
-          buffer_size: 64
-          format: json
-    outputs:
-        - name: stdout
-          match: '*'
-```
 {% endtab %}
 {% endtabs %}
 
 ## Testing
 
-Once Fluent Bit is running, you can send some messages using the _netcat_:
+When Fluent Bit is running, you can send some messages using `netcat`:
 
-```bash
-$ echo '{"key 1": 123456789, "key 2": "abcdefg"}' | nc -u 127.0.0.1 5170
+```shell
+echo '{"key 1": 123456789, "key 2": "abcdefg"}' | nc -u 127.0.0.1 5170
 ```
 
-In [Fluent Bit](http://fluentbit.io) we should see the following output:
-
-```bash
-$ bin/fluent-bit -i udp -o stdout -f 1
-Fluent Bit v2.x.x
-* Copyright (C) 2015-2022 The Fluent Bit Authors
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
-
-[2023/07/21 13:01:03] [ info] [fluent bit] version=2.1.7, commit=2474ccc759, pid=9677
-[2023/07/21 13:01:03] [ info] [storage] ver=1.2.0, type=memory, sync=normal, checksum=off, max_chunks_up=128
-[2023/07/21 13:01:03] [ info] [cmetrics] version=0.6.3
-[2023/07/21 13:01:03] [ info] [ctraces ] version=0.3.1
-[2023/07/21 13:01:03] [ info] [input:udp:udp.0] initializing
-[2023/07/21 13:01:03] [ info] [input:udp:udp.0] storage_strategy='memory' (memory only)
-[2023/07/21 13:01:03] [ info] [output:stdout:stdout.0] worker #0 started
-[2023/07/21 13:01:03] [ info] [sp] stream processor started
+Run Fluent Bit:
+
+```shell
+fluent-bit -i udp -o stdout -f 1
+```
+
+You should see the following output:
+
+```text
+...
 [0] udp.0: [[1689912069.078189000, {}], {"key 1"=>123456789, "key 2"=>"abcdefg"}]
+...
 ```
 
-## Performance Considerations
+## Performance considerations
 
 When receiving payloads in JSON format, there are high performance penalties. Parsing JSON is a very expensive task so you could expect your CPU usage increase under high load environments.
 
-To get faster data ingestion, consider to use the option `Format none` to avoid JSON parsing if not needed.
+To get faster data ingestion, consider using the option `Format none` to avoid JSON parsing if not needed.
\ No newline at end of file
diff --git a/pipeline/inputs/windows-event-log-winevtlog.md b/pipeline/inputs/windows-event-log-winevtlog.md
index 2edaaee4b..633d11afc 100644
--- a/pipeline/inputs/windows-event-log-winevtlog.md
+++ b/pipeline/inputs/windows-event-log-winevtlog.md
@@ -1,63 +1,91 @@
-# Windows Event Log (winevtlog)
+# Windows Event logs (winevtlog)
 
-The **winevtlog** input plugin allows you to read Windows Event Log with new API from `winevt.h`.
+The _Windows Event logs_ (`winevtlog`) input plugin lets you read Windows Event logs with the API from `winevt.h`.
 
-## Configuration Parameters <a id="config"></a>
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-| Channels | A comma-separated list of channels to read from. |  |
-| Interval\_Sec | Set the polling interval for each channel. \(optional\) | 1 |
-| Interval\_NSec | Set the polling interval for each channel (sub seconds. \(optional\) | 0 |
-| Read\_Existing\_Events | Whether to read existing events from head or tailing events at last on subscribing. \(optional\) | False |
-| DB | Set the path to save the read offsets. \(optional\) |  |
-| String\_Inserts | Whether to include StringInserts in output records. \(optional\) | True  |
-| Render\_Event\_As\_XML | Whether to render system part of event as XML string or not. \(optional\) | False  |
-| Use\_ANSI | Use ANSI encoding on eventlog messages. If you have issues receiving blank strings with old Windows versions (Server 2012 R2), setting this to True may solve the problem. \(optional\) | False  |
-| Event\_Query | Specify XML query for filtering events. | `*` |
-| Read\_Limit\_Per\_Cycle | Specify read limit per cycle.  | 512KiB |
+| Key                       | Description                                                                                                                                                                                | Default  |
+|:--------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------|
+| `Channels`                | A comma-separated list of channels to read from.                                                                                                                                           | _none_   |
+| `Interval_Sec`            | Optional. Set the polling interval for each channel.                                                                                                                                       | `1`      |
+| `Interval_NSec`           | Optional. Set the polling interval for each channel. (nanoseconds)                                                                                                                         | `0 `     |
+| `Read_Existing_Events`    | Optional. Whether to read existing events from head or tailing events at last on subscribing.                                                                                              | `False`  |
+| `DB`                      | Optional. Set the path to save the read offsets.                                                                                                                                           | _none_   |
+| `String_Inserts`          | Optional. Whether to include string inserts in output records.                                                                                                                             | `True`   |
+| `Render_Event_As_XML`     | Optional. Whether to render the system part of an event as an XML string or not.                                                                                                           | `False`  |
+| `Ignore_Missing_Channels` | Optional. Whether to ignore event channels not present in the event log, and continue running with subscribed channels.                                                                    | `False`  |
+| `Use_ANSI`                | Optional. Use ANSI encoding on `eventlog` messages. If you have issues receiving blank strings with old Windows versions (Server 2012 R2), setting this to `True` might solve the problem. | `False`  |
+| `Event_Query`             | Specify XML query for filtering events.                                                                                                                                                    | `*`      |
+| `Read_Limit_Per_Cycle`    | Specify read limit per cycle.                                                                                                                                                              | `512KiB` |
+| Threaded                  | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs).                                                                                    | `false`  |
+| `Remote.Server`           | Specify server name of remote access for Windows EventLog.                                                                                                                                 | _none_   |
+| `Remote.Domain`           | Specify domain name of remote access for Windows EventLog.                                                                                                                                 | _none_   |
+| `Remote.Username`         | Specify user name of remote access for Windows EventLog.                                                                                                                                   | _none_   |
+| `Remote.Password`         | Specify password of remote access for Windows EventLog.                                                                                                                                    | _none_   |
+
+If `db` isn't set, the plugin will tail channels on each startup.
+
+## Configuration examples
+
+### Configuration file
 
-Note that if you do not set _db_, the plugin will tail channels on each startup.
+Here is a minimum configuration example.
 
-## Configuration Examples <a id="config_example"></a>
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-### Configuration File
+```yaml
+pipeline:
+  inputs:
+    - name: winevtlog
+      channels: Setup,Windows PowerShell
+      interval_sec: 1
+      db: winevtlog.sqlite
 
-Here is a minimum configuration example.
+  outputs:
+    - name: stdout
+      match: '*'
+```
 
-```python
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name         winevtlog
-    Channels     Setup,Windows PowerShell
-    Interval_Sec 1
-    DB           winevtlog.sqlite
+  Name         winevtlog
+  Channels     Setup,Windows PowerShell
+  Interval_Sec 1
+  DB           winevtlog.sqlite
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
 
-Note that some Windows Event Log channels \(like `Security`\) requires an admin privilege for reading. In this case, you need to run fluent-bit as an administrator.
+{% endtab %}
+{% endtabs %}
+
+Some Windows Event Log channels, like `Security`, require administrative privilege for reading. In this case, you must run Fluent Bit as an administrator.
+
+The default value of `Read_Limit_Per_Cycle` is `512KiB`.
 
-The default value of Read\_Limit\_Per\_Cycle is set up as 512KiB.
-Note that 512KiB(= 0x7ffff = 512 * 1024 * 1024) does not equals to 512KB (= 512 * 1000 * 1000).
-To increase events per second on this plugin, specify larger value than 512KiB.
+512&nbsp;KiB(= 0x7ffff = 512 * 1024 * 1024) isn't equal to 512&nbsp;KB (= 512 * 1000 * 1000). To increase events per second on this plugin, specify larger value than 512&nbsp;KiB.
 
-#### Query Languages for Event_Query Parameter
+#### Query languages for `Event_Query` parameter
 
 The `Event_Query` parameter can be used to specify the XML query for filtering Windows EventLog during collection.
-The supported query types are [XPath](https://developer.mozilla.org/en-US/docs/Web/XPath) and XML Query.
-For further details, please refer to [the MSDN doc](https://learn.microsoft.com/en-us/windows/win32/wes/consuming-events).
+The supported query types are [`XPath`](https://developer.mozilla.org/en-US/docs/Web/XPath) and XML Query.
+For further details, refer to [Microsoft's documentation](https://learn.microsoft.com/en-us/windows/win32/wes/consuming-events).
 
-### Command Line
+### Command line
 
-If you want to do a quick test, you can run this plugin from the command line.
+If you want to do a test, you can run this plugin from the command line:
 
-```bash
-$ fluent-bit -i winevtlog -p 'channels=Setup' -p 'Read_Existing_Events=true' -o stdout
+```shell
+fluent-bit -i winevtlog -p 'channels=Setup' -p 'Read_Existing_Events=true' -o stdout
 ```
 
-Note that `winevtlog` plugin will tail channels on each startup.
-If you want to confirm whether this plugin is working or not, you should specify `-p 'Read_Existing_Events=true'` parameter.
+The `winevtlog` plugin will tail channels on each startup.
+If you want to confirm whether this plugin is working or not, specify the `-p 'Read_Existing_Events=true'` parameter.
diff --git a/pipeline/inputs/windows-event-log.md b/pipeline/inputs/windows-event-log.md
index 3cac1ccdb..a7f20fd44 100644
--- a/pipeline/inputs/windows-event-log.md
+++ b/pipeline/inputs/windows-event-log.md
@@ -1,43 +1,63 @@
-# Windows Event Log
+# Windows Event logs (winlog)
 
-The **winlog** input plugin allows you to read Windows Event Log.
+The _Windows Event logs_ (`winlog`) input plugin lets you read Windows Event logs.
 
-## Configuration Parameters <a href="config" id="config"></a>
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
-| Key          | Description                                           | Default |
-| ------------ | ----------------------------------------------------- | ------- |
-| Channels     | A comma-separated list of channels to read from.      |         |
-| Interval_Sec | Set the polling interval for each channel. (optional) | 1       |
-| DB           | Set the path to save the read offsets. (optional)     |         |
+| Key            | Description                                                                                             | Default |
+|----------------|---------------------------------------------------------------------------------------------------------|---------|
+| `Channels`     | A comma-separated list of channels to read from.                                                        | _none_  |
+| `Interval_Sec` | Set the polling interval for each channel. (optional)                                                   | `1`     |
+| `DB`           | Set the path to save the read offsets. (optional)                                                       | _none_  |
+| `Threaded`     | Indicates whether to run this input in its own [thread](../../administration/multithreading.md#inputs). | `false` |
 
-Note that if you do not set _db_, the plugin will read channels from the beginning on each startup.
+If `db` isn't set, the plugin will read channels from the beginning on each startup.
 
-## Configuration Examples <a href="config_example" id="config_example"></a>
+## Configuration examples
 
-### Configuration File
+### Configuration file
 
 Here is a minimum configuration example.
 
-```python
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: winlog
+      channels: setup,Windows Powershell
+      interval_sec: 1
+      db: winlog.sqlite
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name         winlog
-    Channels     Setup,Windows PowerShell
-    Interval_Sec 1
-    DB           winlog.sqlite
+  Name         winlog
+  Channels     Setup,Windows PowerShell
+  Interval_Sec 1
+  DB           winlog.sqlite
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
 ```
 
-Note that some Windows Event Log channels (like `Security`) requires an admin privilege for reading. In this case, you need to run fluent-bit as an administrator.
+Some Windows Event Log channels, like `Security`, require administrative privileges for reading. In this case, you need to run Fluent Bit as an administrator.
 
-### Command Line
+### Command line
 
-If you want to do a quick test, you can run this plugin from the command line.
+If you want to do a test, you can run this plugin from the command line:
 
-```bash
-$ fluent-bit -i winlog -p 'channels=Setup' -o stdout
+```shell
+fluent-bit -i winlog -p 'channels=Setup' -o stdout
 ```
diff --git a/pipeline/inputs/windows-exporter-metrics.md b/pipeline/inputs/windows-exporter-metrics.md
index 61713457e..bdf368a96 100644
--- a/pipeline/inputs/windows-exporter-metrics.md
+++ b/pipeline/inputs/windows-exporter-metrics.md
@@ -1,75 +1,108 @@
 ---
-description: >-
-  A plugin based on Prometheus Windows Exporter to collect system / host level
-  metrics
+description: A plugin based on Prometheus Windows Exporter to collect system and host level metrics
 ---
 
-# Windows Exporter Metrics
+# Windows exporter metrics
 
-[Prometheus Windows Exporter](https://github.com/prometheus-community/windows_exporter) is a popular way to collect system level metrics from microsoft windows, such as CPU / Disk / Network / Process statistics. Fluent Bit 1.9.0 includes windows exporter metrics plugin that builds off the Prometheus design to collect system level metrics without having to manage two separate processes or agents.
+[Prometheus Windows exporter](https://github.com/prometheus-community/windows_exporter) is a popular way to collect system level metrics from Microsoft Windows, such as CPU, Disk, Network, and Process statistics. Fluent Bit 1.9.0 and later includes the Windows Exporter metrics plugin that builds off the Prometheus design to collect system level metrics without having to manage two separate processes or agents.
 
-The initial release of Windows Exporter Metrics contains a single collector available from Prometheus Windows Exporter and we plan to expand it over time.
-
-**Important note:** Metrics collected with Windows Exporter Metrics flow through a separate pipeline from logs and current filters do not operate on top of metrics.
+The initial release of Windows Exporter metrics contains a single collector available from Prometheus Windows Exporter.
 
+Metrics collected with Windows Exporter metrics flow through a separate pipeline from logs and current filters don't operate on top of metrics.
 
 ## Configuration
 
-| Key             | Description                                                            | Default   |
-| --------------- | ---------------------------------------------------------------------- | --------- |
-| scrape\_interval | The rate at which metrics are collected from the host operating system | 5 seconds |
-| we.logical\_disk.allow\_disk\_regex | Specify the regex for logical disk metrics to allow collection of. Collect all by default. | "/.+/"    |
-| we.logical\_disk.deny\_disk\_regex  | Specify the regex for logical disk metrics to prevent collection of/ignore. Allow all by default. | `NULL`    |
-|we.net.allow\_nic\_regex            | Specify the regex for network metrics captured by the name of the NIC, by default captures all NICs but to exclude adjust the regex.  | "/.+/"    |
-| we.service.where           | Specify the WHERE clause for retrieving service metrics.  | `NULL`   |
-| we.service.include         | Specify the key value pairs for the include condition for the WHERE clause of service metrics. | `NULL`   |
-| we.service.exclude         | Specify the key value pairs for the exclude condition for the WHERE clause of service metrics. | `NULL`   |
-| we.process.allow\_process\_regex | Specify the regex covering the process metrics to  collect. Collect all by default. | "/.+/"    |
-| we.process.deny\_process\_regex  | Specify the regex for process metrics to prevent collection of/ignore. Allow all by default. | `NULL`    |
-| collector.cpu.scrape\_interval | The rate in seconds at which cpu metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.net.scrape\_interval | The rate in seconds at which net metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.logical_disk.scrape\_interval | The rate in seconds at which logical\_disk metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.cs.scrape\_interval | The rate in seconds at which cs metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.os.scrape\_interval | The rate in seconds at which os metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.thermalzone.scrape\_interval | The rate in seconds at which thermalzone metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used.| 0 seconds |
-| collector.cpu\_info.scrape\_interval | The rate in seconds at which cpu\_info metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.logon.scrape\_interval    | The rate in seconds at which logon metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.system.scrape\_interval   | The rate in seconds at which system metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.service.scrape\_interval   | The rate in seconds at which service metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.memory.scrape\_interval   | The rate in seconds at which memory metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.paging_file.scrape\_interval   | The rate in seconds at which paging_file metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| collector.process.scrape\_interval   | The rate in seconds at which process metrics are collected from the host operating system. If a value greater than 0 is used then it overrides the global default otherwise the global default is used. | 0 seconds |
-| metrics | To specify which metrics are collected from the host operating system. | `"cpu,cpu_info,os,net,logical_disk,cs,thermalzone,logon,system,service"` |
+| Key                                      | Description                                                                                                                                                    | Default                                                                  |
+|------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------|
+| `scrape_interval`                        | The rate at which metrics are collected.                                                                                                                       | `5 seconds`                                                              |
+| `we.logical_disk.allow_disk_regex`       | Specify the regular expression for logical disk metrics to allow collection of.                                                                                | `"/.+/"` (all)                                                           |
+| `we.logical_disk.deny_disk_regex`        | Specify the regular expression for logical disk metrics to prevent collection of or ignore.                                                                    | `NULL` (all)                                                             |
+| `we.net.allow_nic_regex`                 | Specify the regular expression for network metrics captured by the name of the NIC.                                                                            | `"/.+/"` (all)                                                           |
+| `we.service.where`                       | Specify the `WHERE` clause for retrieving service metrics.                                                                                                     | `NULL`                                                                   |
+| `we.service.include`                     | Specify the key value pairs for the include condition for the `WHERE` clause of service metrics.                                                               | `NULL`                                                                   |
+| `we.service.exclude`                     | Specify the key value pairs for the exclude condition for the `WHERE` clause of service metrics.                                                               | `NULL`                                                                   |
+| `we.process.allow_process_regex`         | Specify the regular expression covering the process metrics to collect.                                                                                        | `"/.+/"` (all)                                                           |
+| `we.process.deny_process_regex`          | Specify the regular expression for process metrics to prevent collection of or ignore.                                                                         | `NULL` (all)                                                             |
+| `collector.cpu.scrape_interval`          | The rate in seconds at which `cpu` metrics are collected. Values greater than `0` override the global default. Otherwise, the global default is used.          | `0 seconds`                                                              |
+| `collector.net.scrape_interval`          | The rate in seconds at which `net` metrics are collected. Values greater than `0` override the global default. Otherwise, the global default is used.          | `0 seconds`                                                              |
+| `collector.logical_disk.scrape_interval` | The rate in seconds at which `logical_disk` metrics are collected. Values greater than `0` override the global default. Otherwise, the global default is used. | `0 seconds`                                                              |
+| `collector.cs.scrape_interval`           | The rate in seconds at which `cs` metrics are collected. Values greater than `0` override the global default. Otherwise, the global default is used.           | `0 seconds`                                                              |
+| `collector.os.scrape_interval`           | The rate in seconds at which `os` metrics are collected. Values greater than `0` override the global default. Otherwise, the global default is used.           | `0 seconds`                                                              |
+| `collector.thermalzone.scrape_interval`  | The rate in seconds at which `thermalzone` metrics are collected. Values greater than `0` override the global default. Otherwise, the global default is used.  | `0 seconds`                                                              |
+| `collector.cpu_info.scrape_interval`     | The rate in seconds at which `cpu_info` metrics are collected. Values greater than `0` override the global default. Otherwise, the global default is used.     | `0 seconds`                                                              |
+| `collector.logon.scrape_interval`        | The rate in seconds at which `logon` metrics are collected. Values greater than `0` override the global default. Otherwise, the global default is used.        | `0 seconds`                                                              |
+| `collector.system.scrape_interval`       | The rate in seconds at which `system` metrics are collected. Values greater than `0` override the global default. Otherwise, the global default is used.       | `0 seconds`                                                              |
+| `collector.service.scrape_interval`      | The rate in seconds at which `service` metrics are collected. Values greater than `0` override the global default. Otherwise, the global default is used.      | `0 seconds`                                                              |
+| `collector.memory.scrape_interval`       | The rate in seconds at which `memory` metrics are collected. Values greater than `0` override the global default. Otherwise, the global default is used.       | `0 seconds`                                                              |
+| `collector.paging_file.scrape_interval`  | The rate in seconds at which `paging_file` metrics are collected. Values greater than `0` override the global default. Otherwise, the global default is used.  | `0 seconds`                                                              |
+| `collector.process.scrape_interval`      | The rate in seconds at which `process` metrics are collected. Values greater than `0` override the global default. Otherwise, the global default is used.      | `0 seconds`                                                              |
+| `metrics`                                | Specify which metrics are collected.                                                                                                                           | `"cpu,cpu_info,os,net,logical_disk,cs,thermalzone,logon,system,service"` |
 
 ## Collectors available
 
-The following table describes the available collectors as part of this plugin. All of them are enabled by default and respects the original metrics name, descriptions, and types from Prometheus Windows Exporter, so you can use your current dashboards without any compatibility problem.
+The following table describes the available collectors as part of this plugin. All collectors are enabled by default and respect the original metrics name, descriptions, and types from Prometheus Windows Exporter, so you can use your current dashboards without any compatibility problem.
+
+The Version column specifies the Fluent Bit version where the collector is available.
+
+| Name           | Description                        | OS      | Version |
+|----------------|------------------------------------|---------|---------|
+| `cpu`          | Exposes CPU statistics.            | Windows | v1.9    |
+| `net`          | Exposes Network statistics.        | Windows | v2.0.8  |
+| `logical_disk` | Exposes `logical_disk` statistics. | Windows | v2.0.8  |
+| `cs`           | Exposes `cs` statistics.           | Windows | v2.0.8  |
+| `os`           | Exposes OS statistics.             | Windows | v2.0.8  |
+| `thermalzone`  | Exposes `thermalzone` statistics.  | Windows | v2.0.8  |
+| `cpu_info`     | Exposes `cpu_info` statistics.     | Windows | v2.0.8  |
+| `logon`        | Exposes `logon` statistics.        | Windows | v2.0.8  |
+| `system`       | Exposes `system` statistics.       | Windows | v2.0.8  |
+| `service`      | Exposes `service` statistics.      | Windows | v2.1.6  |
+| `memory`       | Exposes `memory` statistics.       | Windows | v2.1.9  |
+| `paging_file`  | Exposes `paging_file` statistics.  | Windows | v2.1.9  |
+| `process`      | Exposes `process` statistics.      | Windows | v2.1.9  |
+
+## Threading
 
-> note: the Version column specifies the Fluent Bit version where the collector is available.
+This input always runs in its own [thread](../../administration/multithreading.md#inputs).
 
-| Name          | Description                                                                                      | OS      | Version |
-| ------------- | ------------------------------------------------------------------------------------------------ | ------- | ------- |
-| cpu           | Exposes CPU statistics.                                                                          | Windows | v1.9    |
-| net           | Exposes Network statistics.                                                                      | Windows | v2.0.8  |
-| logical\_disk | Exposes logical\_disk statistics.                                                                | Windows | v2.0.8  |
-| cs            | Exposes cs statistics.                                                                           | Windows | v2.0.8  |
-| os            | Exposes OS statistics.                                                                           | Windows | v2.0.8  |
-| thermalzone   | Exposes thermalzone statistics.                                                                  | Windows | v2.0.8  |
-| cpu\_info     | Exposes cpu\_info statistics.                                                                    | Windows | v2.0.8  |
-| logon         | Exposes logon statistics.                                                                        | Windows | v2.0.8  |
-| system        | Exposes system statistics.                                                                       | Windows | v2.0.8  |
-| service       | Exposes service statistics.                                                                      | Windows | v2.1.6  |
-| memory        | Exposes memory statistics.                                                                       | Windows | v2.1.9  |
-| paging\_file   | Exposes paging\_file statistics.                                                                | Windows | v2.1.9  |
-| process       | Exposes process statistics.                                                                      | Windows | v2.1.9  |
+## Get started
 
-## Getting Started
+### Configuration file
 
-### Simple Configuration File
+In the following configuration file, the input plugin `windows_exporter_metrics` collects `metrics` every two seconds and exposes them through the [Prometheus Exporter](../outputs/prometheus-exporter.md) output plugin on HTTP/TCP port `2021`.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+# Node Exporter Metrics + Prometheus Exporter
+# -------------------------------------------
+# The following example collect host metrics on Linux and expose
+# them through a Prometheus HTTP end-point.
+#
+# After starting the service try it with:
+#
+# $ curl http://127.0.0.1:2021/metrics
+#
+service:
+  flush: 1
+  log_level: info
 
-In the following configuration file, the input plugin _windows_exporter_metrics collects _metrics every 2 seconds and exposes them through our [Prometheus Exporter](../outputs/prometheus-exporter.md) output plugin on HTTP/TCP port 2021.
+pipeline:
+  inputs:
+    - name: windows_exporter_metrics
+      tag: node_metrics
+      scrape_interval: 2
 
+  outputs:
+    - name: prometheus_exporter
+      match: node_metrics
+      port: 2021
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 # Node Exporter Metrics + Prometheus Exporter
 # -------------------------------------------
 # The following example collect host metrics on Linux and expose
@@ -80,97 +113,101 @@ In the following configuration file, the input plugin _windows_exporter_metrics
 # $ curl http://127.0.0.1:2021/metrics
 #
 [SERVICE]
-    flush           1
-    log_level       info
+  flush           1
+  log_level       info
 
 [INPUT]
-    name            windows_exporter_metrics
-    tag             node_metrics
-    scrape_interval 2
+  name            windows_exporter_metrics
+  tag             node_metrics
+  scrape_interval 2
 
 [OUTPUT]
-    name            prometheus_exporter
-    match           node_metrics
-    host            0.0.0.0
-    port            2021
-
-
+  name            prometheus_exporter
+  match           node_metrics
+  host            0.0.0.0
+  port            2021
 ```
 
-You can test the expose of the metrics by using _curl:_
+{% endtab %}
+{% endtabs %}
+
+You can test the expose of the metrics by using `curl`:
 
-```bash
+```shell
 curl http://127.0.0.1:2021/metrics
 ```
 
 ### Service where clause
 
-Windows service collector will retrieve all of the service information for the local node or container.
+Windows service collector will retrieve all the service information for the local node or container.
 `we.service.where`, `we.service.include`, and `we.service.exclude` can be used to filter the service metrics.
 
-To filter these metrics, users should specify a WHERE clause.
-This syntax is defined in [the WMI Query Language(WQL)](https://learn.microsoft.com/en-us/windows/win32/wmisdk/wql-sql-for-wmi).
+To filter these metrics, users should specify a `WHERE` clause.
+This syntax is defined in [the WMI Query Language (WQL)](https://learn.microsoft.com/en-us/windows/win32/wmisdk/wql-sql-for-wmi).
 
 Here is how these parameters should work:
 
-#### we.service.where
+#### `we.service.where`
 
-`we.service.where` is handled as a raw WHERE clause.
+`we.service.where` is handled as a raw `WHERE` clause.
 For example, when a user specifies the parameter as follows:
 
-```
+```text
 we.service.where Status!='OK'
 ```
 
 This creates a WMI query like so:
-```
+
+```sql
 SELECT * FROM Win32_Service WHERE Status!='OK'
 ```
 
-The WMI mechanism will then handle it and return the information which has a "not OK" status in this example.
+The WMI mechanism will then handle it and return the information which has a `not OK` status in this example.
 
-### we.service.include
+### `we.service.include`
 
-When defined, the `we.service.include` is interpreted into a WHERE clause.
+When defined, the `we.service.include` is interpreted into a `WHERE` clause.
 If multiple key-value pairs are specified, the values will be concatenated with `OR`.
 Also, if the values contain `%` character then a `LIKE` operator will be used in the clause instead of the `=` operator.
 When a user specifies the parameter as follows:
 
-```python
+```text
 we.service.include {"Name":"docker","Name":"%Svc%", "Name":"%Service"}
 ```
 
 The parameter will be interpreted as:
-```
+
+```text
 (Name='docker' OR Name LIKE '%Svc%' OR Name LIKE '%Service')
 ```
 
 The WMI query will be called with the translated parameter as:
 
-```
+```sql
 SELECT * FROM Win32_Service WHERE (Name='docker' OR Name LIKE '%Svc%' OR Name LIKE '%Service')
 ```
 
-### we.service.exclude
+### `we.service.exclude`
 
-When defined, the `we.service.exclude` is interpreted into a WHERE clause.
+When defined, the `we.service.exclude` is interpreted into a `WHERE` clause.
 If multiple key-value pairs are specified, the values will be concatenated with `AND`.
 
 Also, if the values contain `%` character then a `LIKE` operator will be used in the translated clause instead of the `!=` operator.
 When a user specifies the parameter as follows:
 
-```python
+```text
 we.service.exclude {"Name":"UdkUserSvc%","Name":"webthreatdefusersvc%","Name":"XboxNetApiSvc"}
 ```
 
 The parameter will be interpreted as:
-```
+
+```sql
 (NOT Name LIKE 'UdkUserSvc%' AND NOT Name LIKE 'webthreatdefusersvc%' AND Name!='XboxNetApiSvc')
 ```
 
 The WMI query will be called with the translated parameter as:
 
-```
+```sql
 SELECT * FROM Win32_Service WHERE (NOT Name LIKE 'UdkUserSvc%' AND NOT Name LIKE 'webthreatdefusersvc%' AND Name!='XboxNetApiSvc')
 ```
 
@@ -179,14 +216,14 @@ SELECT * FROM Win32_Service WHERE (NOT Name LIKE 'UdkUserSvc%' AND NOT Name LIKE
 `we.service.where`, `we.service.include`, and `we.service.exclude` can all be used at the same time subject to the following rules.
 
 1. `we.service.include` translated and applied into the where clause in the service collector
-1. `we.service.exclude` translated and applied into the where clause in the service collector
+2. `we.service.exclude` translated and applied into the where clause in the service collector
     1. If the `we.service.include` is applied, translated `we.service.include` and `we.service.exclude` conditions are concatenated with `AND`.
-1. `we.service.where` is just handled as-is into the where clause in the service collector .
-    1. If either of the above parameters is applied, the clause will be applied with `AND (` _the value of `we.service.where`_ `)`.
+1. `we.service.where` is handled as-is into the where clause in the service collector .
+    1. If either of the previous parameters is applied, the clause will be applied with `AND (` _the value of `we.service.where`_ `)`.
 
 For example, when a user specifies the parameter as follows:
 
-```
+```text
 we.service.include {"Name":"docker","Name":"%Svc%", "Name":"%Service"}
 we.service.exclude {"Name":"UdkUserSvc%","Name":"XboxNetApiSvc"}
 we.service.where NOT Name LIKE 'webthreatdefusersvc%'
@@ -194,13 +231,12 @@ we.service.where NOT Name LIKE 'webthreatdefusersvc%'
 
 The WMI query will be called with the translated parameter as:
 
-```
+```sql
  SELECT * FROM Win32_Service WHERE (Name='docker' OR Name LIKE '%Svc%' OR Name LIKE '%Service') AND (NOT Name LIKE 'UdkUserSvc%' AND Name!='XboxNetApiSvc') AND (NOT Name LIKE 'webthreatdefusersvc%')
 ```
 
+## Enhancement requests
 
-## Enhancement Requests
+The plugin implements a subset of the available collectors in the original Prometheus Windows Exporter. If you would like a specific collector prioritized, open a GitHub issue by using the following template:
 
-Our current plugin implements a sub-set of the available collectors in the original Prometheus Windows Exporter, if you would like that we prioritize a specific collector please open a Github issue by using the following template:\
-\
-\- [in_windows_exporter_metrics](https://github.com/fluent/fluent-bit/issues/new?assignees=\&labels=\&template=feature_request.md\&title=in_windows_exporter_metrics:%20add%20ABC%20collector)
+- [`in_windows_exporter_metrics`](https://github.com/fluent/fluent-bit/issues/new?assignees=\&labels=\&template=feature_request.md\&title=in_windows_exporter_metrics:%20add%20ABC%20collector)
diff --git a/pipeline/outputs/azure.md b/pipeline/outputs/azure.md
index eda87d29d..24af7f304 100644
--- a/pipeline/outputs/azure.md
+++ b/pipeline/outputs/azure.md
@@ -1,64 +1,105 @@
 ---
-description: 'Send logs, metrics to Azure Log Analytics'
+description: Send logs, metrics to Azure Log Analytics
 ---
 
 # Azure Log Analytics
 
-![](../../.gitbook/assets/image%20%287%29.png)
+The Azure output plugin lets you ingest your records into [Azure Log Analytics](https://azure.microsoft.com/en-us/services/log-analytics/) service.
 
-Azure output plugin allows to ingest your records into [Azure Log Analytics](https://azure.microsoft.com/en-us/services/log-analytics/) service.
+For details about how to setup Azure Log Analytics, see the [Azure Log Analytics](https://docs.microsoft.com/en-us/azure/log-analytics/) documentation.
 
-To get more details about how to setup Azure Log Analytics, please refer to the following documentation: [Azure Log Analytics](https://docs.microsoft.com/en-us/azure/log-analytics/)
+## Configuration parameters
 
-## Configuration Parameters
-
-| Key | Description | default |
+| Key | Description | Default |
 | :--- | :--- | :--- |
-| Customer\_ID | Customer ID or WorkspaceID string. |  |
-| Shared\_Key | The primary or the secondary Connected Sources client authentication key. |  |
-| Log\_Type | The name of the event type. | fluentbit |
-| Log_Type_Key | If included, the value for this key will be looked upon in the record and if present, will over-write the `log_type`. If not found then the `log_type` value will be used. | |
-| Time\_Key | Optional parameter to specify the key name where the timestamp will be stored. | @timestamp |
-| Time\_Generated | If enabled, the HTTP request header 'time-generated-field' will be included so Azure can override the timestamp with the key specified by 'time_key' option. | off |
+| `Customer_ID` | Customer ID or WorkspaceID string. | _none_ |
+| `Shared_Key` | The primary or the secondary Connected Sources client authentication key. | _none_ |
+| `Log_Type` | The name of the event type. | `fluentbit` |
+| `Log_Type_Key` | If included, the value for this key checked in the record and if present, will overwrite the `log_type`. If not found then the `log_type` value will be used. | _none_ |
+| `Time_Key` | Optional. Specify the key name where the timestamp will be stored. | `@timestamp` |
+| `Time_Generated` | If enabled, the HTTP request header `time-generated-field` will be included so Azure can override the timestamp with the key specified by `time_key` option. | `off` |
+| `Workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
-## Getting Started
+## Get started
 
-In order to insert records into an Azure Log Analytics instance, you can run the plugin from the command line or through the configuration file:
+To insert records into an Azure Log Analytics instance, run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-The **azure** plugin, can read the parameters from the command line in two ways, through the **-p** argument \(property\), e.g:
+The _Azure_ plugin can read the parameters from the command line in the following ways, using the `-p` argument (property):
 
-```text
-$ fluent-bit -i cpu -o azure -p customer_id=abc -p shared_key=def -m '*' -f 1
+```shell
+fluent-bit -i cpu -o azure -p customer_id=abc -p shared_key=def -m '*' -f 1
 ```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file append the following sections:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+
+  outputs:
+    - name: azure
+      match: '*'
+      customer_id: abc
+      shared_key: def
+```
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name  cpu
+  Name  cpu
 
 [OUTPUT]
-    Name        azure
-    Match       *
-    Customer_ID abc
-    Shared_Key  def
+  Name        azure
+  Match       *
+  Customer_ID abc
+  Shared_Key  def
+```
+
+{% endtab %}
+{% endtabs %}
+
+The following example uses the `Log_Type_Key` with [record-accessor](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/record-accessor), which will read the table name (or event type) dynamically from the Kubernetes label `app`, instead of `Log_Type`:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+
+  outputs:
+    - name: azure
+      match: '*'
+      log_type_key: $kubernetes['labels']['app']
+      customer_id: abc
+      shared_key: def
 ```
 
-Another example using the `Log_Type_Key` with [record-accessor](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/record-accessor), which will read the table name (or event type) dynamically from kubernetes label `app`, instead of `Log_Type`:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name  cpu
+  Name  cpu
 
 [OUTPUT]
-    Name        azure
-    Match       *
-    Log_Type_Key $kubernetes['labels']['app']
-    Customer_ID abc
-    Shared_Key  def
+  Name        azure
+  Match       *
+  Log_Type_Key $kubernetes['labels']['app']
+  Customer_ID abc
+  Shared_Key  def
 ```
 
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/outputs/azure_blob.md b/pipeline/outputs/azure_blob.md
index c775379aa..36796e7e2 100644
--- a/pipeline/outputs/azure_blob.md
+++ b/pipeline/outputs/azure_blob.md
@@ -1,123 +1,208 @@
 ---
-description: Official and Microsoft Certified Azure Storage Blob connector
+description: Microsoft certified Azure Storage Blob connector
 ---
 
 # Azure Blob
 
 The Azure Blob output plugin allows ingesting your records into [Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/) service. This connector is designed to use the Append Blob and Block Blob API.
 
-Our plugin works with the official Azure Service and also can be configured to be used with a service emulator such as [Azurite](https://github.com/Azure/Azurite).
+The Fluent Bit plugin works with the official Azure Service and can be configured to be used with a service emulator such as [Azurite](https://github.com/Azure/Azurite).
+
+## Azure Storage account
+
+Ensure you have an Azure Storage account. [Azure Blob Storage Tutorial (video)](https://www.youtube.com/watch?v=-sCKnOm8G_g) explains how to set up your account.
+
+## Configuration parameters
+
+Fluent Bit exposes the following configuration properties.
+
+| Key                          | Description                                                                                                                                                                                                                  | Default                       |
+| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------- |
+| `account_name`               | Azure Storage account name.                                                                                                                                                                                                  | _none_                        |
+| `auth_type`                  | Specify the type to authenticate against the service. Supported values: `key`, `sas`.                                                                                                                                        | `key`                         |
+| `shared_key`                 | Specify the Azure Storage Shared Key to authenticate against the service. This configuration property is mandatory when `auth_type` is `key`.                                                                                | _none_                        |
+| `sas_token`                  | Specify the Azure Storage shared access signatures to authenticate against the service. This configuration property is mandatory when `auth_type` is `sas`.                                                                  | _none_                        |
+| `container_name`             | Name of the container that will contain the blobs.                                                                                                                                                                           | _none_                        |
+| `blob_type`                  | Specify the desired blob type. Supported values: `appendblob`, `blockblob`.                                                                                                                                                  | `appendblob`                  |
+| `auto_create_container`      | If `container_name` doesn't exist in the remote service, enabling this option handles the exception and auto-creates the container.                                                                                          | `on`                          |
+| `path`                       | Optional. The path to store your blobs. If your blob name is `myblob`, specify subdirectories for storage using `path`. For example, setting `path` to `/logs/kubernetes` will store your blob in `/logs/kubernetes/myblob`. | _none_                        |
+| `compress`                   | Sets payload compression in network transfer. Supported value: `gzip`                                                                                                                                                        | _none_                        |
+| `compress_blob`              | Enables GZIP compression in the final `blockblob` file. This option isn't compatible when `blob_type` = `appendblob`.                                                                                                        | _none_                        |
+| `emulator_mode`              | To send data to an Azure emulator service like [Azurite](https://github.com/Azure/Azurite), enable this option to format the requests in the expected format.                                                                | `off`                         |
+| `endpoint`                   | When using an emulator, this option lets you specify the absolute HTTP address of such service. For example, `http://127.0.0.1:10000`.                                                                                       | _none_                        |
+| `tls`                        | Enable or disable TLS encryption. Azure service requires this to be set to `on`.                                                                                                                                             | `off`                         |
+| `workers`                    | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output.                                                                                                         | `0`                           |
+| `buffering_enabled`          | Enable buffering into disk before ingesting into Azure Blob.                                                                                                                                                                 | `false`                       |
+| `buffer_dir`                 | Specifies the location of directory where the buffered data will be stored.                                                                                                                                                  | `/tmp/fluent-bit/azure-blob/` |
+| `upload_timeout`             | Optional. Specify a timeout for uploads. Fluent Bit will start ingesting buffer files which have been created more than `x` minutes and ago haven't reached `upload_file_size` limit yet.                                    | `30m`                         |
+| `upload_file_size`           | Specifies the size of files to be uploaded in MB.                                                                                                                                                                            | `200M`                        |
+| `azure_blob_buffer_key`      | Set the Azure Blob buffer key which needs to be specified when using multiple instances of Azure Blob output plugin and buffering is enabled.                                                                                | `key`                         |
+| `store_dir_limit_size`       | Set the max size of the buffer directory.                                                                                                                                                                                    | `8G`                          |
+| `buffer_file_delete_early`   | Whether to delete the buffered file early after successful blob creation.                                                                                                                                                    | `false`                       |
+| `blob_uri_length`            | Set the length of generated blob URI before ingesting to Azure Kusto.                                                                                                                                                        | `64`                          |
+| `unify_tag`                  | Whether to create a single buffer file when buffering mode is enabled.                                                                                                                                                       | `false`                       |
+| `scheduler_max_retries`      | Maximum number of retries for the scheduler send blob.                                                                                                                                                                       | `3`                           |
+| `delete_on_max_upload_error` | Whether to delete the buffer file on maximum upload errors.                                                                                                                                                                  | `false`                       |
+| `io_timeout`                 | HTTP IO timeout.                                                                                                                                                                                                             | `60s`                         |
+
+## Get started
+
+Fluent Bit can deliver records to the official service or an emulator.
+
+### Configuration for Azure Storage
 
-## Azure Storage Account
-
-Before getting started, make sure you already have an Azure Storage account. As a reference, the following link explains step-by-step how to set up your account:
-
-* [Azure Blob Storage Tutorial \(Video\)](https://www.youtube.com/watch?v=-sCKnOm8G_g)
-
-## Configuration Parameters
-
-We expose different configuration properties. The following table lists all the options available, and the next section has specific configuration details for the official service or the emulator.
-
-| Key | Description | default |
-| :--- | :--- | :--- |
-| account\_name | Azure Storage account name. This configuration property is mandatory |  |
-| auth\_type | Specify the type to authenticate against the service. Fluent Bit supports `key` and `sas`. | key |
-| shared\_key | Specify the Azure Storage Shared Key to authenticate against the service. This configuration property is mandatory when `auth_type` is `key`. |  |
-| sas\_token | Specify the Azure Storage shared access signatures to authenticate against the service. This configuration property is mandatory when `auth_type` is `sas`. |  |
-| container\_name | Name of the container that will contain the blobs. This configuration property is mandatory |  |
-| blob\_type | Specify the desired blob type. Fluent Bit supports `appendblob` and `blockblob`. | appendblob |
-| auto\_create\_container | If `container_name` does not exist in the remote service, enabling this option will handle the exception and auto-create the container. | on |
-| path | Optional path to store your blobs. If your blob name is `myblob`, you can specify sub-directories where to store it using path, so setting path to `/logs/kubernetes` will store your blob in `/logs/kubernetes/myblob`. |  |
-| emulator\_mode | If you want to send data to an Azure emulator service like [Azurite](https://github.com/Azure/Azurite), enable this option so the plugin will format the requests to the expected format. | off |
-| endpoint | If you are using an emulator, this option allows you to specify the absolute HTTP address of such service. e.g: [http://127.0.0.1:10000](http://127.0.0.1:10000). |  |
-| tls | Enable or disable TLS encryption. Note that Azure service requires this to be turned on. | off |
-
-## Getting Started
-
-As mentioned above, you can either deliver records to the official service or an emulator. Below we have an example for each use case.
+The following configuration example generates a random message with a custom tag:
 
-### Configuration for Azure Storage Service
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"name": "Fluent Bit", "year": 2020}'
+      samples: 1
+      tag: var.log.containers.app-default-96cbdef2340.log
+
+  outputs:
+    - name: azure_blog
+      match: "*"
+      account_name: YOUR_ACCOUNT_NAME
+      shared_key: YOUR_SHARED_KEY
+      path: kubernetes
+      container_name: logs
+      auto_create_container: on
+      tls: on
+```
 
-The following configuration example generates a random message with a custom tag:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [SERVICE]
-    flush     1
-    log_level info
+  flush     1
+  log_level info
 
 [INPUT]
-    name      dummy
-    dummy     {"name": "Fluent Bit", "year": 2020}
-    samples   1
-    tag       var.log.containers.app-default-96cbdef2340.log
+  name      dummy
+  dummy     {"name": "Fluent Bit", "year": 2020}
+  samples   1
+  tag       var.log.containers.app-default-96cbdef2340.log
 
 [OUTPUT]
-    name                  azure_blob
-    match                 *
-    account_name          YOUR_ACCOUNT_NAME
-    shared_key            YOUR_SHARED_KEY
-    path                  kubernetes
-    container_name        logs
-    auto_create_container on
-    tls                   on
+  name                  azure_blob
+  match                 *
+  account_name          YOUR_ACCOUNT_NAME
+  shared_key            YOUR_SHARED_KEY
+  path                  kubernetes
+  container_name        logs
+  auto_create_container on
+  tls                   on
 ```
 
-After you run the configuration file above, you will be able to query the data using the Azure Storage Explorer. The example above will generate the following content in the explorer:
+{% endtab %}
+{% endtabs %}
 
-![](../../.gitbook/assets/azure_blob.png)
+After you run the configuration file, you will be able to query the data using the Azure Storage Explorer. The example generates the following content in the explorer:
+
+![Azure Blob](../../.gitbook/assets/azure_blob.png)
 
 ### Configuring and using Azure Emulator: Azurite
 
 #### Install and run Azurite
 
-The quickest way to get started is to install Azurite using npm:
+1. Install Azurite using `npm`:
 
-```bash
-$ npm install -g azurite
-```
+   ```shell
+   npm install -g azurite
+   ```
 
-then run the service:
+1. Run the service:
 
-```bash
-$ azurite
-Azurite Blob service is starting at http://127.0.0.1:10000
-Azurite Blob service is successfully listening at http://127.0.0.1:10000
-Azurite Queue service is starting at http://127.0.0.1:10001
-Azurite Queue service is successfully listening at http://127.0.0.1:10001
-```
+   ```shell
+   azurite
+   ```
+
+   The command should return results similar to:
+
+   ```text
+    Azurite Blob service is starting at http://127.0.0.1:10000
+    Azurite Blob service is successfully listening at http://127.0.0.1:10000
+    Azurite Queue service is starting at http://127.0.0.1:10001
+    Azurite Queue service is successfully listening at http://127.0.0.1:10001
+   ```
 
 #### Configuring Fluent Bit for Azurite
 
-[Azurite](https://github.com/Azure/Azurite) comes with a default `account_name` and `shared_key`, so make sure to use the specific values provided in the example below \(do an exact copy/paste\):
+[Azurite](https://github.com/Azure/Azurite) comes with a default `account_name` and `shared_key`. Instead of the defaults, be sure to use the specific values provided in the following example:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"name": "Fluent Bit", "year": 2020}'
+      samples: 1
+      tag: var.log.containers.app-default-96cbdef2340.log
+
+  outputs:
+    - name: azure_blog
+      match: "*"
+      account_name: INSERT_ACCOUNT_NAME
+      shared_key: INSERT_SHARED_KEY
+      path: kubernetes
+      container_name: logs
+      auto_create_container: on
+      tls: off
+      emulator_mode: on
+      endpoint: http://127.0.0.1:10000
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [SERVICE]
-    flush     1
-    log_level info
+  flush     1
+  log_level info
 
 [INPUT]
-    name      dummy
-    dummy     {"name": "Fluent Bit", "year": 2020}
-    samples   1
-    tag       var.log.containers.app-default-96cbdef2340.log
+  name      dummy
+  dummy     {"name": "Fluent Bit", "year": 2020}
+  samples   1
+  tag       var.log.containers.app-default-96cbdef2340.log
 
 [OUTPUT]
-    name                  azure_blob
-    match                 *
-    account_name          devstoreaccount1
-    shared_key            Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==
-    path                  kubernetes
-    container_name        logs
-    auto_create_container on
-    tls                   off
-    emulator_mode         on
-    endpoint              http://127.0.0.1:10000
+  name                  azure_blob
+  match                 *
+  account_name          INSERT_ACCOUNT_NAME
+  shared_key            INSERT_SHARED_KEY
+  path                  kubernetes
+  container_name        logs
+  auto_create_container on
+  tls                   off
+  emulator_mode         on
+  endpoint              http://127.0.0.1:10000
 ```
 
-after running that Fluent Bit configuration you will see the data flowing into Azurite:
+{% endtab %}
+{% endtabs %}
 
-```text
+After running the Fluent Bit configuration, you will see the data flowing into Azurite:
+
+```shell
 $ azurite
+
 Azurite Blob service is starting at http://127.0.0.1:10000
 Azurite Blob service is successfully listening at http://127.0.0.1:10000
 Azurite Queue service is starting at http://127.0.0.1:10001
@@ -128,4 +213,3 @@ Azurite Queue service is successfully listening at http://127.0.0.1:10001
 127.0.0.1 - - [03/Sep/2020:17:40:03 +0000] "PUT /devstoreaccount1/logs/kubernetes/var.log.containers.app-default-96cbdef2340.log HTTP/1.1" 201 -
 127.0.0.1 - - [03/Sep/2020:17:40:04 +0000] "PUT /devstoreaccount1/logs/kubernetes/var.log.containers.app-default-96cbdef2340.log?comp=appendblock HTTP/1.1" 201 -
 ```
-
diff --git a/pipeline/outputs/azure_kusto.md b/pipeline/outputs/azure_kusto.md
index 5fd4075fc..fae3b7fd4 100644
--- a/pipeline/outputs/azure_kusto.md
+++ b/pipeline/outputs/azure_kusto.md
@@ -2,36 +2,35 @@
 description: Send logs to Azure Data Explorer (Kusto)
 ---
 
-# Azure Data Explorer (Kusto)
+# Azure Data Explorer
 
-The Kusto output plugin allows to ingest your logs into an [Azure Data Explorer](https://azure.microsoft.com/en-us/services/data-explorer/) cluster, via the [Queued Ingestion](https://docs.microsoft.com/en-us/azure/data-explorer/kusto/api/netfx/about-kusto-ingest#queued-ingestion) mechanism. This output plugin can also be used to ingest logs into an [Eventhouse](https://blog.fabric.microsoft.com/en-us/blog/eventhouse-overview-handling-real-time-data-with-microsoft-fabric/) cluster in Microsoft Fabric Real Time Analytics.
+The _Kusto_ output plugin lets you ingest your logs into an [Azure Data Explorer](https://azure.microsoft.com/en-us/services/data-explorer/) cluster, using the [Queued Ingestion](https://docs.microsoft.com/en-us/azure/data-explorer/kusto/api/netfx/about-kusto-ingest#queued-ingestion) mechanism. This output plugin can also be used to ingest logs into an [Eventhouse](https://blog.fabric.microsoft.com/en-us/blog/eventhouse-overview-handling-real-time-data-with-microsoft-fabric/) cluster in Microsoft Fabric Real Time Analytics.
 
-## For ingesting into Azure Data Explorer:  Creating a Kusto Cluster and Database
+## Ingest into Azure Data Explorer: create a Kusto cluster and database
 
-You can create an Azure Data Explorer cluster in one of the following ways:
+Create an Azure Data Explorer cluster in one of the following ways:
 
 - [Create a free-tier cluster](https://dataexplorer.azure.com/freecluster)
-- [Create a fully-featured cluster](https://docs.microsoft.com/en-us/azure/data-explorer/create-cluster-database-portal)
+- [Create a fully featured cluster](https://docs.microsoft.com/en-us/azure/data-explorer/create-cluster-database-portal)
 
-## For ingesting into Microsoft Fabric Real Time Analytics : Creating an Eventhouse Cluster and KQL Database
+## Ingest into Microsoft Fabric real time analytics: create an Eventhouse cluster and KQL database
 
-You can create an Eventhouse cluster and a KQL database follow the following steps:
+Create an Eventhouse cluster and a KQL database using the following steps:
 
-- [Create an Eventhouse cluster](https://docs.microsoft.com/en-us/azure/data-explorer/eventhouse/create-eventhouse-cluster)
-- [Create a KQL database](https://docs.microsoft.com/en-us/azure/data-explorer/eventhouse/create-database)
+- [Create an Eventhouse cluster](https://learn.microsoft.com/en-us/training/modules/query-data-kql-database-microsoft-fabric/)
+- [Create a KQL database](https://learn.microsoft.com/en-us/training/modules/query-data-kql-database-microsoft-fabric/)
 
+## Create an Azure registered application
 
-## Creating an Azure Registered Application
+Fluent Bit uses the application's credentials to ingest data into your cluster.
 
-Fluent-Bit will use the application's credentials, to ingest data into your cluster.
-
-- [Register an Application](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app#register-an-application)
+- [Register an application](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app#register-an-application)
 - [Add a client secret](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app#add-a-client-secret)
-- [Authorize the app in your database](https://docs.microsoft.com/en-us/azure/data-explorer/kusto/management/access-control/principals-and-identity-providers#azure-ad-tenants)
+- [Authorize the app in your database](https://learn.microsoft.com/en-us/azure/app-service/overview-authentication-authorization)
 
-## Creating a Table
+## Create a table
 
-Fluent-Bit ingests the event data into Kusto in a JSON format, that by default will include 3 properties:
+Fluent Bit ingests the event data into Kusto in a JSON format. By default, the table includes 3 properties:
 
 - `log` - the actual event payload.
 - `tag` - the event tag.
@@ -39,51 +38,131 @@ Fluent-Bit ingests the event data into Kusto in a JSON format, that by default w
 
 A table with the expected schema must exist in order for data to be ingested properly.
 
-```kql
+```sql
 .create table FluentBit (log:dynamic, tag:string, timestamp:datetime)
 ```
 
-## Optional - Creating an Ingestion Mapping
-
-By default, Kusto will insert incoming ingestions into a table by inferring the mapped table columns, from the payload properties. However, this mapping can be customized by creatng a [JSON ingestion mapping](https://docs.microsoft.com/en-us/azure/data-explorer/kusto/management/mappings#json-mapping). The plugin can be configured to use an ingestion mapping via the `ingestion_mapping_reference` configuration key.
-
-## Configuration Parameters
-
-| Key                         | Description                                                                                                                                                                                                                      | Default     |
-| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
-| tenant_id                   | _Required_ - The tenant/domain ID of the AAD registered application.                                                                                                                                                             |             |
-| client_id                   | _Required_ - The client ID of the AAD registered application.                                                                                                                                                                    |             |
-| client_secret               | _Required_ - The client secret of the AAD registered application ([App Secret](https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal#option-2-create-a-new-application-secret)). |
-| ingestion_endpoint          | _Required_ - The cluster's ingestion endpoint, usually in the form `https://ingest-cluster_name.region.kusto.windows.net                                                                                                         |
-| database_name               | _Required_ - The database name.                                                                                                                                                                                                  |             |
-| table_name                  | _Required_ - The table name.                                                                                                                                                                                                     |             |
-| ingestion_mapping_reference | _Optional_ - The name of a [JSON ingestion mapping](https://docs.microsoft.com/en-us/azure/data-explorer/kusto/management/mappings#json-mapping) that will be used to map the ingested payload into the table columns.           |             |
-| log_key                     | Key name of the log content.                                                                                                                                                                                                     | `log`       |
-| include_tag_key             | If enabled, a tag is appended to output. The key name is used `tag_key` property.                                                                                                                                                | `On`        |
-| tag_key                     | The key name of tag. If `include_tag_key` is false, This property is ignored.                                                                                                                                                    | `tag`       |
-| include_time_key            | If enabled, a timestamp is appended to output. The key name is used `time_key` property.                                                                                                                                         | `On`        |
-| time_key                    | The key name of time. If `include_time_key` is false, This property is ignored.                                                                                                                                                  | `timestamp` |
-
-### Configuration File
+## Optional - create an ingestion mapping
+
+By default, Kusto will insert incoming ingestion data into a table by inferring the mapped table columns, from the payload properties. However, this mapping can be customized by creating a [JSON ingestion mapping](https://docs.microsoft.com/en-us/azure/data-explorer/kusto/management/mappings#json-mapping). The plugin can be configured to use an ingestion mapping using the `ingestion_mapping_reference` configuration key.
+
+## Configuration parameters
+
+| Key | Description | Default     |
+| --- | ----------- | ----------- |
+| `tenant_id` | Required if `managed_identity_client_id` isn't set. The tenant/domain ID of the AAD registered application. | _none_ |
+| `client_id` | Required if `managed_identity_client_id` isn't set. The client ID of the AAD registered application. | _none_ |
+| `client_secret` | Required if `managed_identity_client_id` isn't set. The client secret of the AAD registered application ([App Secret](https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal#option-2-create-a-new-application-secret)). | _none_ |
+| `managed_identity_client_id` | Required if `tenant_id`, `client_id`, and `client_secret` aren't set. The managed identity ID to authenticate with. Set to `SYSTEM` for system-assigned managed identity, or set to the MI client ID (`GUID`) for user-assigned managed identity. | _none_ |
+| `ingestion_endpoint` | The cluster's ingestion endpoint, usually in the form `https://ingest-cluster_name.region.kusto.windows.net`. | _none_ |
+| `database_name` | The database name. | _none_ |
+| `table_name` | The table name. | _none_ |
+| `ingestion_mapping_reference` | Optional. The name of a [JSON ingestion mapping](https://docs.microsoft.com/en-us/azure/data-explorer/kusto/management/mappings#json-mapping) that will be used to map the ingested payload into the table columns. | _none_ |
+| `log_key` | Key name of the log content.  | `log`       |
+| `include_tag_key` | If enabled, a tag is appended to output. The key name is used `tag_key` property. | `On` |
+| `tag_key` | The key name of tag. If `include_tag_key` is false, This property is ignored. | `tag` |
+| `include_time_key` | If enabled, a timestamp is appended to output. The key name is used `time_key` property. | `On` |
+| `time_key` | The key name of time. If `include_time_key` is false, This property is ignored. | `timestamp` |
+| `ingestion_endpoint_connect_timeout` | The connection timeout of various Kusto endpoints in seconds. | `60` |
+| `compression_enabled` | If enabled, sends compressed HTTP payload (gzip) to Kusto. | `true` |
+| `ingestion_resources_refresh_interval` | The ingestion resources refresh interval of Kusto endpoint in seconds. | _none_ |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
+| `buffering_enabled` | Optional. Enable buffering into disk before ingesting into Azure Kusto. | `Off` |
+| `buffer_dir` | Optional. When buffering is `On`, specifies the location of directory where the buffered data will be stored. | `/tmp/fluent-bit/azure-kusto/` |
+| `upload_timeout` | Optional. When buffering is `On`, specifies a timeout for uploads. Fluent Bit will start ingesting buffer files which have been created more than x minutes and haven't reached `upload_file_size` limit. | `30m` |
+| `upload_file_size`| Optional. When buffering is `On`, specifies the size of files to be uploaded in megabytes. | `200MB` |
+| `azure_kusto_buffer_key` | Optional. When buffering is `On`, set the Azure Kusto buffer key which must be specified when using multiple instances of Azure Kusto output plugin and buffering is enabled. | `key` |
+| `store_dir_limit_size` | Optional. When buffering is `On`, set the max size of the buffer directory. | `8GB` |
+| `buffer_file_delete_early`    | Optional. When buffering is `On`, whether to delete the buffered file early after successful blob creation. | `Off` |
+| `unify_tag`                   | Optional. This creates a single buffer file when the buffering mode is `On`. | `On` |
+| `blob_uri_length`             | Optional. Set the length of generated blob URI before ingesting to Kusto. | `64` |
+| `scheduler_max_retries`       | Optional. When buffering is `On`, set the maximum number of retries for ingestion using the scheduler. | `3` |
+| `delete_on_max_upload_error`  | Optional. When buffering is `On`, whether to delete the buffer file on maximum upload errors. | `Off` |
+| `io_timeout`                  | Optional. Configure the HTTP IO timeout for uploads. | `60s` |
+
+### Configuration file
+
+Get started with this configuration file:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"name": "Fluent Bit", "year": 2020}'
+      samples: 1
+      tag: var.log.containers.app-default-96cbdef2340.log
+
+  outputs:
+    - name: azure_kusto
+      match: '*'
+      tenant_id: <app_tenant_id>
+      client_id: <app_client_id>
+      client_secret: <app_secret>
+      ingestion_endpoint: https://ingest-<cluster>.<region>.kusto.windows.net
+      database_name: <database_name>
+      table_name: <table_name>
+      ingestion_mapping_reference: <mapping_name>
+      ingestion_endpoint_connect_timeout: <ingestion_endpoint_connect_timeout>
+      compression_enabled: <compression_enabled>
+      ingestion_resources_refresh_interval: <ingestion_resources_refresh_interval>
+      buffering_enabled: on
+      upload_timeout: 2m
+      upload_file_size: 125M
+      azure_kusto_buffer_key: kusto1
+      buffer_file_delete_early: off
+      unify_tag: on
+      buffer_dir: /var/log/
+      store_dir_limit_size: 16GB
+      blob_uri_length: 128
+      scheduler_max_retries: 3
+      delete_on_max_upload_error: off
+      io_timeout: 60s
+```
 
-Get started quickly with this configuration file:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```
+```text
 [OUTPUT]
-    Match *
-    Name azure_kusto
-    Tenant_Id <app_tenant_id>
-    Client_Id <app_client_id>
-    Client_Secret <app_secret>
-    Ingestion_Endpoint https://ingest-<cluster>.<region>.kusto.windows.net
-    Database_Name <database_name>
-    Table_Name <table_name>
-    Ingestion_Mapping_Reference <mapping_name>
+  Name                                  azure_kusto
+  Match                                 *
+  Tenant_Id                             <app_tenant_id>
+  Client_Id                             <app_client_id>
+  Client_Secret                         <app_secret>
+  Ingestion_Endpoint                    https://ingest-<cluster>.<region>.kusto.windows.net
+  Database_Name                         <database_name>
+  Table_Name                            <table_name>
+  Ingestion_Mapping_Reference           <mapping_name>
+  ingestion_endpoint_connect_timeout    <ingestion_endpoint_connect_timeout>
+  compression_enabled                   <compression_enabled>
+  ingestion_resources_refresh_interval  <ingestion_resources_refresh_interval>
+  buffering_enabled                     On
+  upload_timeout                        2m
+  upload_file_size                      125M
+  azure_kusto_buffer_key                kusto1
+  buffer_file_delete_early              Off
+  unify_tag                             On
+  buffer_dir                            /var/log/
+  store_dir_limit_size                  16GB
+  blob_uri_length                       128
+  scheduler_max_retries                 3
+  delete_on_max_upload_error            Off
+  io_timeout                            60s
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ## Troubleshooting
 
-### 403 Forbidden
+### `403 Forbidden`
 
 If you get a `403 Forbidden` error response, make sure that:
 
diff --git a/pipeline/outputs/azure_logs_ingestion.md b/pipeline/outputs/azure_logs_ingestion.md
index e008ac4da..9354c9bf4 100644
--- a/pipeline/outputs/azure_logs_ingestion.md
+++ b/pipeline/outputs/azure_logs_ingestion.md
@@ -1,12 +1,10 @@
 ---
-description: 'Send logs to Azure Log Analytics using Logs Ingestion API with DCE and DCR'
+description: Send logs to Azure Log Analytics using Logs Ingestion API
 ---
 
 # Azure Logs Ingestion API
 
-![](../../.gitbook/assets/image%20%287%29.png)
-
-Azure Logs Ingestion plugin allows you ingest your records using [Logs Ingestion API in Azure Monitor](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/logs-ingestion-api-overview) to supported [Azure tables](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/logs-ingestion-api-overview#supported-tables) or to [custom tables](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/create-custom-table#create-a-custom-table) that you create.
+Azure Logs Ingestion plugin lets you ingest your records using [Logs Ingestion API in Azure Monitor](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/logs-ingestion-api-overview) to supported [Azure tables](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/logs-ingestion-api-overview#supported-tables) or to [custom tables](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/create-custom-table#create-a-custom-table) that you create.
 
 The Logs ingestion API requires the following components:
 
@@ -14,31 +12,31 @@ The Logs ingestion API requires the following components:
 - A Data Collection Rule (DCR) and
 - A Log Analytics Workspace
 
-> Note: According to [this document](https://github.com/MicrosoftDocs/azure-docs/blob/main/articles/azure-monitor/logs/logs-ingestion-api-overview.md#components), all resources should be in the same region.
+To visualize the basic logs ingestion operation, see the following image:
 
-To visualize basic Logs Ingestion operation, see the following image:
-![](../../.gitbook/assets/azure-logs-ingestion-overview.png)
+![Log ingestion overview](../../.gitbook/assets/azure-logs-ingestion-overview.png)
 
-To get more details about how to setup these components, please refer to the following documentations:
+To get more details about how to set up these components, refer to the following documentation:
 
 - [Azure Logs Ingestion API](https://docs.microsoft.com/en-us/azure/log-analytics/)
 - [Send data to Azure Monitor Logs with Logs ingestion API (setup DCE, DCR and Log Analytics)](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/tutorial-logs-ingestion-portal)
 
-## Configuration Parameters
+## Configuration parameters
 
 | Key           | Description                | Default |
 | :------------ | :------------------------- | :------ |
-| tenant\_id    | _Required_ - The tenant ID of the AAD application. ||
-| client\_id    | _Required_ - The client ID of the AAD application. ||
-| client\_secret| _Required_ - The client secret of the AAD application ([App Secret](https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal#option-2-create-a-new-application-secret)). ||
-| dce\_url      | _Required_ - Data Collection Endpoint(DCE) URL. ||
-| dcr\_id       | _Required_ - Data Collection Rule (DCR) immutable ID (see [this document](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/tutorial-logs-ingestion-portal#collect-information-from-the-dcr) to collect the immutable id) ||
-| table\_name   | _Required_ - The name of the custom log table (include the `_CL` suffix as well if applicable) ||
-| time\_key     | _Optional_ - Specify the key name where the timestamp will be stored. | `@timestamp` |
-| time\_generated | _Optional_ - If enabled, will generate a timestamp and append it to JSON. The key name is set by the 'time_key' parameter. | `true` |
-| compress      | _Optional_ - Enable HTTP payload gzip compression. | `true` |
-
-## Getting Started
+| `tenant_id`    | The tenant ID of the Azure Active Directory (AAD) application. | _none_ |
+| `client_id`    | The client ID of the AAD application. | _none_ |
+| `client_secret`| The client secret of the AAD application ([App Secret](https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal#option-2-create-a-new-application-secret)). | _none_ |
+| `dce_url`      | Data Collection Endpoint(DCE) URL. | _none_ |
+| `dcr_id`       | Data Collection Rule (DCR) [immutable ID](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/tutorial-logs-ingestion-portal#collect-information-from-the-dcr). | _none_ |
+| `table_name`   | The name of the custom log table (include the `_CL` suffix as well if applicable) | _none_ |
+| `time_key`     | Optional. Specify the key name where the timestamp will be stored. | `@timestamp` |
+| `time_generated` | Optional. If enabled, will generate a timestamp and append it to JSON. The key name is set by the `time_key` parameter. | `true` |
+| `compress`      | Optional. Enable HTTP payload gzip compression. | `true` |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
+
+## Get started
 
 To send records into an Azure Log Analytics using Logs Ingestion API the following resources needs to be created:
 
@@ -47,45 +45,92 @@ To send records into an Azure Log Analytics using Logs Ingestion API the followi
 - Either an [Azure tables](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/logs-ingestion-api-overview#supported-tables) or [custom tables](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/create-custom-table#create-a-custom-table)
 - An app registration with client secrets (for DCR access).
 
-You can follow [this guideline](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/tutorial-logs-ingestion-portal) to setup the DCE, DCR, app registration and a custom table.
-
-### Configuration File
+Follow [this guideline](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/tutorial-logs-ingestion-portal) to set up the DCE, DCR, app registration and a custom table.
+
+### Configuration file
+
+Use this configuration file to get started:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: tail
+      path: /path/to/your/sample.log
+      tag: sample
+      key: RawData
+
+    # Or use other plugins
+    #- name: cpu
+    #  tag: sample
+
+  filters:
+    - name: modify
+      match: sample
+      # Add a json key named "Application":"fb_log"
+      add: Application fb_log
+
+  outputs:
+    # Enable this section to see your json-log format
+    #- name: stdout
+    #  match: '*'
+
+    - name: azure_logs_ingestion
+      match: sample
+      client_id: XXXXXXXX-xxxx-yyyy-zzzz-xxxxyyyyzzzzxyzz
+      client_secret: some.secret.xxxzzz
+      tenant_id: XXXXXXXX-xxxx-yyyy-zzzz-xxxxyyyyzzzzxyzz
+      dce_url: https://log-analytics-dce-XXXX.region-code.ingest.monitor.azure.com
+      dcr_id: dcr-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+      table_name: ladcr_CL
+      time_generated: true
+      time_key: Time
+      compress: true
+```
 
-Use this configuration to quickly get started:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```ini
+```text
 [INPUT]
-    Name    tail
-    Path    /path/to/your/sample.log
-    Tag     sample
-    Key     RawData 
-# Or use other plugins Plugin
-# [INPUT]
-#     Name    cpu
-#     Tag     sample
+  Name    tail
+  Path    /path/to/your/sample.log
+  Tag     sample
+  Key     RawData
+
+# Or use other plugins
+#[INPUT]
+#  Name    cpu
+#  Tag     sample
 
 [FILTER]
-    Name modify
-    Match sample
-    # Add a json key named "Application":"fb_log"
-    Add Application fb_log
+  Name modify
+  Match sample
+  # Add a json key named "Application":"fb_log"
+  Add Application fb_log
 
 # Enable this section to see your json-log format
 #[OUTPUT]
-#    Name stdout
-#    Match *
+#  Name stdout
+#  Match *
+
 [OUTPUT]
-    Name            azure_logs_ingestion
-    Match           sample
-    client_id       XXXXXXXX-xxxx-yyyy-zzzz-xxxxyyyyzzzzxyzz
-    client_secret   some.secret.xxxzzz
-    tenant_id       XXXXXXXX-xxxx-yyyy-zzzz-xxxxyyyyzzzzxyzz
-    dce_url         https://log-analytics-dce-XXXX.region-code.ingest.monitor.azure.com
-    dcr_id          dcr-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-    table_name      ladcr_CL
-    time_generated  true
-    time_key        Time
-    Compress        true
+  Name            azure_logs_ingestion
+  Match           sample
+  client_id       XXXXXXXX-xxxx-yyyy-zzzz-xxxxyyyyzzzzxyzz
+  client_secret   some.secret.xxxzzz
+  tenant_id       XXXXXXXX-xxxx-yyyy-zzzz-xxxxyyyyzzzzxyzz
+  dce_url         https://log-analytics-dce-XXXX.region-code.ingest.monitor.azure.com
+  dcr_id          dcr-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+  table_name      ladcr_CL
+  time_generated  true
+  time_key        Time
+  Compress        true
 ```
 
-Setup your DCR transformation accordingly based on the json output from fluent-bit's pipeline (input, parser, filter, output).
+{% endtab %}
+{% endtabs %}
+
+Set up your DCR transformation based on the JSON output from the Fluent Bit pipeline (input, parser, filter, output).
diff --git a/pipeline/outputs/bigquery.md b/pipeline/outputs/bigquery.md
index 8ef7a469f..78b225798 100644
--- a/pipeline/outputs/bigquery.md
+++ b/pipeline/outputs/bigquery.md
@@ -1,80 +1,86 @@
 # Google Cloud BigQuery
 
-BigQuery output plugin is an _experimental_ plugin that allows you to stream records into [Google Cloud BigQuery](https://cloud.google.com/bigquery/) service. The implementation does not support the following, which would be expected in a full production version:
+The _Google Cloud BigQuery_ output plugin is an experimental plugin that lets you stream records into the [Google Cloud BigQuery](https://cloud.google.com/bigquery/) service.
 
-* [Application Default Credentials](https://cloud.google.com/docs/authentication/production).
-* [Data deduplication](https://cloud.google.com/bigquery/streaming-data-into-bigquery) using `insertId`.
-* [Template tables](https://cloud.google.com/bigquery/streaming-data-into-bigquery) using `templateSuffix`.
+The implementation doesn't support the following, which would be expected in a full production version:
 
-## Google Cloud Configuration
+- [Application Default Credentials](https://cloud.google.com/docs/authentication/production).
+- [Data deduplication](https://cloud.google.com/bigquery/streaming-data-into-bigquery) using `insertId`.
+- [Template tables](https://cloud.google.com/bigquery/streaming-data-into-bigquery) using `templateSuffix`.
 
-Fluent Bit streams data into an existing BigQuery table using a service account that you specify. Therefore, before using the BigQuery output plugin, you must create a service account, create a BigQuery dataset and table, authorize the service account to write to the table, and provide the service account credentials to Fluent Bit.
+## Google Cloud configuration
 
-### Creating a Service Account
+Fluent Bit streams data into an existing BigQuery table using a service account that you specify. Before using the BigQuery output plugin, you must:
 
-To stream data into BigQuery, the first step is to create a Google Cloud service account for Fluent Bit:
+1. To stream data into BigQuery, you must create a [Google Cloud service account](https://cloud.google.com/iam/docs/creating-managing-service-accounts) for Fluent Bit.
+1. Create a BigQuery dataset.
+   Fluent Bit doesn't create datasets for your data, so you must [create the dataset](https://cloud.google.com/bigquery/docs/datasets) ahead of time. You must also grant the service account `WRITER` permission on the dataset.
 
-* [Creating a Google Cloud Service Account](https://cloud.google.com/iam/docs/creating-managing-service-accounts)
+   Within the dataset you must create a table for the data to reside in. Use the following instructions for creating your table. Pay close attention to the schema, as it must match the schema of your output JSON. Unfortunately, because BigQuery doesn't allow dots in field names, you must use a filter to change the fields for many of the standard inputs (for example, `mem` or `cpu`).
+1. [Create a BigQuery table](https://cloud.google.com/bigquery/docs/tables).
+1. Fluent Bit BigQuery output plugin uses a JSON credentials file for authentication credentials. [Authorize the service account](https://cloud.google.com/iam/docs/creating-managing-service-account-keys) to write to the table.
+1. Provide the service account credentials to Fluent Bit.
+   With [workload identity federation](https://cloud.google.com/iam/docs/workload-identity-federation), you can grant on-premises or multi-cloud workloads access to Google Cloud resources, without using a service account key. It can be used as a more secure alternative to service account credentials. Google Cloud's workload identity federation supports several identity providers (see documentation) but Fluent Bit BigQuery plugin currently supports Amazon Web Services (AWS) only.
 
-### Creating a BigQuery Dataset and Table
+   You must configure workload identity federation in GCP before using it with Fluent Bit.
 
-Fluent Bit does not create datasets or tables for your data, so you must create these ahead of time. You must also grant the service account `WRITER` permission on the dataset:
+   - [Configuring workload identity federation](https://cloud.google.com/iam/docs/configuring-workload-identity-federation#aws)
+   - [Obtaining short-lived credentials with identity federation](https://cloud.google.com/iam/docs/using-workload-identity-federation)
 
-* [Creating and using datasets](https://cloud.google.com/bigquery/docs/datasets)
+## Configurations parameters
 
-Within the dataset you will need to create a table for the data to reside in. You can follow the following instructions for creating your table. Pay close attention to the schema. It must match the schema of your output JSON. Unfortunately, since BigQuery does not allow dots in field names, you will need to use a filter to change the fields for many of the standard inputs \(e.g, mem or cpu\).
-
-* [Creating and using tables](https://cloud.google.com/bigquery/docs/tables)
-
-### Retrieving Service Account Credentials
-
-Fluent Bit BigQuery output plugin uses a JSON credentials file for authentication credentials. Download the credentials file by following these instructions:
-
-* [Creating and Managing Service Account Keys](https://cloud.google.com/iam/docs/creating-managing-service-account-keys)
-
-### Workload Identity Federation
-
-Using identity federation, you can grant on-premises or multi-cloud workloads access to Google Cloud resources, without using a service account key. It can be used as a more secure alternative to service account credentials. Google Cloud's workload identity federation supports several identity providers (see documentation) but Fluent Bit BigQuery plugin currently supports Amazon Web Services (AWS) only.
-
-* [Workload Identity Federation overview](https://cloud.google.com/iam/docs/workload-identity-federation)
+| Key | Description | Default |
+| :--- | :--- | :--- |
+| `google_service_credentials` | Absolute path to a Google Cloud credentials JSON file. | Value of the environment variable `$GOOGLE_SERVICE_CREDENTIALS`. |
+| `project_id` | The project id containing the BigQuery dataset to stream into. | Value of the `project_id` in the credentials file. |
+| `dataset_id` | The dataset id of the BigQuery dataset to write into. This dataset must exist in your project. | _none_ |
+| `table_id` | The table id of the BigQuery table to write into. This table must exist in the specified dataset and the schema must match the output. | _none_ |
+| `skip_invalid_rows` | Insert all valid rows of a request, even if invalid rows exist. The default value is false, which causes the entire request to fail if any invalid rows exist. | `Off` |
+| `ignore_unknown_values` | Accept rows that contain values that don't match the schema. The unknown values are ignored. Default is `Off`, which treats unknown values as errors. | `Off` |
+| `enable_workload_identity_federation` | Enables workload identity federation as an alternative authentication method. Can't be used with service account credentials file or environment variable. AWS is the only identity provider currently supported. | `Off` |
+| `aws_region` | Used to construct a regional endpoint for AWS STS to verify AWS credentials obtained by Fluent Bit. Regional endpoints are recommended by AWS. | _none_ |
+| `project_number` | GCP project number where the identity provider was created. Used to construct the full resource name of the identity provider. | _none_ |
+| `pool_id` | GCP workload identity pool where the identity provider was created. Used to construct the full resource name of the identity provider. | _none_ |
+| `provider_id` | GCP workload identity provider. Used to construct the full resource name of the identity provider. Currently only AWS accounts are supported. | _none_ |
+| `google_service_account` | The email address of the Google service account to impersonate. The workload identity provider must have permissions to impersonate this service account, and the service account must have permissions to access Google BigQuery resources ( `write` access to tables) | _none_ |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
-You must configure workload identity federation in GCP before using it with Fluent Bit.
+See Google's [official documentation](https://cloud.google.com/bigquery/docs/reference/rest/v2/tabledata/insertAll) for further details.
 
-* [Configuring workload identity federation](https://cloud.google.com/iam/docs/configuring-workload-identity-federation#aws)
-* [Obtaining short-lived credentials with identity federation](https://cloud.google.com/iam/docs/using-workload-identity-federation)
+## Configuration file
 
-## Configurations Parameters
+If you are using a Google Cloud credentials file, the following configuration will get you started:
 
-| Key | Description | default |
-| :--- | :--- | :--- |
-| google\_service\_credentials | Absolute path to a Google Cloud credentials JSON file. | Value of the environment variable _$GOOGLE\_SERVICE\_CREDENTIALS_ |
-| project\_id | The project id containing the BigQuery dataset to stream into. | The value of the `project_id` in the credentials file |
-| dataset\_id | The dataset id of the BigQuery dataset to write into. This dataset must exist in your project. |  |
-| table\_id | The table id of the BigQuery table to write into. This table must exist in the specified dataset and the schema must match the output. |  |
-| skip\_invalid\_rows | Insert all valid rows of a request, even if invalid rows exist. The default value is false, which causes the entire request to fail if any invalid rows exist. | Off |
-| ignore\_unknown\_values | Accept rows that contain values that do not match the schema. The unknown values are ignored. Default is false, which treats unknown values as errors. | Off |
-| enable\_workload\_identity\_federation | Enables workload identity federation as an alternative authentication method. Cannot be used with service account credentials file or environment variable. AWS is the only identity provider currently supported. | Off |
-| aws\_region | Used to construct a regional endpoint for AWS STS to verify AWS credentials obtained by Fluent Bit. Regional endpoints are recommended by AWS. |  |
-| project\_number | GCP project number where the identity provider was created. Used to construct the full resource name of the identity provider. |  |
-| pool\_id | GCP workload identity pool where the identity provider was created. Used to construct the full resource name of the identity provider. |  |
-| provider\_id | GCP workload identity provider. Used to construct the full resource name of the identity provider. Currently only AWS accounts are supported. |  |
-| google\_service\_account | Email address of the Google service account to impersonate. The workload identity provider must have permissions to impersonate this service account, and the service account must have permissions to access Google BigQuery resources (e.g. `write` access to tables) |  |
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-See Google's [official documentation](https://cloud.google.com/bigquery/docs/reference/rest/v2/tabledata/insertAll) for further details.
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      tag: dummy
 
-## Configuration File
+  outputs:
+    - name: bigquery
+      match: '*'
+      dataset_id: my_dataset
+      table_id: dummy_table
+```
 
-If you are using a _Google Cloud Credentials File_, the following configuration is enough to get you started:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name  dummy
-    Tag   dummy
+  Name dummy
+  Tag  dummy
 
 [OUTPUT]
-    Name       bigquery
-    Match      *
-    dataset_id my_dataset
-    table_id   dummy_table
+  Name         bigquery
+  Match        *
+  dataset_id   my_dataset
+  table_id     dummy_table
 ```
 
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/outputs/chronicle.md b/pipeline/outputs/chronicle.md
index d2935fc00..8f5bf4104 100644
--- a/pipeline/outputs/chronicle.md
+++ b/pipeline/outputs/chronicle.md
@@ -1,56 +1,73 @@
----
+# Google Chronicle
 
-# Chronicle
+The _Google Chronicle_ output plugin lets you ingest security logs into the [Google Chronicle](https://chronicle.security/) service. This connector is designed to send unstructured security logs.
 
-The Chronicle output plugin allows ingesting security logs into [Google Chronicle](https://chronicle.security/) service. This connector is designed to send unstructured security logs.
+## Google Cloud configuration
 
-## Google Cloud Configuration
+Fluent Bit streams data into an existing Google Chronicle tenant using a service account that you specify. Before using the Chronicle output plugin, you must:
 
-Fluent Bit streams data into an existing Google Chronicle tenant using a service account that you specify. Therefore, before using the Chronicle output plugin, you must create a service account, create a Google Chronicle tenant, authorize the service account to write to the tenant, and provide the service account credentials to Fluent Bit.
+1. Create a service account.
 
-### Creating a Service Account
+   To stream security logs into Google Chronicle, create a [Google Cloud service account](https://cloud.google.com/iam/docs/creating-managing-service-accounts) for Fluent Bit:
 
-To stream security logs into Google Chronicle, the first step is to create a Google Cloud service account for Fluent Bit:
+1. Create a tenant of Google Chronicle.
 
-* [Creating a Google Cloud Service Account](https://cloud.google.com/iam/docs/creating-managing-service-accounts)
+   Fluent Bit doesn't create a tenant of Google Chronicle for your security logs, so you must create this ahead of time.
 
-### Creating a Tenant of Google Chronicle
+1. Retrieve service account credentials.
 
-Fluent Bit does not create a tenant of Google Chronicle for your security logs, so you must create this ahead of time.
+   The Fluent Bit Chronicle output plugin uses a JSON credentials file for authentication credentials. Download the credentials file by following the instructions for [Creating and Managing Service Account Keys](https://cloud.google.com/iam/docs/creating-managing-service-account-keys).
 
-### Retrieving Service Account Credentials
+## Configurations parameters
 
-Fluent Bit's Chronicle output plugin uses a JSON credentials file for authentication credentials. Download the credentials file by following these instructions:
+| Key | Description | Default |
+| :--- | :--- | :--- |
+| `google_service_credentials` | Absolute path to a Google Cloud credentials JSON file. | Value of the environment variable `$GOOGLE_SERVICE_CREDENTIALS` |
+| `service_account_email` | Account email associated with the service. Only available if no credentials file has been provided. | Value of environment variable `$SERVICE_ACCOUNT_EMAIL` |
+| `service_account_secret` | Private key content associated with the service account. Only available if no credentials file has been provided. | Value of environment variable `$SERVICE_ACCOUNT_SECRET` |
+| `project_id` | The project id containing the tenant of Google Chronicle to stream into. | The value of the `project_id` in the credentials file |
+| `customer_id` | The customer id to identify the tenant of Google Chronicle to stream into. The value of the `customer_id` should be specified in the configuration file. | _none_ |
+| `log_type` | The log type to parse logs as. Google Chronicle supports parsing for [specific log types only](https://cloud.google.com/chronicle/docs/ingestion/parser-list/supported-default-parsers). | _none_ |
+| `region` | The GCP region in which to store security logs. Supported regions: `US`, `EU`, `UK`, `ASIA`. Blank is handled as `US`. | _none_ |
+| `log_key` | By default, the whole log record will be sent to Google Chronicle. If you specify a key name with this option, then only the value of that key will be sent to Google Chronicle. | _none_ |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
-* [Creating and Managing Service Account Keys](https://cloud.google.com/iam/docs/creating-managing-service-account-keys)
+See Google's [official documentation](https://cloud.google.com/chronicle/docs/reference/ingestion-api) for further details.
 
-## Configurations Parameters
+## Configuration file
 
-| Key | Description | default |
-| :--- | :--- | :--- |
-| google\_service\_credentials | Absolute path to a Google Cloud credentials JSON file. | Value of the environment variable _$GOOGLE\_SERVICE\_CREDENTIALS_ |
-| service\_account\_email | Account email associated with the service. Only available if **no credentials file** has been provided. | Value of environment variable _$SERVICE\_ACCOUNT\_EMAIL_ |
-| service\_account\_secret | Private key content associated with the service account. Only available if **no credentials file** has been provided. | Value of environment variable _$SERVICE\_ACCOUNT\_SECRET_ |
-| project\_id | The project id containing the tenant of Google Chronicle to stream into. | The value of the `project_id` in the credentials file |
-| customer\_id | The customer id to identify the tenant of Google Chronicle to stream into. The value of the `customer_id` should be specified in the configuration file. |  |
-| log\_type | The log type to parse logs as. Google Chronicle supports parsing for [specific log types only](https://cloud.google.com/chronicle/docs/ingestion/parser-list/supported-default-parsers). |  |
-| region | The GCP region in which to store security logs. Currently, there are several supported regions: `US`, `EU`, `UK`, `ASIA`. Blank is handled as `US`.   |  |
-| log\_key | By default, the whole log record will be sent to Google Chronicle. If you specify a key name with this option, then only the value of that key will be sent to Google Chronicle. | |
+If you are using a Google Cloud credentials file, the following configuration will get you started:
 
-See Google's [official documentation](https://cloud.google.com/chronicle/docs/reference/ingestion-api) for further details.
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-## Configuration File
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      tag: dummy
 
-If you are using a _Google Cloud Credentials File_, the following configuration is enough to get you started:
+  outputs:
+    - name: chronicle
+      match: '*'
+      customer_id: my_customer_id
+      log_type: my_super_awesome_type
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name  dummy
-    Tag   dummy
+  Name dummy
+  Tag  dummy
 
 [OUTPUT]
-    Name       chronicle
-    Match      *
-    customer_id my_customer_id
-    log_type my_super_awesome_type
+  Name         chronicle
+  Match        *
+  customer_id  my_customer_id
+  log_type     my_super_awesome_type
 ```
+
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/outputs/cloudwatch.md b/pipeline/outputs/cloudwatch.md
index 74a17c673..b9007ab18 100644
--- a/pipeline/outputs/cloudwatch.md
+++ b/pipeline/outputs/cloudwatch.md
@@ -4,229 +4,369 @@ description: Send logs and metrics to Amazon CloudWatch
 
 # Amazon CloudWatch
 
-![](<../../.gitbook/assets/image (3) (2) (2) (4) (4) (3) (1).png>)
+![Amazon CloudWatch](<../../.gitbook/assets/image (3) (2) (2) (4) (4) (3) (1).png>)
 
-The Amazon CloudWatch output plugin allows to ingest your records into the [CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) service. Support for CloudWatch Metrics is also provided via [EMF](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch\_Embedded\_Metric\_Format\_Specification.html).
+The _Amazon CloudWatch_ output plugin lets you ingest your records into the [CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) service. Support for CloudWatch Metrics is also provided using [Embedded Metric Format (EMF)](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format_Specification.html).
 
-This is the documentation for the core Fluent Bit CloudWatch plugin written in C. It can replace the [aws/amazon-cloudwatch-logs-for-fluent-bit](https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit) Golang Fluent Bit plugin released last year. The Golang plugin was named `cloudwatch`; this new high performance CloudWatch plugin is called `cloudwatch_logs` to prevent conflicts/confusion. Check the amazon repo for the Golang plugin for details on the deprecation/migration plan for the original plugin.
+This is the documentation for the core Fluent Bit CloudWatch plugin written in C. It can replace the [aws/amazon-cloudwatch-logs-for-fluent-bit](https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit) Golang Fluent Bit plugin (`cloudwatch`). This CloudWatch plugin is called `cloudwatch_logs` to prevent conflicts or confusion. Check the Amazon repository for the Golang plugin for details about the deprecation and migration plan for the original plugin.
 
-See [here](https://github.com/fluent/fluent-bit-docs/tree/43c4fe134611da471e706b0edb2f9acd7cdfdbc3/administration/aws-credentials.md) for details on how AWS credentials are fetched.
+See [AWS credentials](https://docs.fluentbit.io/manual/administration/aws-credentials) for details about how AWS credentials are fetched.
 
-## Configuration Parameters
+## Configuration parameters
 
-| Key                   | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
-|-----------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| region                | The AWS region.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
-| log\_group\_name      | The name of the CloudWatch Log Group that you want log records sent to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
-| log\_group\_template  | Template for Log Group name using Fluent Bit [record\_accessor](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/record-accessor) syntax. This field is optional and if configured it overrides the `log_group_name`. If the template translation fails, an error is logged and the `log_group_name` (which is still required) is used instead. See the tutorial below for an example.                                                                                                                                                                                                                                                                                                                                                                                                                        |
-| log\_stream\_name     | The name of the CloudWatch Log Stream that you want log records sent to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
-| log\_stream\_prefix   | Prefix for the Log Stream name. The tag is appended to the prefix to construct the full log stream name. Not compatible with the log\_stream\_name option.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
-| log\_stream\_template | Template for Log Stream name using Fluent Bit [record\_accessor](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/record-accessor) syntax. This field is optional and if configured it overrides the other log stream options. If the template translation fails, an error is logged and the log\_stream\_name or log\_stream\_prefix are used instead (and thus one of those fields is still required to be configured). See the tutorial below for an example.                                                                                                                                                                                                                                                                                                                                              |
-| log\_key              | By default, the whole log record will be sent to CloudWatch. If you specify a key name with this option, then only the value of that key will be sent to CloudWatch. For example, if you are using the Fluentd Docker log driver, you can specify `log_key log` and only the log message will be sent to CloudWatch.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
-| log\_format           | An optional parameter that can be used to tell CloudWatch the format of the data. A value of json/emf enables CloudWatch to extract custom metrics embedded in a JSON payload. See the [Embedded Metric Format](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch\_Embedded\_Metric\_Format\_Specification.html).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
-| role\_arn             | ARN of an IAM role to assume (for cross account access).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
-| auto\_create\_group   | Automatically create the log group. Valid values are "true" or "false" (case insensitive). Defaults to false.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
-| log\_retention\_days  | If set to a number greater than zero, and newly create log group's retention policy is set to this many days. Valid values are: \[1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
-| endpoint              | Specify a custom endpoint for the CloudWatch Logs API.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
-| metric\_namespace     | An optional string representing the CloudWatch namespace for the metrics. See `Metrics Tutorial` section below for a full configuration.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
-| metric\_dimensions    | A list of lists containing the dimension keys that will be applied to all metrics. The values within a dimension set MUST also be members on the root-node. For more information about dimensions, see [Dimension](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API\_Dimension.html) and [Dimensions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch\_concepts.html#Dimension). In the fluent-bit config, metric\_dimensions is a comma and semicolon separated string. If you have only one list of dimensions, put the values as a comma separated string. If you want to put list of lists, use the list as semicolon separated strings. For example, if you set the value as 'dimension\_1,dimension\_2;dimension\_3', we will convert it as \[\[dimension\_1, dimension\_2],\[dimension\_3]] |
-| sts\_endpoint         | Specify a custom STS endpoint for the AWS STS API.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
-| profile               | Option to specify an AWS Profile for credentials. Defaults to `default`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
-| auto\_retry\_requests | Immediately retry failed requests to AWS services once. This option does not affect the normal Fluent Bit retry mechanism with backoff. Instead, it enables an immediate retry with no delay for networking errors, which may help improve throughput when there are transient/random networking issues. This option defaults to `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
-| external\_id          | Specify an external ID for the STS API, can be used with the role\_arn parameter if your role requires an external ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
+| Key  | Description       |
+|----- |------------------ |
+| `region`         | The AWS region.   |
+| `log_group_name` | The name of the CloudWatch log group that you want log records sent to.               |
+| `log_group_template`  | Optional. Template for the log group name using Fluent Bit [`record_accessor`](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/record-accessor) syntax. If configured, this field overrides the `log_group_name`. If the template translation fails, an error is logged and the `log_group_name` is used instead. See the tutorial for an example. |
+| `log_stream_name`     | The name of the CloudWatch log stream that you want log records sent to.              |
+| `log_stream_prefix`   | Prefix for the log stream name. The tag is appended to the prefix to construct the full log stream name. Not compatible with the `log_stream_name` option. |
+| `log_stream_template` | Optional. Template for log stream name using Fluent Bit [`record_accessor`](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/record-accessor) syntax. If configured, it overrides other log stream options. If the template translation fails, an error is logged and `log_stream_name` or `log_stream_prefix` are used instead (one of those fields must be configured). See the tutorial for an example.           |
+| `log_key`              | By default, the whole log record will be sent to CloudWatch. If you specify a key name with this option, then only the value of that key will be sent to CloudWatch. For example, if you are using the Fluentd Docker log driver, you can specify `log_key log` and only the log message will be sent to CloudWatch.                |
+| `log_format`           | Optional. A parameter that can be used to tell CloudWatch the format of the data. A value of `json/emf` enables CloudWatch to extract custom metrics embedded in a JSON payload. See the [Embedded Metric Format](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format_Specification.html) specification.            |
+| `role_arn`             | ARN of an IAM role to assume for  cross account access.             |
+| `auto_create_group`   | Automatically create the log group. Allowed values: `true`, `false` (case insensitive). Defaults to `false`.           |
+| `log_group_class`     | Optional. Specifies the log storage class for new log groups when `auto_create_group` is set to `true`. You can't modify the storage class of existing log groups. Allowed values: `STANDARD`, `INFREQUENT_ACCESS`. Default: `STANDARD`.       |
+| `log_retention_days`  | If set to a number greater than zero, and newly create log group's retention policy is set to this many days. Allowed values: [`1`, `3`, `5`, `7`, `14`, `30`, `60`, `90`, `120`, `150`, `180`, `365`, `400`, `545`, `731`, `1827`, `3653`] |
+| `endpoint`              | Specify a custom endpoint for the CloudWatch Logs API.               |
+| `metric_namespace`     | An optional string representing the CloudWatch namespace for the metrics. See the [Metrics tutorial](#metrics-tutorial) section for a full configuration. |
+| `metric_dimensions`    | A list of lists containing the dimension keys that will be applied to all metrics. The values within a dimension set must be members on the root-node. For more information about dimensions, see [Dimension](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_Dimension.html) and [Dimensions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Dimension). In the Fluent Bit configurations, `metric_dimensions` is a comma and semicolon separated string. If you have only one list of dimensions, put the values as a comma separated string. If you want to put list of lists, use the list as semicolon separated strings. For example, if you set the value as `dimension_1,dimension_2;dimension_3`, Fluent Bit converts it as `[[dimension_1, dimension_2],[dimension_3]]`. |
+| `sts_endpoint`         | Specify a custom STS endpoint for the AWS STS API.  |
+| `profile`               | Option to specify an AWS Profile for credentials. Defaults to `default`.              |
+| `auto_retry_requests` | Immediately retry failed requests to AWS services once. This option doesn't affect the normal Fluent Bit retry mechanism with backoff. Instead, it enables an immediate retry with no delay for networking errors, which can help improve throughput when there are transient/random networking issues. Defaults to `true`.             |
+| `external_id`          | Specify an external ID for the STS API, can be used with the `role_arn` parameter if your role requires an external ID.  |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. Default: `1`. |
 
-## Getting Started
+## Get started
 
-In order to send records into Amazon Cloudwatch, you can run the plugin from the command line or through the configuration file:
+To send records into Amazon CloudWatch, you can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-The **cloudwatch** plugin, can read the parameters from the command line through the **-p** argument (property), e.g:
+The CloudWatch plugin can read the parameters from the command line using the `-p` argument (property):
 
+```shell
+fluent-bit -i cpu -o cloudwatch_logs -p log_group_name=group -p log_stream_name=stream -p region=us-west-2 -m '*' -f 1
 ```
-$ fluent-bit -i cpu -o cloudwatch_logs -p log_group_name=group -p log_stream_name=stream -p region=us-west-2 -m '*' -f 1
-```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file append the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-In your main configuration file append the following _Output_ section:
+```yaml
+pipeline:
 
+  outputs:
+    - name: cloudwatch_logs
+      match: '*'
+      region: us-east-1
+      log_group_name: fluent-bit-cloudwatch
+      log_stream_prefix: from-fluent-bit-
+      auto_create_group: on
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-    Name cloudwatch_logs
-    Match   *
-    region us-east-1
-    log_group_name fluent-bit-cloudwatch
-    log_stream_prefix from-fluent-bit-
-    auto_create_group On
+  Name cloudwatch_logs
+  Match   *
+  region us-east-1
+  log_group_name fluent-bit-cloudwatch
+  log_stream_prefix from-fluent-bit-
+  auto_create_group On
 ```
 
-### Permissions
-
-The following AWS IAM permissions are required to use this plugin:
+{% endtab %}
+{% endtabs %}
 
-```
-{
-	"Version": "2012-10-17",
-	"Statement": [{
-		"Effect": "Allow",
-		"Action": [
-			"logs:CreateLogStream",
-			"logs:CreateLogGroup",
-			"logs:PutLogEvents"
-		],
-		"Resource": "*"
-	}]
-}
-```
+#### Integration with LocalStack (CloudWatch logs)
 
-### Worker support
+For an instance of `Localstack` running at `http://localhost:4566`, use the following configuration:
 
-Fluent Bit 1.7 adds a new feature called `workers` which enables outputs to have dedicated threads. This `cloudwatch_logs` plugin has partial support for workers in Fluent Bit 2.1.11 and prior. **2.1.11 and prior, the plugin can support a single worker; enabling multiple workers will lead to errors/indeterminate behavior.**
-Starting from Fluent Bit 2.1.12, the `cloudwatch_logs` plugin added full support for workers, meaning that more than one worker can be configured.
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-Example:
+```yaml
+pipeline:
 
+  outputs:
+    - name: cloudwatch_logs
+      match: '*'
+      region: us-east-1
+      log_group_name: fluent-bit-cloudwatch
+      log_stream_prefix: from-fluent-bit-
+      auto_create_group: on
+      endpoint: localhost
+      port: 4566
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-    Name cloudwatch_logs
-    Match   *
-    region us-east-1
-    log_group_name fluent-bit-cloudwatch
-    log_stream_prefix from-fluent-bit-
-    auto_create_group On
-    workers 1
+  Name cloudwatch_logs
+  Match   *
+  region us-east-1
+  log_group_name fluent-bit-cloudwatch
+  log_stream_prefix from-fluent-bit-
+  auto_create_group On
+  endpoint localhost
+  port 4566
 ```
 
-If you enable workers, you are enabling one or more dedicated threads for your CloudWatch output. 
-We recommend starting with 1 worker, evaluating the performance, and then enabling more workers if needed. 
-For most users, the plugin can provide sufficient throughput with 0 or 1 workers.
-
-### Log Stream and Group Name templating using record\_accessor syntax
+{% endtab %}
+{% endtabs %}
 
-Sometimes, you may want the log group or stream name to be based on the contents of the log record itself. This plugin supports templating log group and stream names using Fluent Bit [record\_accessor](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/record-accessor) syntax.
+Any testing credentials can be exported as local variables, such as `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`.
 
-Here is an example usage, for a common use case- templating log group and stream names based on Kubernetes metadata.
+### Permissions
 
-Recall that the kubernetes filter can add metadata which will look like the following:
+The following AWS IAM permissions are required to use this plugin:
 
+```json
+{
+  "Version": "2012-10-17",
+  "Statement": [{
+    "Effect": "Allow",
+    "Action": [
+      "logs:CreateLogStream",
+      "logs:CreateLogGroup",
+      "logs:PutLogEvents"
+    ],
+    "Resource": "*"
+  }]
+}
 ```
+
+### Log stream and group name templating using `record_accessor` syntax
+
+You might want the log group or stream name to be based on the contents of the log record itself. This plugin supports templating log group and stream names using Fluent Bit [`record_accessor`](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/record-accessor) syntax.
+
+The following example outlines a common use case-templating log group and stream names based on Kubernetes metadata.
+
+The Kubernetes filter can add metadata which will look like the following:
+
+```text
 kubernetes: {
-    annotations: {
-        "kubernetes.io/psp": "eks.privileged"
-    },
-    container_hash: "<some hash>",
-    container_name: "myapp",
-    docker_id: "<some id>",
-    host: "ip-10-1-128-166.us-east-2.compute.internal",
-    labels: {
-        app: "myapp",
-        "pod-template-hash": "<some hash>"
-    },
-    namespace_name: "my-namespace",
-    pod_id: "198f7dd2-2270-11ea-be47-0a5d932f5920",
-    pod_name: "myapp-5468c5d4d7-n2swr"
+  annotations: {
+    "kubernetes.io/psp": "eks.privileged"
+  },
+  container_hash: "<some hash>",
+  container_name: "myapp",
+  docker_id: "<some id>",
+  host: "ip-10-1-128-166.us-east-2.compute.internal",
+  labels: {
+    app: "myapp",
+    "pod-template-hash": "<some hash>"
+  },
+  namespace_name: "my-namespace",
+  pod_id: "198f7dd2-2270-11ea-be47-0a5d932f5920",
+  pod_name: "myapp-5468c5d4d7-n2swr"
 }
 ```
 
-Using record\_accessor, we can build a template based on this object.
+Using `record_accessor`, you can build a template based on this object.
 
-Here is our output configuration:
+Here is the configuration:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: cloudwatch_logs
+      match: '*'
+      region: us-east-1
+      log_group_name: fallback-group
+      log_stream_prefix: fallback-stream
+      auto_create_group: on
+      log_group_template: application-logs-$kubernetes['host'].$kubernetes['namespace_name']
+      log_stream_template: $kubernetes['pod_name'].$kubernetes['container_name']
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-    Name cloudwatch_logs
-    Match   *
-    region us-east-1
-    log_group_name fallback-group
-    log_stream_prefix fallback-stream
-    auto_create_group On
-    log_group_template application-logs-$kubernetes['host'].$kubernetes['namespace_name']
-    log_stream_template $kubernetes['pod_name'].$kubernetes['container_name']
+  Name cloudwatch_logs
+  Match   *
+  region us-east-1
+  log_group_name fallback-group
+  log_stream_prefix fallback-stream
+  auto_create_group On
+  log_group_template application-logs-$kubernetes['host'].$kubernetes['namespace_name']
+  log_stream_template $kubernetes['pod_name'].$kubernetes['container_name']
 ```
 
-With the above kubernetes metadata, the log group name will be `application-logs-ip-10-1-128-166.us-east-2.compute.internal.my-namespace`. And the log stream name will be `myapp-5468c5d4d7-n2swr.myapp`.
+{% endtab %}
+{% endtabs %}
 
-If the kubernetes structure is not found in the log record, then the `log_group_name` and `log_stream_prefix` will be used instead, and Fluent Bit will log an error like:
+With the Kubernetes metadata, the log group name will be `application-logs-ip-10-1-128-166.us-east-2.compute.internal.my-namespace`, and the log stream name will be `myapp-5468c5d4d7-n2swr.myapp`.
 
-```
+If the Kubernetes structure isn't found in the log record, then the `log_group_name` and `log_stream_prefix` are used, and Fluent Bit will log an error like:
+
+```text
 [2022/06/30 06:09:29] [ warn] [record accessor] translation failed, root key=kubernetes
 ```
 
-#### Limitations of record\_accessor syntax
+#### Limitations of `record_accessor` syntax
 
-Notice in the example above, that the template values are separated by dot characters. This is important; the Fluent Bit record\_accessor library has a limitation in the characters that can separate template variables- only dots and commas (`.` and `,`) can come after a template variable. This is because the templating library must parse the template and determine the end of a variable.
+In the previous example, the template values are separated by dot (`.`) characters. The Fluent Bit `record_accessor` library has a limitation in the characters that can separate template variables. Only dots and commas (`.` and `,`) can come after a template variable. This is because the templating library must parse the template and determine the end of a variable.
 
-Assume that your log records contain the metadata keys `container_name` and `task`. The following would be invalid templates because the two template variables are not separated by commas or dots:
+Assume that your log records contain the metadata keys `container_name` and `task`. The following would be invalid templates because the two template variables aren't separated by commas or dots:
 
-* `$task-$container_name`
-* `$task/$container_name`
-* `$task_$container_name`
-* `$taskfooo$container_name`
+- `$task-$container_name`
+- `$task/$container_name`
+- `$task_$container_name`
+- `$taskfooo$container_name`
 
 However, the following are valid:
 
-* `$task.$container_name`
-* `$task.resource.$container_name`
-* `$task.fooo.$container_name`
+- `$task.$container_name`
+- `$task.resource.$container_name`
+- `$task.fooo.$container_name`
 
 And the following are valid since they only contain one template variable with nothing after it:
 
-* `fooo$task`
-* `fooo____$task`
-* `fooo/bar$container_name`
+- `fooo$task`
+- `fooo____$task`
+- `fooo/bar$container_name`
 
-### Metrics Tutorial
+### Metrics tutorial
 
-Fluent Bit has different input plugins (cpu, mem, disk, netif) to collect host resource usage metrics. `cloudwatch_logs` output plugin can be used to send these host metrics to CloudWatch in Embedded Metric Format (EMF). If data comes from any of the above mentioned input plugins, `cloudwatch_logs` output plugin will convert them to EMF format and sent to CloudWatch as JSON log. Additionally, if we set `json/emf` as the value of `log_format` config option, CloudWatch will extract custom metrics from embedded JSON payload.
+Fluent Bit has input plugins (`cpu`, `mem`, `disk`, `netif`) to collect host resource usage metrics. The `cloudwatch_logs` output plugin can be used to send these host metrics to CloudWatch in Embedded Metric Format (EMF). If data comes from any of the mentioned input plugins, the `cloudwatch_logs` output plugin will convert them to EMF format and send to CloudWatch as JSON log. Additionally, if `json/emf` is set as the value of the `log_format` configuration option, CloudWatch will extract custom metrics from embedded JSON payload.
 
-Note: Right now, only `cpu` and `mem` metrics can be sent to CloudWatch.
+Only `cpu` and `mem` metrics can be sent to CloudWatch.
 
-For using the `mem` input plugin and sending memory usage metrics to CloudWatch, we can consider the following example config file. Here, we use the `aws` filter which adds `ec2_instance_id` and `az` (availability zone) to the log records. Later, in the output config section, we set `ec2_instance_id` as our metric dimension.
+For using the `mem` input plugin and sending memory usage metrics to CloudWatch, consider the following example configuration file. This example uses the `aws` filter which adds `ec2_instance_id` and `az` (availability zone) to the log records. Later, the output configuration section sets `ec2_instance_id` as the metric dimension.
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: mem
+      tag: mem
+
+  filters:
+    - name: aws
+      match: '*'
+
+  outputs:
+    - name: cloudwatch_logs
+      match: '*'
+      region: us-west-2
+      log_stream_name: fluent-bit-cloudwatch
+      log_group_name: fluent-bit-cloudwatch
+      log_format: json/emf
+      metric_namespace: fluent-bit-metrics
+      metric_dimensions: ec2_instance_id
+      auto_create_group: true
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [SERVICE]
-    Log_Level info
+  Log_Level info
 
 [INPUT]
-    Name mem
-    Tag mem
+  Name mem
+  Tag mem
 
 [FILTER]
-    Name aws
-    Match *
+  Name aws
+  Match *
 
 [OUTPUT]
-    Name cloudwatch_logs
-    Match *
-    log_stream_name fluent-bit-cloudwatch
-    log_group_name fluent-bit-cloudwatch
-    region us-west-2
-    log_format json/emf
-    metric_namespace fluent-bit-metrics
-    metric_dimensions ec2_instance_id
-    auto_create_group true
+  Name cloudwatch_logs
+  Match *
+  region us-west-2
+  log_stream_name fluent-bit-cloudwatch
+  log_group_name fluent-bit-cloudwatch
+  log_format json/emf
+  metric_namespace fluent-bit-metrics
+  metric_dimensions ec2_instance_id
+  auto_create_group true
 ```
 
-The following config will set two dimensions to all of our metrics- `ec2_instance_id` and `az`.
-
+{% endtab %}
+{% endtabs %}
+
+The following configuration will set two dimensions to all of the metrics: `ec2_instance_id` and `az`.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: mem
+      tag: mem
+
+  filters:
+    - name: aws
+      match: '*'
+
+  outputs:
+    - name: cloudwatch_logs
+      match: '*'
+      region: us-west-2
+      log_stream_name: fluent-bit-cloudwatch
+      log_group_name: fluent-bit-cloudwatch
+      log_format: json/emf
+      metric_namespace: fluent-bit-metrics
+      metric_dimensions: ec2_instance_id,az
+      auto_create_group: true
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[SERVICE]
+  Log_Level info
+
+[INPUT]
+  Name mem
+  Tag mem
+
 [FILTER]
-    Name aws
-    Match *
+  Name aws
+  Match *
 
 [OUTPUT]
-    Name cloudwatch_logs
-    Match *
-    log_stream_name fluent-bit-cloudwatch
-    log_group_name fluent-bit-cloudwatch
-    region us-west-2
-    log_format json/emf
-    metric_namespace fluent-bit-metrics
-    metric_dimensions ec2_instance_id,az
-    auto_create_group true
+  Name cloudwatch_logs
+  Match *
+  region us-west-2
+  log_stream_name fluent-bit-cloudwatch
+  log_group_name fluent-bit-cloudwatch
+  log_format json/emf
+  metric_namespace fluent-bit-metrics
+  metric_dimensions ec2_instance_id,az
+  auto_create_group true
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ### AWS for Fluent Bit
 
 Amazon distributes a container image with Fluent Bit and these plugins.
@@ -239,21 +379,21 @@ Amazon distributes a container image with Fluent Bit and these plugins.
 
 [aws-for-fluent-bit](https://gallery.ecr.aws/aws-observability/aws-for-fluent-bit)
 
-Our images are available in Amazon ECR Public Gallery. You can download images with different tags by following command:
+Images are available in Amazon ECR Public Gallery. You can download images with different tags by following command:
 
-```
+```shell
 docker pull public.ecr.aws/aws-observability/aws-for-fluent-bit:<tag>
 ```
 
 For example, you can pull the image with latest version by:
 
-```
+```shell
 docker pull public.ecr.aws/aws-observability/aws-for-fluent-bit:latest
 ```
 
 If you see errors for image pull limits, try log into public ECR with your AWS credentials:
 
-```
+```shell
 aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
 ```
 
@@ -265,10 +405,10 @@ You can check the [Amazon ECR Public official doc](https://docs.aws.amazon.com/A
 
 #### Amazon ECR
 
-You can use our SSM Public Parameters to find the Amazon ECR image URI in your region:
+You can use SSM public parameters to find the Amazon ECR image URI in your region:
 
-```
+```shell
 aws ssm get-parameters-by-path --path /aws/service/aws-for-fluent-bit/
 ```
 
-For more see [the AWS for Fluent Bit github repo](https://github.com/aws/aws-for-fluent-bit#public-images).
+For more see [the AWS for Fluent Bit GitHub repository](https://github.com/aws/aws-for-fluent-bit#public-images).
diff --git a/pipeline/outputs/counter.md b/pipeline/outputs/counter.md
index 197b74ef9..a6c122b64 100644
--- a/pipeline/outputs/counter.md
+++ b/pipeline/outputs/counter.md
@@ -1,54 +1,66 @@
 # Counter
 
-_Counter_ is a very simple plugin that counts how many records it's getting upon flush time. Plugin output is as follows:
+_Counter_ is a plugin that counts how many records it's getting upon flush time. Plugin output is as follows:
 
 ```text
 [TIMESTAMP, NUMBER_OF_RECORDS_NOW] (total = RECORDS_SINCE_IT_STARTED)
 ```
 
-## Getting Started
+## Get started
 
-You can run the plugin from the command line or through the configuration file:
+You can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-From the command line you can let Fluent Bit count up a data with the following options:
+From the command line you can let Fluent Bit count data with the following options:
 
-```bash
-$ fluent-bit -i cpu -o counter
+```shell
+fluent-bit -i cpu -o counter
 ```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following Input & Output sections:
+In your main configuration file append the following:
 
-```python
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
+
+  outputs:
+    - name: counter
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name cpu
-    Tag  cpu
+  Name cpu
+  Tag  cpu
 
 [OUTPUT]
-    Name  counter
-    Match *
+  Name  counter
+  Match *
 ```
 
-## Testing
+{% endtab %}
+{% endtabs %}
 
-Once Fluent Bit is running, you will see the reports in the output interface similar to this:
+## Testing
 
-```bash
-$ bin/fluent-bit -i cpu -o counter -f 1
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+When Fluent Bit is running, you will see the reports similar to this in the output interface:
 
-[2017/07/19 11:19:02] [ info] [engine] started
+```text
+...
 1500484743,1 (total = 1)
 1500484744,1 (total = 2)
 1500484745,1 (total = 3)
 1500484746,1 (total = 4)
 1500484747,1 (total = 5)
 ```
-
diff --git a/pipeline/outputs/dash0.md b/pipeline/outputs/dash0.md
new file mode 100644
index 000000000..79786fae9
--- /dev/null
+++ b/pipeline/outputs/dash0.md
@@ -0,0 +1,68 @@
+---
+description: Send logs to Dash0
+---
+
+# Dash0
+
+Stream logs to [Dash0](https://www.dash0.com) by utilizing the [OpenTelemetry plugin](opentelemetry.md) to send data to the Dash0 log ingress.
+
+## Configuration parameters
+
+| Key                        | Description | Default |
+| -------------------------- | ----------- | ------- |
+| `header`                   | The specific header for bearer authorization, where {your-Auth-token-here} is your Dash0 Auth Token. | Authorization Bearer {your-Auth-token-here} |
+| `host`                     | Your Dash0 ingress endpoint. | `ingress.eu-west-1.aws.dash0.com` |
+| `port`                     | TCP port of your Dash0 ingress endpoint. | `443` |
+| `metrics_uri`              | Specify an optional HTTP URI for the target web server listening for metrics | `/v1/metrics` |
+| `logs_uri`                 | Specify an optional HTTP URI for the target web server listening for logs | `/v1/logs` |
+| `traces_uri`               | Specify an optional HTTP URI for the target web server listening for traces | `/v1/traces`  |
+
+### TLS / SSL
+
+The OpenTelemetry output plugin supports TLS/SSL. For more details about the properties available and general configuration, see [TLS/SSL](../../administration/transport-security.md).
+
+## Get started
+
+To get started with sending logs to Dash0:
+
+1. Get an [Auth Token](https://www.dash0.com/documentation/dash0/key-concepts/auth-tokens) from **Settings** > **Auth Tokens**.
+1. In your main Fluent Bit configuration file append the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: opentelemetry
+      match: '*'
+      host: ingress.eu-west-1.aws.dash0.com
+      port: 443
+      header: Authorization Bearer {your-Auth-token-here}
+      metrics_uri: /v1/metrics
+      logs_uri: /v1/logs
+      traces_uri: /v1/traces
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[OUTPUT]
+  Name         opentelemetry
+  Match        *
+  Host         ingress.eu-west-1.aws.dash0.com
+  Port         443
+  Header       Authorization Bearer {your-Auth-token-here}
+  Metrics_uri  /v1/metrics
+  Logs_uri     /v1/logs
+  Traces_uri   /v1/traces
+```
+
+{% endtab %}
+{% endtabs %}
+
+## References
+
+- [Dash0 documentation](https://www.dash0.com/documentation/dash0)
diff --git a/pipeline/outputs/datadog.md b/pipeline/outputs/datadog.md
index a89649a35..09170ab23 100644
--- a/pipeline/outputs/datadog.md
+++ b/pipeline/outputs/datadog.md
@@ -4,47 +4,76 @@ description: Send logs to Datadog
 
 # Datadog
 
-The Datadog output plugin allows to ingest your logs into [Datadog](https://app.datadoghq.com/signup).
+The _Datadog_ output plugin lets you ingest your logs into [Datadog](https://app.datadoghq.com/signup).
 
 Before you begin, you need a [Datadog account](https://app.datadoghq.com/signup), a [Datadog API key](https://docs.datadoghq.com/account_management/api-app-keys/), and you need to [activate Datadog Logs Management](https://app.datadoghq.com/logs/activation).
 
-## Configuration Parameters
+## Configuration parameters
 
-| Key             | Description                                                                                                                                                                                                                                                                                                                                                                                                                                | Default                          |
-| --------------- | -----------------------------------------------------------------------------------------------------------------------------------------------------------------                                                                                                                                                                                                                                                                          | -------------------------------- |
-| Host            | _Required_ - The Datadog server where you are sending your logs.                                                                                                                                                                                                                                                                                                                                                                           | `http-intake.logs.datadoghq.com` |
-| TLS             | _Required_ - End-to-end security communications security protocol. Datadog recommends setting this to `on`.                                                                                                                                                                                                                                                                                                                                | `off`                            |
-| compress        | _Recommended_ - compresses the payload in GZIP format, Datadog supports and recommends setting this to `gzip`.                                                                                                                                                                                                                                                                                                                             |                                  |
-| apikey          | _Required_ - Your [Datadog API key](https://app.datadoghq.com/account/settings#api).                                                                                                                                                                                                                                                                                                                                                       |                                  |
-| Proxy           | _Optional_ - Specify an HTTP Proxy. The expected format of this value is [http://host:port](http://host/:port). Note that _https_ is **not** supported yet.                                                                                                                                                                                                                                                                                |                                  |
-| provider        | To activate the remapping, specify configuration flag provider with value `ecs`.                                                                                                                                                                                                                                                                                                                                                           |                                  |
-| json_date_key   | Date key name for output.                                                                                                                                                                                                                                                                                                                                                                                                                  | `timestamp`                      |
-| include_tag_key | If enabled, a tag is appended to output. The key name is used `tag_key` property.                                                                                                                                                                                                                                                                                                                                                          | `false`                          |
-| tag_key         | The key name of tag. If `include_tag_key` is false, This property is ignored.                                                                                                                                                                                                                                                                                                                                                              | `tagkey`                         |
-| dd_service      | _Recommended_ - The human readable name for your service generating the logs (e.g. the name of your application or database). If unset, Datadog will look for the service using [Service Remapper](https://docs.datadoghq.com/logs/log_configuration/pipelines/?tab=service#service-attribute)." |                                  |
-| dd_source       | _Recommended_ - A human readable name for the underlying technology of your service (e.g. `postgres` or `nginx`). If unset, Datadog will look for the source in the [`ddsource` attribute](https://docs.datadoghq.com/logs/log_configuration/pipelines/?tab=source#source-attribute).                                                                                                                                                                                                                                                                                                                   |                                  |
-| dd_tags         | _Optional_ - The [tags](https://docs.datadoghq.com/tagging/) you want to assign to your logs in Datadog. If unset, Datadog will look for the tags in the [`ddtags' attribute](https://docs.datadoghq.com/api/latest/logs/#send-logs).                                                                                                                                                                                                                                                                                                                                   |                                  |
-| dd_message_key  | By default, the plugin searches for the key 'log' and remap the value to the key 'message'. If the property is set, the plugin will search the property name key.                                                                                                                                                                                                                                                                          |                                  |
+This plugin uses the following configuration parameters:
 
-### Configuration File
+| Key | Description | Default |
+| --- | ----------- | ------- |
+| `Host` | The Datadog server where you are sending your logs. | `http-intake.logs.datadoghq.com` |
+| `TLS` | End-to-end security communications security protocol. Datadog recommends setting this to `on`. | `off` |
+| `compress` | Optional. Compresses the payload in GZIP format. Datadog supports and recommends setting this to `gzip`.  | _none_ |
+| `apikey` | Your [Datadog API key](https://app.datadoghq.com/account/settings#api). | _none_ |
+| `Proxy` | Optional. Specifies an HTTP proxy. The expected format of this value is `http://host:port`. HTTPS isn't supported. | _none_ |
+| `provider` | To activate remapping, specify the configuration flag provider with the value `ecs`. | _none_ |
+| `json_date_key` | Date key name for output. | `timestamp` |
+| `include_tag_key` | If enabled, a tag is appended to the output. The key name is used `tag_key` property. | `false` |
+| `tag_key` | The key name of tag. If `include_tag_key` is `false`, this property is ignored. | `tagkey` |
+| `dd_service` | Recommended. The human readable name for your service generating the logs. For example, the name of your application or database. If not set, Datadog looks for the service using [service remapper](https://docs.datadoghq.com/logs/log_configuration/pipelines/?tab=service#service-attribute). | _none_ |
+| `dd_source` | Recommended. A human-readable name for the underlying technology of your service like `postgres` or `nginx`. If unset, Datadog looks for the source in the [`ddsource` attribute](https://docs.datadoghq.com/logs/log_configuration/pipelines/?tab=source#source-attribute). | _none_ |
+| `dd_tags` | Optional. The [tags](https://docs.datadoghq.com/tagging/) you want to assign to your logs in Datadog. If unset, Datadog will look for the tags in the [`ddtags` attribute](https://docs.datadoghq.com/api/latest/logs/#send-logs).  | _none_ |
+| `dd_message_key` | By default, the plugin searches for the key `log` and remaps the value to the key `message`. If the property is set, the plugin will search the property name key. | _none_ |
+| `dd_hostname` | The host the emitted logs should be associated with. If unset, Datadog expects the host to be set with `host`, `hostname`, or `syslog.hostname` attributes. See [Datadog Logs preprocessor documentation](https://docs.datadoghq.com/logs/log_configuration/pipelines/?tab=host#preprocessing) for recognized attributes. | _none_ |
+| workers | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
+| header | Add additional arbitrary HTTP header key/value pair. Multiple headers can be set. | _none_ |
 
-Get started quickly with this configuration file:
+### Configuration file
 
+Get started with this configuration file:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: datadog
+      match: '*'
+      host: http-intake.logs.datadoghq.com
+      tls: on
+      compress: gzip
+      apikey: <my-datadog-api-key>
+      dd_service: <my-app-service>
+      dd_source: <my-app-source>
+      dd_tags: team:logs,foo:bar
+      dd_hostname: myhost
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-    Name        datadog
-    Match       *
-    Host        http-intake.logs.datadoghq.com
-    TLS         on
-    compress    gzip
-    apikey      <my-datadog-api-key>
-    dd_service  <my-app-service>
-    dd_source   <my-app-source>
-    dd_tags     team:logs,foo:bar
+  Name        datadog
+  Match       *
+  Host        http-intake.logs.datadoghq.com
+  TLS         on
+  compress    gzip
+  apikey      <my-datadog-api-key>
+  dd_service  <my-app-service>
+  dd_source   <my-app-source>
+  dd_tags     team:logs,foo:bar
+  dd_hostname myhost
 ```
 
-## Troubleshooting
+{% endtab %}
+{% endtabs %}
 
-### 403 Forbidden
+## Troubleshooting
 
 If you get a `403 Forbidden` error response, double check that you have a valid [Datadog API key](https://docs.datadoghq.com/account_management/api-app-keys/) and that you have [activated Datadog Logs Management](https://app.datadoghq.com/logs/activation).
diff --git a/pipeline/outputs/dynatrace.md b/pipeline/outputs/dynatrace.md
new file mode 100644
index 000000000..3912b05cb
--- /dev/null
+++ b/pipeline/outputs/dynatrace.md
@@ -0,0 +1,89 @@
+---
+description: Send logs to Dynatrace
+---
+
+# Dynatrace
+
+Stream logs to [Dynatrace](https://www.dynatrace.com) by utilizing the `http` plugin to send data to the [Dynatrace generic log ingest API](https://docs.dynatrace.com/docs/shortlink/lma-generic-log-ingestion).
+
+## Configuration parameters
+
+| Key                        | Description | Default |
+| -------------------------- | ----------- | ------- |
+| `header`                   | The specific header for content-type. | `Content-Type application/json; charset=utf-8` |
+| `header`                   | The specific header for authorization token, where {your-API-token-here} is the Dynatrace API token with log ingest scope. | Authorization Api-Token {your-API-token-here} |
+| `allow_duplicated_headers` | Specifies duplicated header use. | `false` |
+| `host`                     | Your Dynatrace environment hostname where {your-environment-id} is your environment ID. | `{your-environment-id}.live.dynatrace.com` |
+| `port`                     | TCP port of your Dynatrace host. | `443` |
+| `uri`                      | Specify the HTTP URI for Dynatrace log ingest API. | `/api/v2/logs/ingest` |
+| `format`                   | The data format to be used in the HTTP request body. | `json` |
+| `json_date_format`         | Date format standard for JSON. | `iso8601` |
+| `json_date_key`            | Field name specifying message timestamp. | `timestamp` |
+| `tls`                      | Specify to use TLS. | `on` |
+| `tls.verify`               | TLS verification. | `on` |
+
+## Get started
+
+To get started with sending logs to Dynatrace:
+
+1. Get a [Dynatrace API](https://docs.dynatrace.com/docs/shortlink/api-authentication) token with the `logs.ingest` (Ingest Logs) scope.
+1. Determine your Dynatrace [environment ID](https://docs.dynatrace.com/docs/shortlink/monitoring-environment#environment-id).
+1. In your main Fluent Bit configuration file, append the following `Output` section:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+   ```yaml
+   pipeline:
+
+     outputs:
+       - name: http
+         match: '*'
+         header:
+           - 'Content-Type application/json; charset=utf-8'
+           - 'Authorization Api-Token {your-API-token-here}'
+         allow_duplicated_headers: false
+         host: {your-environment-id}.live.dynatrace.com
+         port: 443
+         uri: /api/v2/logs/ingest
+         format: json
+         json_date_format: iso8601
+         json_date_key: timestamp
+         tls: on
+         tls.verify: on
+   ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+   ```text
+   [OUTPUT]
+     name         http
+     match        *
+     header       Content-Type application/json; charset=utf-8
+     header       Authorization Api-Token {your-API-token-here}
+     allow_duplicated_headers false
+     host         {your-environment-id}.live.dynatrace.com
+     Port         443
+     URI          /api/v2/logs/ingest
+     Format       json
+     json_date_format iso8601
+     json_date_key timestamp
+     tls          On
+     tls.verify   On
+   ```
+
+{% endtab %}
+{% endtabs %}
+
+## References
+
+<!-- vale FluentBit.Simplicity = NO -->
+
+- [Dynatrace Fluent Bit documentation](https://docs.dynatrace.com/docs/shortlink/lma-stream-logs-with-fluent-bit)
+- [Fluent Bit integration in Dynatrace Hub](https://www.dynatrace.com/hub/detail/fluent-bit/?filter=log-management-and-analytics)
+- [Video: Stream a Log File to Dynatrace using Fluent Bit](https://www.youtube.com/watch?v=JJJNxhtJ6R0)
+- [Blog: Easily stream logs from Fluent Bit to
+  Dynatrace](https://www.dynatrace.com/news/blog/easily-stream-logs-with-fluent-bit-to-dynatrace/)
+
+<!-- vale FluentBit.Simplicity = YES -->
diff --git a/pipeline/outputs/elasticsearch.md b/pipeline/outputs/elasticsearch.md
index 7f6f4a708..d2295f715 100644
--- a/pipeline/outputs/elasticsearch.md
+++ b/pipeline/outputs/elasticsearch.md
@@ -4,78 +4,88 @@ description: Send logs to Elasticsearch (including Amazon OpenSearch Service)
 
 # Elasticsearch
 
-The **es** output plugin, allows to ingest your records into an [Elasticsearch](http://www.elastic.co) database. The following instructions assumes that you have a fully operational Elasticsearch service running in your environment.
+The _Elasticsearch_ (`es`) output plugin lets you ingest your records into an [Elasticsearch](http://www.elastic.co) database. To use this plugin, you must have an operational Elasticsearch service running in your environment.
 
-## Configuration Parameters
+## Configuration parameters
 
-| Key | Description | default |
+This plugin has the following configuration parameters:
+
+| Key | Description | Default |
 | :--- | :--- | :--- |
-| Host | IP address or hostname of the target Elasticsearch instance | 127.0.0.1 |
-| Port | TCP port of the target Elasticsearch instance | 9200 |
-| Path | Elasticsearch accepts new data on HTTP query path "/\_bulk". But it is also possible to serve Elasticsearch behind a reverse proxy on a subpath. This option defines such path on the fluent-bit side. It simply adds a path prefix in the indexing HTTP POST URI. | Empty string |
-| compress | Set payload compression mechanism. Option available is 'gzip' | |
-| Buffer\_Size | Specify the buffer size used to read the response from the Elasticsearch HTTP service. This option is useful for debugging purposes where is required to read full responses, note that response size grows depending of the number of records inserted. To set an _unlimited_ amount of memory set this value to **False**, otherwise the value must be according to the [Unit Size](../../administration/configuring-fluent-bit/unit-sizes.md) specification. | 512KB |
-| Pipeline | Newer versions of Elasticsearch allows to setup filters called pipelines. This option allows to define which pipeline the database should use. For performance reasons is strongly suggested to do parsing and filtering on Fluent Bit side, avoid pipelines. |  |
-| AWS\_Auth | Enable AWS Sigv4 Authentication for Amazon OpenSearch Service | Off |
-| AWS\_Region | Specify the AWS region for Amazon OpenSearch Service |  |
-| AWS\_STS\_Endpoint | Specify the custom sts endpoint to be used with STS API for Amazon OpenSearch Service |  |
-| AWS\_Role\_ARN | AWS IAM Role to assume to put records to your Amazon cluster |  |
-| AWS\_External\_ID | External ID for the AWS IAM Role specified with `aws_role_arn` |  |
-| AWS\_Service\_Name | Service name to be used in AWS Sigv4 signature. For integration with Amazon OpenSearch Serverless, set to `aoss`. See the [FAQ](opensearch.md#faq) section on Amazon OpenSearch Serverless for more information. | es |
-| AWS\_Profile | AWS profile name | default |
-| Cloud\_ID | If you are using Elastic's Elasticsearch Service you can specify the cloud\_id of the cluster running. The Cloud ID string has the format `<deployment_name>:<base64_info>`. Once decoded, the `base64_info` string has the format `<deployment_region>$<elasticsearch_hostname>$<kibana_hostname>`.
- |  |
-| Cloud\_Auth | Specify the credentials to use to connect to Elastic's Elasticsearch Service running on Elastic Cloud |  |
-| HTTP\_User | Optional username credential for Elastic X-Pack access |  |
-| HTTP\_Passwd | Password for user defined in HTTP\_User |  |
-| Index | Index name | fluent-bit |
-| Type | Type name | \_doc |
-| Logstash\_Format | Enable Logstash format compatibility. This option takes a boolean value: True/False, On/Off | Off |
-| Logstash\_Prefix | When Logstash\_Format is enabled, the Index name is composed using a prefix and the date, e.g: If Logstash\_Prefix is equals to 'mydata' your index will become 'mydata-YYYY.MM.DD'. The last string appended belongs to the date when the data is being generated. | logstash |
-| Logstash\_Prefix\_Key | When included: the value of the key in the record will be evaluated as key reference and overrides Logstash\_Prefix for index generation. If the key/value is not found in the record then the Logstash\_Prefix option will act as a fallback. The parameter is expected to be a [record accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md). |  |
-| Logstash\_Prefix\_Separator | Set a separator between logstash_prefix and date.| - |
-| Logstash\_DateFormat | Time format \(based on [strftime](http://man7.org/linux/man-pages/man3/strftime.3.html)\) to generate the second part of the Index name. | %Y.%m.%d |
-| Time\_Key | When Logstash\_Format is enabled, each record will get a new timestamp field. The Time\_Key property defines the name of that field. | @timestamp |
-| Time\_Key\_Format | When Logstash\_Format is enabled, this property defines the format of the timestamp. | %Y-%m-%dT%H:%M:%S |
-| Time\_Key\_Nanos | When Logstash\_Format is enabled, enabling this property sends nanosecond precision timestamps. | Off |
-| Include\_Tag\_Key | When enabled, it append the Tag name to the record. | Off |
-| Tag\_Key | When Include\_Tag\_Key is enabled, this property defines the key name for the tag. | \_flb-key |
-| Generate\_ID | When enabled, generate `_id` for outgoing records. This prevents duplicate records when retrying ES. | Off |
-| Id\_Key | If set, `_id` will be the value of the key from incoming record and `Generate_ID` option is ignored. |  |
-| Write\_Operation | The write\_operation can be any of: create (default), index, update, upsert. | create |
-| Replace\_Dots | When enabled, replace field name dots with underscore, required by Elasticsearch 2.0-2.3. | Off |
-| Trace\_Output | Print all elasticsearch API request payloads to stdout \(for diag only\) | Off |
-| Trace\_Error | If elasticsearch return an error, print the elasticsearch API request and response \(for diag only\) | Off |
-| Current\_Time\_Index | Use current time for index generation instead of message record | Off |
-| Suppress\_Type\_Name | When enabled, mapping types is removed and `Type` option is ignored. If using Elasticsearch 8.0.0 or higher - it [no longer supports mapping types](https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html), so it shall be set to On. | Off |
-| Workers | Enables dedicated thread(s) for this output. Default value is set since version 1.8.13. For previous versions is 0. | 2 |
-
-> The parameters _index_ and _type_ can be confusing if you are new to Elastic, if you have used a common relational database before, they can be compared to the _database_ and _table_ concepts. Also see [the FAQ below](elasticsearch.md#faq)
+| `Host` | IP address or hostname of the target Elasticsearch instance | `127.0.0.1` |
+| `Port` | TCP port of the target Elasticsearch instance | `9200` |
+| `Path` | Elasticsearch accepts new data on HTTP query path `/_bulk`. You can also serve Elasticsearch behind a reverse proxy on a sub-path. Define the path by adding a path prefix in the indexing HTTP POST URI. | Empty string |
+| `compress` | Set payload compression mechanism. Option available is `gzip`. | _none_ |
+| `Buffer_Size` | Specify the buffer size used to read the response from the Elasticsearch HTTP service. Use for debugging purposes where required to read full responses. Response size grows depending of the number of records inserted. To use an unlimited amount of memory, set this value to `False`. Otherwise set the value according to the [Unit Size](../../administration/configuring-fluent-bit/unit-sizes.md). | `512KB` |
+| `Pipeline` | Define which pipeline the database should use. For performance reasons, it's strongly suggested to do parsing and filtering on Fluent Bit side, and avoid pipelines. | _none_ |
+| `AWS_Auth` | Enable AWS Sigv4 Authentication for Amazon OpenSearch Service. | `Off` |
+| `AWS_Region` | Specify the AWS region for Amazon OpenSearch Service. | _none_ |
+| `AWS_STS_Endpoint` | Specify the custom STS endpoint to be used with STS API for Amazon OpenSearch Service | _none_ |
+| `AWS_Role_ARN` | AWS IAM Role to assume to put records to your Amazon cluster | _none_ |
+| `AWS_External_ID` | External ID for the AWS IAM Role specified with `aws_role_arn` | _none_ |
+| `AWS_Service_Name` | Service name to use in AWS Sigv4 signature. For integration with Amazon OpenSearch Serverless, set to `aoss`. See [Amazon OpenSearch Serverless](opensearch.md) for more information. | `es` |
+| `AWS_Profile` | AWS profile name | `default` |
+| `Cloud_ID` | If using Elastic's Elasticsearch Service you can specify the `cloud_id` of the cluster running. The string has the format `<deployment_name>:<base64_info>`. Once decoded, the `base64_info` string has the format `<deployment_region>$<elasticsearch_hostname>$<kibana_hostname>`. | _none_ |
+| `Cloud_Auth` | Specify the credentials to use to connect to Elastic's Elasticsearch Service running on Elastic Cloud | _none_ |
+| `HTTP_User` | Optional username credential for Elastic X-Pack access | _none_ |
+| `HTTP_Passwd` | Password for user defined in `HTTP_User` | _none_ |
+| `Index` | Index name | `fluent-bit` |
+| `Type` | Type name | `_doc` |
+| `Logstash_Format` | Enable Logstash format compatibility. This option takes a Boolean value: `True/False`, `On/Off` | `Off` |
+| `Logstash_Prefix` | When `Logstash_Format` is enabled, the Index name is composed using a prefix and the date, e.g: If `Logstash_Prefix` is equal to `mydata` your index will become `mydata-YYYY.MM.DD`. The last string appended belongs to the date when the data is being generated. | `logstash` |
+| `Logstash_Prefix_Key` | When included: the value of the key in the record will be evaluated as key reference and overrides `Logstash_Prefix` for index generation. If the key/value isn't found in the record then the `Logstash_Prefix` option will act as a fallback. The parameter is expected to be a [record accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md). | _none_ |
+| `Logstash_Prefix_Separator` | Set a separator between `Logstash_Prefix` and date.| `-` |
+| `Logstash_DateFormat` | Time format based on [strftime](http://man7.org/linux/man-pages/man3/strftime.3.html) to generate the second part of the Index name. | `%Y.%m.%d` |
+| `Time_Key` | When `Logstash_Format` is enabled, each record will get a new timestamp field. The `Time_Key` property defines the name of that field. | `@timestamp` |
+| `Time_Key_Format` | When `Logstash_Format` is enabled, this property defines the format of the timestamp. | `%Y-%m-%dT%H:%M:%S` |
+| `Time_Key_Nanos` | When `Logstash_Format` is enabled, enabling this property sends nanosecond precision timestamps. | `Off` |
+| `Include_Tag_Key` | When enabled, it append the Tag name to the record. | `Off` |
+| `Tag_Key` | When `Include_Tag_Key` is enabled, this property defines the key name for the tag. | `_flb-key` |
+| `Generate_ID` | When enabled, generate `_id` for outgoing records. This prevents duplicate records when retrying ES. | `Off` |
+| `Id_Key` | If set, `_id` will be the value of the key from incoming record and `Generate_ID` option is ignored. | _none_ |
+| `Write_Operation` | `Write_operation` can be any of: `create`, `index`, `update`, `upsert`. | `create` |
+| `Replace_Dots` | When enabled, replace field name dots with underscore. Required by Elasticsearch 2.0-2.3. | `Off` |
+| `Trace_Output` | Print all ElasticSearch API request payloads to `stdout` for diagnostics. | `Off` |
+| `Trace_Error` | If ElasticSearch returns an error, print the ElasticSearch API request and response for diagnostics. | `Off` |
+| `Current_Time_Index` | Use current time for index generation instead of message record. | `Off` |
+| `Suppress_Type_Name` | When enabled, mapping types is removed and `Type` option is ignored. Elasticsearch 8.0.0 or higher [no longer supports mapping types](https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html), and is set to `On`. | `Off` |
+| `Workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `2` |
+
+If you have used a common relational database, the parameters `index` and `type` can be compared to the `database` and `table` concepts.
 
 ### TLS / SSL
 
-Elasticsearch output plugin supports TLS/SSL, for more details about the properties available and general configuration, please refer to the [TLS/SSL](../../administration/transport-security.md) section.
+The Elasticsearch output plugin supports TLS/SSL. For more details about the properties available and general configuration, see [TLS/SSL](../../administration/transport-security.md).
+
+### `write_operation`
+
+The `write_operation` can be any of:
+
+| Operation   | Description |
+| ----------- | ----------- |
+| `create`    | Adds new data. If the data already exists (based on its id), the op is skipped.|
+| `index`     | New data is added while existing data (based on its id) is replaced (reindexed).|
+| `update`    | Updates existing data (based on its id). If no data is found, the op is skipped. |
+| `upsert`    | Merge or insert if the data doesn't exist, updates if the data exists (based on its id).|
+
+{% hint style="info" %}
 
-### write\_operation
+`Id_Key` or `Generate_ID` is required for `update` and `upsert`.
 
-The write\_operation can be any of:
+{% endhint %}
 
-| Operation | Description          |
-| ------------- | ----------- |
-| create (default) | adds new data - if the data already exists (based on its id), the op is skipped.|
-| index            | new data is added while existing data (based on its id) is replaced (reindexed).|
-| update           | updates existing data (based on its id). If no data is found, the op is skipped.|
-| upsert           | known as merge or insert if the data does not exist, updates if the data exists (based on its id).|
+## Get started
 
-**Please note, `Id_Key` or `Generate_ID` is required in update, and upsert scenario.**
+To insert records into an Elasticsearch service, run the plugin from the command line or through the configuration file.
 
-## Getting Started
+### Command line
 
-In order to insert records into a Elasticsearch service, you can run the plugin from the command line or through the configuration file:
+The `es` plugin can read the parameters from the command line in the following ways:
 
-### Command Line
+- Through the `-p` argument (property).
+- Setting them directly through the service URI.
 
-The **es** plugin, can read the parameters from the command line in two ways, through the **-p** argument \(property\) or setting them directly through the service URI. The URI format is the following:
+The URI format is the following:
 
 ```text
 es://host:port/index/type
@@ -83,41 +93,64 @@ es://host:port/index/type
 
 Using the format specified, you could start Fluent Bit through:
 
-```text
-$ fluent-bit -i cpu -t cpu -o es://192.168.2.3:9200/my_index/my_type \
+```shell
+fluent-bit -i cpu -t cpu -o es://192.168.2.3:9200/my_index/my_type \
     -o stdout -m '*'
 ```
 
-which is similar to do:
+Which is similar to the following command:
 
-```text
-$ fluent-bit -i cpu -t cpu -o es -p Host=192.168.2.3 -p Port=9200 \
+```shell
+fluent-bit -i cpu -t cpu -o es -p Host=192.168.2.3 -p Port=9200 \
     -p Index=my_index -p Type=my_type -o stdout -m '*'
 ```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file append the following sections.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
+
+  outputs:
+    - name: es
+      match: '*'
+      host: 192.168.2.3
+      port: 9200
+      index: my_index
+      type: my_type
+```
+
+{% endtab %}
 
-In your main configuration file append the following _Input_ & _Output_ sections. You can visualize this configuration [here](https://link.calyptia.com/qhq)
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [INPUT]
-    Name  cpu
-    Tag   cpu
+  Name  cpu
+  Tag   cpu
 
 [OUTPUT]
-    Name  es
-    Match *
-    Host  192.168.2.3
-    Port  9200
-    Index my_index
-    Type  my_type
+  Name  es
+  Match *
+  Host  192.168.2.3
+  Port  9200
+  Index my_index
+  Type  my_type
 ```
 
-![example configuration visualization from calyptia](../../.gitbook/assets/image%20%282%29.png)
+{% endtab %}
+{% endtabs %}
 
-## About Elasticsearch field names
+## Elasticsearch field names
 
-Some input plugins may generate messages where the field names contains dots, since Elasticsearch 2.0 this is not longer allowed, so the current **es** plugin replaces them with an underscore, e.g:
+Some input plugins can generate messages where the field names contains dots (`.`). For Elasticsearch 2.0, this isn't allowed. The current `es` plugin replaces a dot with an underscore (`_`):
 
 ```text
 {"cpu0.p_cpu"=>17.000000}
@@ -129,129 +162,274 @@ becomes
 {"cpu0_p_cpu"=>17.000000}
 ```
 
-## FAQ
+## Use Fluent Bit ElasticSearch plugin with other services
+
+Connect to Amazon OpenSearch or Elastic Cloud with the ElasticSearch plugin.
+
+### Amazon OpenSearch Service
+
+The Amazon OpenSearch Service adds an extra security layer where HTTP requests must be signed with AWS Sigv4. Fluent Bit v1.5 introduced full support for Amazon OpenSearch Service with IAM Authentication.
+
+See [details](https://github.com/fluent/fluent-bit-docs/tree/43c4fe134611da471e706b0edb2f9acd7cdfdbc3/administration/aws-credentials.md) on how AWS credentials are fetched.
 
-### Elasticsearch rejects requests saying "the final mapping would have more than 1 type" <a id="faq-multiple-types"></a>
+Example configuration:
 
-Since Elasticsearch 6.0, you cannot create multiple types in a single index. This means that you cannot set up your configuration as below anymore.
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: es
+      match: '*'
+      host: vpc-test-domain-ke7thhzoo7jawsrhmm6mb7ite7y.us-west-2.es.amazonaws.com
+      port: 443
+      index: my_index
+      type: my_type
+      aws_auth: on
+      aws_region: us-west-2
+      tls: on
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [OUTPUT]
-    Name  es
-    Match foo.*
-    Index search
-    Type  type1
+  Name  es
+  Match *
+  Host  vpc-test-domain-ke7thhzoo7jawsrhmm6mb7ite7y.us-west-2.es.amazonaws.com
+  Port  443
+  Index my_index
+  Type  my_type
+  AWS_Auth On
+  AWS_Region us-west-2
+  tls     On
+```
+
+{% endtab %}
+{% endtabs %}
+
+Be aware that the `Port` is set to `443`, `tls` is enabled, and `AWS_Region` is set.
+
+### Use Fluent Bit with Elastic Cloud
+
+Fluent Bit supports connecting to [Elastic Cloud](https://www.elastic.co/guide/en/cloud/current/ec-getting-started.html) by providing the `cloud_id` and the `cloud_auth` settings. `cloud_auth` uses the `elastic` user and password provided when the cluster was created. For details refer to the [Cloud ID usage page](https://www.elastic.co/guide/en/cloud/current/ec-cloud-id.html).
+Example configuration:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: es
+      include_tag_key: true
+      tag_key: tags
+      tls: on
+      tls.verify: off
+      cloud_id: 'elastic-obs-deployment:ZXVybxxxxxxxxxxxg=='
+      cloud_auth: 'elastic:2vxxxxxxxxYV'
+```
 
+{% endtab %}
+
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-    Name  es
-    Match bar.*
-    Index search
-    Type  type2
+  Name es
+  Include_Tag_Key true
+  Tag_Key tags
+  tls On
+  tls.verify Off
+  Suppress_Type_Name On
+  cloud_id elastic-obs-deployment:ZXVybxxxxxxxxxxxg==
+  cloud_auth elastic:2vxxxxxxxxYV
 ```
 
-If you see an error message like below, you'll need to fix your configuration to use a single type on each index.
+{% endtab %}
+{% endtabs %}
+
+In Elastic Cloud version 8 and great, the type option must be removed by setting `Suppress_Type_Name On`.
 
-> Rejecting mapping update to \[search\] as the final mapping would have more than 1 type
+Without this you will see errors like:
+
+```text
+{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Action/metadata line [1] contains an unknown parameter [_type]"}],"type":"illegal_argument_exception","reason":"Action/metadata line [1] contains an unknown parameter [_type]"},"status":400}
+```
 
-For details, please read [the official blog post on that issue](https://www.elastic.co/guide/en/elasticsearch/reference/6.7/removal-of-types.html).
+## Troubleshooting
 
-### Elasticsearch rejects requests saying "Document mapping type name can't start with '\_'" <a id="faq-underscore"></a>
+Use the following information to help resolve errors using the ElasticSearch plugin.
 
-Fluent Bit v1.5 changed the default mapping type from `flb_type` to `_doc`, which matches the recommendation from Elasticsearch from version 6.2 forwards \([see commit with rationale](https://github.com/fluent/fluent-bit/commit/04ed3d8104ca8a2f491453777ae6e38e5377817e#diff-c9ae115d3acaceac5efb949edbb21196)\). This doesn't work in Elasticsearch versions 5.6 through 6.1 \([see Elasticsearch discussion and fix](https://discuss.elastic.co/t/cant-use-doc-as-type-despite-it-being-declared-the-preferred-method/113837/9)\). Ensure you set an explicit map \(such as `doc` or `flb_type`\) in the configuration, as seen on the last line:
+### Using multiple types in a single index
+
+Elasticsearch 6.0 can't create multiple types in a single index. An error message like the following indicates you need to update your configuration to use a single type on each index.
 
 ```text
-[OUTPUT]
-    Name  es
-    Match *
-    Host  vpc-test-domain-ke7thhzoo7jawsrhmm6mb7ite7y.us-west-2.es.amazonaws.com
-    Port  443
-    Index my_index
-    AWS_Auth On
-    AWS_Region us-west-2
-    tls   On
-    Type  doc
+Rejecting mapping update to [products] as the final mapping would have more than 1 type:
 ```
 
-### Fluent Bit + Amazon OpenSearch Service <a id="#aws-es"></a>
+This means that you can't set up your configuration like the following:.
 
-The Amazon OpenSearch Service adds an extra security layer where HTTP requests must be signed with AWS Sigv4. Fluent Bit v1.5 introduced full support for Amazon OpenSearch Service with IAM Authentication.
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-See [here](https://github.com/fluent/fluent-bit-docs/tree/43c4fe134611da471e706b0edb2f9acd7cdfdbc3/administration/aws-credentials.md) for details on how AWS credentials are fetched.
+```yaml
+pipeline:
 
-Example configuration:
+  outputs:
+    - name: es
+      match: 'foo.*'
+      index: search
+      type: type1
+
+    - name: es
+      match: 'bar.*'
+      index: search
+      type: type2
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [OUTPUT]
-    Name  es
-    Match *
-    Host  vpc-test-domain-ke7thhzoo7jawsrhmm6mb7ite7y.us-west-2.es.amazonaws.com
-    Port  443
-    Index my_index
-    Type  my_type
-    AWS_Auth On
-    AWS_Region us-west-2
-    tls     On
+  Name  es
+  Match foo.*
+  Index search
+  Type  type1
+
+[OUTPUT]
+  Name  es
+  Match bar.*
+  Index search
+  Type  type2
 ```
 
-Notice that the `Port` is set to `443`, `tls` is enabled, and `AWS_Region` is set.
+{% endtab %}
+{% endtabs %}
 
-### Fluent Bit + Elastic Cloud
+For details, read [the official blog post on that issue](https://www.elastic.co/guide/en/elasticsearch/reference/6.7/removal-of-types.html).
 
-Fluent Bit supports connecting to [Elastic Cloud](https://www.elastic.co/guide/en/cloud/current/ec-getting-started.html) providing just the `cloud_id` and the `cloud_auth` settings.
-`cloud_auth` uses the `elastic` user and password provided when the cluster was created, for details refer to the [Cloud ID usage page](https://www.elastic.co/guide/en/cloud/current/ec-cloud-id.html).
+### Mapping type names can't start with underscores (`_`)
 
-Example configuration:
+Fluent Bit v1.5 changed the default mapping type from `flb_type` to `_doc`, matching the recommendation from Elasticsearch for version 6.2 and greater ([see commit with rationale](https://github.com/fluent/fluent-bit/commit/04ed3d8104ca8a2f491453777ae6e38e5377817e#diff-c9ae115d3acaceac5efb949edbb21196)).
+
+This doesn't work in Elasticsearch versions 5.6 through 6.1 ([discussion and fix](https://discuss.elastic.co/t/cant-use-doc-as-type-despite-it-being-declared-the-preferred-method/113837/9)).
+
+Ensure you set an explicit map such as `doc` or `flb_type` in the configuration, as seen on the last line:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: es
+      match: '*'
+      host: vpc-test-domain-ke7thhzoo7jawsrhmm6mb7ite7y.us-west-2.es.amazonaws.com
+      port: 443
+      index: my_index
+      aws_auth: on
+      aws_region: us-west-2
+      tls: on
+      type: doc
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [OUTPUT]
-    Name es
-    Include_Tag_Key true
-    Tag_Key tags
-    tls On
-    tls.verify Off
-    Suppress_Type_Name On
-    cloud_id elastic-obs-deployment:ZXVybxxxxxxxxxxxg==
-    cloud_auth elastic:2vxxxxxxxxYV
+  Name  es
+  Match *
+  Host  vpc-test-domain-ke7thhzoo7jawsrhmm6mb7ite7y.us-west-2.es.amazonaws.com
+  Port  443
+  Index my_index
+  AWS_Auth On
+  AWS_Region us-west-2
+  tls   On
+  Type  doc
 ```
 
-### Validation Failed: 1: an id must be provided if version type or value are set
+{% endtab %}
+{% endtabs %}
 
-Since v1.8.2, Fluent Bit started using `create` method (instead of `index`) for data submission.
-This makes Fluent Bit compatible with Datastream introduced in Elasticsearch 7.9.
+### Validation failures
 
-If you see `action_request_validation_exception` errors on your pipeline with Fluent Bit >= v1.8.2, you can fix it up by turning on `Generate_ID` as follows:
+In Fluent Bit v1.8.2 and greater, Fluent Bit started using `create` method (instead of `index`) for data submission. This makes Fluent Bit compatible with `Datastream`, introduced in Elasticsearch 7.9. You might see errors like:
 
 ```text
-[OUTPUT]
-    Name es
-    Match *
-    Host  192.168.12.1
-    Generate_ID on
+Validation Failed: 1: an id must be provided if version type or value are set
 ```
 
-### Action/metadata contains an unknown parameter type
+If you see `action_request_validation_exception` errors on your pipeline with Fluent Bit versions greater than v1.8.2, correct them by turning on `Generate_ID` as follows:
 
-Elastic Cloud is now on version 8 so the type option must be removed by setting `Suppress_Type_Name On` as indicated above.
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-Without this you will see errors like:
+```yaml
+pipeline:
+
+  outputs:
+    - name: es
+      match: '*'
+      host: 192.168.12.1
+      generate_id: on
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
-{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Action/metadata line [1] contains an unknown parameter [_type]"}],"type":"illegal_argument_exception","reason":"Action/metadata line [1] contains an unknown parameter [_type]"},"status":400}
+[OUTPUT]
+  Name es
+  Match *
+  Host  192.168.12.1
+  Generate_ID on
 ```
 
-### Logstash_Prefix_Key
+{% endtab %}
+{% endtabs %}
+
+### `Logstash_Prefix_Key`
+
+The following snippet demonstrates using the namespace name as extracted by the `kubernetes` filter as `logstash` prefix:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-The following snippet demonstrates using the namespace name as extracted by the
-`kubernetes` filter as logstash prefix:
+```yaml
+pipeline:
+
+  outputs:
+    - name: es
+      match: '*'
+      # ...
+      logstash_prefix: logstash
+      logstash_prefix_key: $kubernetes['namespace_name']
+      # ...
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [OUTPUT]
-    Name es
-    Match *
-    # ...
-    Logstash_Prefix logstash
-    Logstash_Prefix_Key $kubernetes["namespace_name"]
-    # ...
+  Name es
+  Match *
+  # ...
+  Logstash_Prefix logstash
+  Logstash_Prefix_Key $kubernetes['namespace_name']
+  # ...
 ```
 
-For records that do nor have the field `kubernetes.namespace_name`, the default prefix, `logstash` will be used.
+{% endtab %}
+{% endtabs %}
+
+For records that don't have the field `kubernetes.namespace_name`, the default prefix `logstash` will be used.
diff --git a/pipeline/outputs/file.md b/pipeline/outputs/file.md
index 5dde1b862..1ed5ab901 100644
--- a/pipeline/outputs/file.md
+++ b/pipeline/outputs/file.md
@@ -1,73 +1,93 @@
 # File
 
-The **file** output plugin allows to write the data received through the _input_ plugin to file.
+The _File_ output plugin lets you write the data received through the input plugin to file.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
 | Key | Description | Default |
 | :--- | :--- | :--- |
-| Path | Directory path to store files. If not set, Fluent Bit will write the files on it's own positioned directory. note: this option was added on Fluent Bit v1.4.6 |
-| File | Set file name to store the records. If not set, the file name will be the _tag_ associated with the records. |
-| Format | The format of the file content. See also Format section. Default: out\_file. |
-| Mkdir | Recursively create output directory if it does not exist. Permissions set to 0755. |
-| Workers | Enables dedicated thread(s) for this output. Default value is set since version 1.8.13. For previous versions is 0. | 1 |
+| `Path` | Directory path to store files. If not set, Fluent Bit will write the files on it's own positioned directory. Available in Fluent Bit 1.4.6 and later. | _none_ |
+| `File` | Set filename to store the records. If not set, the filename will be the `tag` associated with the records. | _none_ |
+| `Format` | The [format](#format) of the file content. | `out_file` |
+| `Mkdir` | Recursively create output directory if it doesn't exist. Permissions set to `0755`. | _none_ |
+| `Workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `1` |
 
 ## Format
 
-### out\_file format
+This plugin uses the following formats:
 
-Output time, tag and json records. There is no configuration parameters for out\_file.
+### `out_file`
 
-```javascript
+Output `time`, `tag`, and `json` records. There are no configuration parameters for `out_file`.
+
+```text
 tag: [time, {"key1":"value1", "key2":"value2", "key3":"value3"}]
 ```
 
-### plain format
+### Plain
 
-Output the records as JSON \(without additional `tag` and `timestamp` attributes\). There is no configuration parameters for plain format.
+Output the records as JSON (without additional `tag` and `timestamp` attributes). There are no configuration parameters for plain format.
 
-```javascript
+```json
 {"key1":"value1", "key2":"value2", "key3":"value3"}
 ```
 
-### csv format
+### CSV
 
-Output the records as csv. Csv supports an additional configuration parameter.
+Output the records in CSV format. CSV mode supports an additional configuration parameter.
 
 | Key | Description |
 | :--- | :--- |
-| Delimiter | The character to separate each data. Accepted values are "\t" (or "tab"), "space" or "comma". Other values are ignored and will use default silently. Default: ',' |
+| `Delimiter` | The character to separate each data. Accepted values: `\t` (or `tab`), ` ` (`space`), or `,` (`comma`). Other values are ignored and will use default silently. Default: `,` |
 
-```python
+```text
 time[delimiter]"value1"[delimiter]"value2"[delimiter]"value3"
 ```
 
-### ltsv format
+### LTSV
 
-Output the records as LTSV. LTSV supports an additional configuration parameter.
+Output the records in LTSV format. LTSV mode supports an additional configuration parameter.
 
 | Key | Description |
 | :--- | :--- |
-| Delimiter | The character to separate each pair. Default: '\t'\(TAB\) |
-| Label\_Delimiter | The character to separate label and the value. Default: ':' |
+| `Delimiter` | The character to separate each pair. Default: `t` (`TAB`) |
+| `Label_Delimiter` | The character to separate label and the value. Default: `:` |
 
-```python
+```text
 field1[label_delimiter]value1[delimiter]field2[label_delimiter]value2\n
 ```
 
-### template format
+### Template
 
 Output the records using a custom format template.
 
 | Key | Description |
 | :--- | :--- |
-| Template | The format string. Default: '{time} {message}' |
+| Template | The format string. Default: `{time} {message}` |
 
 This accepts a formatting template and fills placeholders using corresponding values in a record.
 
-For example, if you set up the configuration as below:
+For example, if you set up the configuration like the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: mem
+
+  outputs:
+    - name: file
+      match: '*'
+      format: template
+      template: '{time} used={Mem.used} free={Mem.free} total={Mem.total}'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
@@ -75,40 +95,64 @@ For example, if you set up the configuration as below:
 
 [OUTPUT]
   Name file
+  Match *
   Format template
   Template {time} used={Mem.used} free={Mem.free} total={Mem.total}
 ```
 
+{% endtab %}
+{% endtabs %}
+
 You will get the following output:
 
 ```text
 1564462620.000254 used=1045448 free=31760160 total=32805608
 ```
 
-## Getting Started
+## Get started
 
-You can run the plugin from the command line or through the configuration file:
+You can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
 From the command line you can let Fluent Bit count up a data with the following options:
 
-```bash
-$ fluent-bit -i cpu -o file -p path=output.txt
+```shell
+fluent-bit -i cpu -o file -p path=output.txt
 ```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file append the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-In your main configuration file append the following Input & Output sections:
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
 
-```python
+  outputs:
+    - name: file
+      match: '*'
+      path: output_dir
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name cpu
-    Tag  cpu
+  Name cpu
+  Tag  cpu
 
 [OUTPUT]
-    Name file
-    Match *
-    Path output_dir
+  Name  file
+  Match *
+  Path  output_dir
 ```
 
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/outputs/firehose.md b/pipeline/outputs/firehose.md
index e896610c9..924e84ddb 100644
--- a/pipeline/outputs/firehose.md
+++ b/pipeline/outputs/firehose.md
@@ -4,88 +4,132 @@ description: Send logs to Amazon Kinesis Firehose
 
 # Amazon Kinesis Data Firehose
 
-![](../../.gitbook/assets/image%20%288%29.png)
+The _Amazon Kinesis Data Firehose_ output plugin lets you ingest your records into the [Firehose](https://aws.amazon.com/kinesis/data-firehose/) service.
 
-The Amazon Kinesis Data Firehose output plugin allows to ingest your records into the [Firehose](https://aws.amazon.com/kinesis/data-firehose/) service.
+This is the documentation for the core Fluent Bit Firehose plugin written in C. It can replace the [aws/amazon-kinesis-firehose-for-fluent-bit](https://github.com/aws/amazon-kinesis-firehose-for-fluent-bit) Golang Fluent Bit plugin. The Golang plugin was named `firehose`. This new Firehose plugin is called `kinesis_firehose` to prevent conflicts/confusion.
 
-This is the documentation for the core Fluent Bit Firehose plugin written in C. It can replace the [aws/amazon-kinesis-firehose-for-fluent-bit](https://github.com/aws/amazon-kinesis-firehose-for-fluent-bit) Golang Fluent Bit plugin released last year. The Golang plugin was named `firehose`; this new high performance and highly efficient firehose plugin is called `kinesis_firehose` to prevent conflicts/confusion.
+See [AWS credentials](https://docs.fluentbit.io/manual/administration/aws-credentials) for details on how AWS credentials are fetched.
 
-See [here](https://github.com/fluent/fluent-bit-docs/tree/43c4fe134611da471e706b0edb2f9acd7cdfdbc3/administration/aws-credentials.md) for details on how AWS credentials are fetched.
+## Configuration parameters
 
-## Configuration Parameters
+This plugin uses the following configuration parameters:
 
-| Key | Description |
-| :--- | :--- |
-| region | The AWS region. |
-| delivery\_stream | The name of the Kinesis Firehose Delivery stream that you want log records sent to. |
-| time\_key | Add the timestamp to the record under this key. By default the timestamp from Fluent Bit will not be added to records sent to Kinesis. |
-| time\_key\_format | strftime compliant format string for the timestamp; for example, the default is '%Y-%m-%dT%H:%M:%S'. Supports millisecond precision with '%3N' and supports nanosecond precision with '%9N' and '%L'; for example, adding '%3N' to support millisecond '%Y-%m-%dT%H:%M:%S.%3N'. This option is used with time\_key. |
-| log\_key | By default, the whole log record will be sent to Firehose. If you specify a key name with this option, then only the value of that key will be sent to Firehose. For example, if you are using the Fluentd Docker log driver, you can specify `log_key log` and only the log message will be sent to Firehose. |
-| compression | Compression type for Firehose records. Each log record is individually compressed and sent to Firehose. 'gzip' and 'arrow' are the supported values. 'arrow' is only an available if Apache Arrow was enabled at compile time. Defaults to no compression. |
-| role\_arn | ARN of an IAM role to assume \(for cross account access\). |
-| endpoint | Specify a custom endpoint for the Firehose API. |
-| sts\_endpoint | Custom endpoint for the STS API. |
-| auto\_retry\_requests | Immediately retry failed requests to AWS services once. This option does not affect the normal Fluent Bit retry mechanism with backoff. Instead, it enables an immediate retry with no delay for networking errors, which may help improve throughput when there are transient/random networking issues. This option defaults to `true`. |
-| external\_id | Specify an external ID for the STS API, can be used with the role_arn parameter if your role requires an external ID. |
-| profile | AWS profile name to use. Defaults to `default`. |
+| Key | Description | Default |
+| :--- | :--- | --------- |
+| `region` | The AWS region . | _none_ |
+| `delivery_stream` | The name of the Kinesis Firehose Delivery stream that you want log records sent to. | _none_ |
+| `time_key` | Add the timestamp to the record under this key. By default, the timestamp from Fluent Bit won't be added to records sent to Kinesis. | _none_ |
+| `time_key_format` | strftime compliant format string for the timestamp; for example, the default is `%Y-%m-%dT%H:%M:%S`. Supports millisecond precision with `%3N` and nanosecond precision with `%9N` and `%L`. For example, adding `%3N` to support millisecond `%Y-%m-%dT%H:%M:%S.%3N`. This option is used with `time_key`. | _none_ |
+| `log_key` | By default, the whole log record will be sent to Firehose. If you specify a key name with this option, then only the value of that key will be sent to Firehose. For example, if you are using the Fluentd Docker log driver, you can specify `log_key log` and only the log message will be sent to Firehose. | _none_ |
+| `compression` | Compression type for Firehose records. Each log record is individually compressed and sent to Firehose. Supported values: `gzip`. `arrow`. `arrow` is only an available if Apache Arrow was enabled at compile time. Defaults to no compression. | _none_ |
+| `role_arn` | ARN of an IAM role to assume (for cross account access`). | _none_ |
+| `endpoint` | Specify a custom endpoint for the Firehose API. | _none_ |
+| `sts_endpoint` | Custom endpoint for the STS API. | _none_ |
+| `auto_retry_requests` | Immediately retry failed requests to AWS services once. This option doesn't affect the normal Fluent Bit retry mechanism with backoff. Instead, it enables an immediate retry with no delay for networking errors, which can help improve throughput when there are transient/random networking issues. | `true` |
+| `external_id` | Specify an external ID for the STS API. Can be used with the `role_arn` parameter if your role requires an external ID. | _none_ |
+| `profile` | AWS profile name to use. | `default` |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. |  `1` |
 
-## Getting Started
+## Get started
 
-In order to send records into Amazon Kinesis Data Firehose, you can run the plugin from the command line or through the configuration file:
+To send records into Amazon Kinesis Data Firehose, you can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-The **firehose** plugin, can read the parameters from the command line through the **-p** argument \(property\), e.g:
+The Firehose plugin can read the parameters from the command line through the `-p` argument (property).
 
-```text
-$ fluent-bit -i cpu -o kinesis_firehose -p delivery_stream=my-stream -p region=us-west-2 -m '*' -f 1
+```shell
+fluent-bit -i cpu -o kinesis_firehose -p delivery_stream=my-stream -p region=us-west-2 -m '*' -f 1
 ```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file append the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: kinesis_firehose
+      match: '*'
+      region: us-east-1
+      delivery_stream: my-stream
+```
 
-In your main configuration file append the following _Output_ section:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [OUTPUT]
-    Name  kinesis_firehose
-    Match *
-    region us-east-1
-    delivery_stream my-stream
+  Name  kinesis_firehose
+  Match *
+  region us-east-1
+  delivery_stream my-stream
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ### Permissions
 
 The following AWS IAM permissions are required to use this plugin:
 
-```
+```json
 {
-	"Version": "2012-10-17",
-	"Statement": [{
-		"Effect": "Allow",
-		"Action": [
-			"firehose:PutRecordBatch"
-		],
-		"Resource": "*"
-	}]
+  "Version": "2012-10-17",
+  "Statement": [{
+    "Effect": "Allow",
+	"Action": [
+      "firehose:PutRecordBatch"
+    ],
+    "Resource": "*"
+  }]
 }
 ```
 
 ### Worker support
 
-Fluent Bit 1.7 adds a new feature called `workers` which enables outputs to have dedicated threads. This `kinesis_firehose` plugin fully supports workers.
+Fluent Bit 1.7 added a new feature called `workers` which enables outputs to have dedicated threads. This `kinesis_firehose` plugin fully supports workers.
 
 Example:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: kinesis_firehose
+      match: '*'
+      region: us-east-1
+      delivery_stream: my-stream
+      workers: 2
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
 ```text
 [OUTPUT]
-    Name  kinesis_firehose
-    Match *
-    region us-east-1
-    delivery_stream my-stream
-    workers 2
+  Name  kinesis_firehose
+  Match *
+  region us-east-1
+  delivery_stream my-stream
+  workers 2
 ```
 
-If you enable a single worker, you are enabling a dedicated thread for your Firehose output. We recommend starting with without workers, evaluating the performance, and then adding workers one at a time until you reach your desired/needed throughput. For most users, no workers or a single worker will be sufficient.
+{% endtab %}
+{% endtabs %}
+
+{% hint style="info" %}
+
+If you enable a single worker, you are enabling a dedicated thread for your Firehose output. Fluent Bit recommends starting with without workers, evaluating the performance, and then adding workers one at a time until you reach your desired/needed throughput. For most users, no workers or a single worker will be sufficient.
+
+{% endhint %}
 
 ### AWS for Fluent Bit
 
@@ -99,21 +143,21 @@ Amazon distributes a container image with Fluent Bit and these plugins.
 
 [aws-for-fluent-bit](https://gallery.ecr.aws/aws-observability/aws-for-fluent-bit)
 
-Our images are available in Amazon ECR Public Gallery. You can download images with different tags by following command:
+Fluent Bit images are available in Amazon ECR Public Gallery. You can download images with different tags by following command:
 
-```text
+```shell
 docker pull public.ecr.aws/aws-observability/aws-for-fluent-bit:<tag>
 ```
 
 For example, you can pull the image with latest version by:
 
-```text
+```shell
 docker pull public.ecr.aws/aws-observability/aws-for-fluent-bit:latest
 ```
 
 If you see errors for image pull limits, try log into public ECR with your AWS credentials:
 
-```text
+```shell
 aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
 ```
 
@@ -125,11 +169,10 @@ You can check the [Amazon ECR Public official doc](https://docs.aws.amazon.com/A
 
 #### Amazon ECR
 
-You can use our SSM Public Parameters to find the Amazon ECR image URI in your region:
+You can use Fluent Bit SSM Public Parameters to find the Amazon ECR image URI in your region:
 
-```text
+```shell
 aws ssm get-parameters-by-path --path /aws/service/aws-for-fluent-bit/
 ```
 
-For more see [the AWS for Fluent Bit github repo](https://github.com/aws/aws-for-fluent-bit#public-images).
-
+For more see [the AWS for Fluent Bit GitHub repository](https://github.com/aws/aws-for-fluent-bit#public-images).
diff --git a/pipeline/outputs/flowcounter.md b/pipeline/outputs/flowcounter.md
index 69bc75ebd..ec36b5ce2 100644
--- a/pipeline/outputs/flowcounter.md
+++ b/pipeline/outputs/flowcounter.md
@@ -1,55 +1,70 @@
-# FlowCounter
+# Flow counter
 
-_FlowCounter_ is the protocol to count records. The **flowcounter** output plugin allows to count up records and its size.
+The _Flow counter_ output plugin lets you count up records and their size.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
 | Key | Description | Default |
 | :--- | :--- | :--- |
-| Unit | The unit of duration. \(second/minute/hour/day\) | minute |
+| `Unit` | The unit of duration. Allowed values: `second`, `minute`, `hour`, `day` | `minute` |
+| `Workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
-## Getting Started
+## Get started
 
-You can run the plugin from the command line or through the configuration file:
+You can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-From the command line you can let Fluent Bit count up a data with the following options:
+From the command line you can let Fluent Bit count up data with the following options:
 
-```bash
-$ fluent-bit -i cpu -o flowcounter
+```shell
+fluent-bit -i cpu -o flowcounter
 ```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following Input & Output sections:
+In your main configuration file append the following:
 
-```python
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
+
+  outputs:
+    - name: flowcounter
+      match: '*'
+      unit: second
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name cpu
-    Tag  cpu
+  Name cpu
+  Tag  cpu
 
 [OUTPUT]
-    Name flowcounter
-    Match *
-    Unit second
+  Name  flowcounter
+  Match *
+  Unit second
 ```
 
-## Testing
+{% endtab %}
+{% endtabs %}
 
-Once Fluent Bit is running, you will see the reports in the output interface similar to this:
+## Testing
 
-```bash
-$ fluent-bit -i cpu -o flowcounter  
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+When Fluent Bit is running, you will see the reports in the output interface similar to this:
 
-[2016/12/23 11:01:20] [ info] [engine] started
+```text
+...
 [out_flowcounter] cpu.0:[1482458540, {"counts":60, "bytes":7560, "counts/minute":1, "bytes/minute":126 }]
+...
 ```
-
diff --git a/pipeline/outputs/forward.md b/pipeline/outputs/forward.md
index 4e6d297f3..ea0a330fd 100644
--- a/pipeline/outputs/forward.md
+++ b/pipeline/outputs/forward.md
@@ -1,56 +1,57 @@
 # Forward
 
-_Forward_ is the protocol used by [Fluentd](http://www.fluentd.org) to route messages between peers. The **forward** output plugin provides interoperability between [Fluent Bit](http://fluentbit.io) and [Fluentd](http://fluentd.org).
+_Forward_ is the protocol used by [Fluentd](http://www.fluentd.org) to route messages between peers. The `forward` output plugin provides interoperability between [Fluent Bit](http://fluentbit.io) and [Fluentd](http://fluentd.org).
+
 There are no configuration steps required besides specifying where [Fluentd](http://fluentd.org) is located, which can be a local or a remote destination.
 
-This plugin offers two different transports and modes:
+This plugin offers the following transports and modes:
 
-* Forward (TCP): It uses a plain TCP connection.
-* Secure Forward (TLS): when TLS is enabled, the plugin switch to Secure Forward mode.
+- Forward (TCP): Uses a plain TCP connection.
+- Secure Forward (TLS): When TLS is enabled, the plugin switches to Secure Forward mode.
 
-## Configuration Parameters
+## Configuration parameters
 
-The following parameters are mandatory for either Forward for Secure Forward modes:
+The following parameters are mandatory for both Forward and Secure Forward modes:
 
-| Key                  | Description                                                                                                                                                                                                                                                                                         | Default   |
-| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
-| Host                 | Target host where Fluent-Bit or Fluentd are listening for Forward messages.                                                                                                                                                                                                                         | 127.0.0.1 |
-| Port                 | TCP Port of the target service.                                                                                                                                                                                                                                                                     | 24224     |
-| Time_as_Integer      | Set timestamps in integer format, it enable compatibility mode for Fluentd v0.12 series.                                                                                                                                                                                                            | False     |
-| Upstream             | If Forward will connect to an _Upstream_ instead of a simple host, this property defines the absolute path for the Upstream configuration file, for more details about this refer to the [Upstream Servers ](../../administration/configuring-fluent-bit/classic-mode/upstream-servers.md)documentation section. |           |
-| Unix_Path            | Specify the path to unix socket to send a Forward message. If set, `Upstream` is ignored.   |           |
-| Tag                  | Overwrite the tag as we transmit. This allows the receiving pipeline start fresh, or to attribute source.                                                                                                                                                                                           |           |
-| Send_options         | Always send options (with "size"=count of messages)                                                                                                                                                                                                                                                 | False     |
-| Require_ack_response | Send "chunk"-option and wait for "ack" response from server. Enables at-least-once and receiving server can control rate of traffic. (Requires Fluentd v0.14.0+ server)                                                                                                                             | False     |
-| Compress             | Set to "gzip" to enable gzip compression. Incompatible with Time_as_Integer=True and tags set dynamically using the [Rewrite Tag](https://app.gitbook.com/s/-LKKSx-3LBTCtaHbg0gl-887967055/pipeline/filters/rewrite-tag.md) filter. (Requires Fluentd v0.14.7+ server)                              |           |
-| Workers | Enables dedicated thread(s) for this output. Default value is set since version 1.8.13. For previous versions is 0. | 2 |
+| Key | Description | Default   |
+| --- | ------------ | --------- |
+| `Host` | Target host where Fluent Bit or Fluentd are listening for Forward messages. | `127.0.0.1` |
+| `Port` | TCP Port of the target service. | `24224` |
+| `Time_as_Integer` | Set timestamps in integer format, it enables compatibility mode for Fluentd v0.12 series. | `False` |
+| `Upstream` | If Forward will connect to an `Upstream` instead of a basic host, this property defines the absolute path for the Upstream configuration file, for more details about this, see [Upstream Servers ](../../administration/configuring-fluent-bit/classic-mode/upstream-servers.md). | _none_ |
+| `Unix_Path` | Specify the path to a Unix socket to send a Forward message. If set, `Upstream` is ignored.   | _none_ |
+| `Tag` | Overwrite the tag as Fluent Bit transmits. This allows the receiving pipeline start fresh, or to attribute a source.  |  _none_ |
+| `Send_options` | Always send options (with `"size"=count of messages`) | `False` |
+| `Require_ack_response` | Send `chunk` option and wait for an `ack` response from the server. Enables at-least-once and receiving server can control rate of traffic. Requires Fluentd v0.14.0+ or later | `False` |
+| `Compress` | Set to `gzip` to enable gzip compression. Incompatible with `Time_as_Integer=True` and tags set dynamically using the [Rewrite Tag](../filters/rewrite-tag.md) filter. Requires Fluentd server v0.14.7 or later. |  _none_  |
+| `Workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `2` |
 
-## Secure Forward Mode Configuration Parameters
+## Secure Forward mode configuration parameters
 
-When using Secure Forward mode, the [TLS](../../administration/transport-security.md) mode requires to be enabled. The following additional configuration parameters are available:
+When using Secure Forward mode, the [TLS](../../administration/transport-security.md) mode must be enabled. The following additional configuration parameters are available:
 
-| Key              | Description                                                                                                                               | Default   |
-| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | --------- |
-| Shared_Key       | A key string known by the remote Fluentd used for authorization.                                                                          |           |
-| Empty_Shared_Key | Use this option to connect to Fluentd with a zero-length secret.                                                                          | False     |
-| Username         | Specify the username to present to a Fluentd server that enables `user_auth`.                                                             |           |
-| Password         | Specify the password corresponding to the username.                                                                                       |           |
-| Self_Hostname    | Default value of the auto-generated certificate common name (CN).                                                                         | localhost |
-| tls              | Enable or disable TLS support                                                                                                             | Off       |
-| tls.verify       | Force certificate validation                                                                                                              | On        |
-| tls.debug        | Set TLS debug verbosity level. It accept the following values: 0 (No debug), 1 (Error), 2 (State change), 3 (Informational) and 4 Verbose | 1         |
-| tls.ca_file      | Absolute path to CA certificate file                                                                                                      |           |
-| tls.crt_file     | Absolute path to Certificate file.                                                                                                        |           |
-| tls.key_file     | Absolute path to private Key file.                                                                                                        |           |
-| tls.key_passwd   | Optional password for tls.key_file file.                                                                                                  |           |
+| Key | Description | Default |
+| --- | ----------- | ------- |
+| `Shared_Key` | A key string known by the remote Fluentd used for authorization. |  _none_ |
+| `Empty_Shared_Key` | Use this option to connect to Fluentd with a zero-length secret. | `False` |
+| `Username` | Specify the username to present to a Fluentd server that enables `user_auth`. | _none_ |
+| `Password` | Specify the password corresponding to the username. | _none_ |
+| `Self_Hostname` | Default value of the auto-generated certificate common name (CN). | `localhost` |
+| `tls` | Enable or disable TLS support. | `Off` |
+| `tls.verify` | Force certificate validation. | `On` |
+| `tls.debug` | Set TLS debug verbosity level. Allowed values: `0` (No debug), `1` (Error), `2` (State change), `3` (Informational), and `4` (Verbose). | `1` |
+| `tls.ca_file` | Absolute path to CA certificate file. | _none_ |
+| `tls.crt_file` | Absolute path to Certificate file. | _none_ |
+| `tls.key_file` | Absolute path to private Key file. | _none_ |
+| `tls.key_passwd` | Optional password for `tls.key_file`. | _none_ |
 
-## Forward Setup
+## Forward setup
 
-Before proceeding, make sure that [Fluentd](http://fluentd.org) is installed, if it's not the case please refer to the following [Fluentd Installation](http://docs.fluentd.org/v0.12/categories/installation) document and go ahead with that.
+Before proceeding, ensure that [Fluentd](http://fluentd.org) is installed. If it's not, refer to the [Fluentd Installation](http://docs.fluentd.org/installation) document.
 
-Once [Fluentd](http://fluentd.org) is installed, create the following configuration file example that will allow us to stream data into it:
+After installing Fluentd, create the following configuration file example which lets you to stream data into it:
 
-```
+```text
 <source>
   type forward
   bind 0.0.0.0
@@ -62,15 +63,22 @@ Once [Fluentd](http://fluentd.org) is installed, create the following configurat
 </match>
 ```
 
-That configuration file specifies that it will listen for _TCP_ connections on the port _24224_ through the **forward** input type.
-Then for every message with a _fluent_bit_ **TAG**, will print the message to the standard output.
+That configuration file specifies that it will listen for TCP connections on port `24224` through the `forward` input type.
 
-In one terminal launch [Fluentd](http://fluentd.org) specifying the new configuration file created:
+Every message with a `fluent_bit` tag will print a message to the standard output.
 
-```bash
-$ fluentd -c test.conf
+In one terminal, launch Fluentd while specifying the new configuration file created:
+
+```shell
+fluentd -c test.conf
+```
+
+Which should return a response similar to the following:
+
+```text
+...
 2017-03-23 11:50:43 -0600 [info]: reading config file path="test.conf"
-2017-03-23 11:50:43 -0600 [info]: starting fluentd-0.12.33
+...
 2017-03-23 11:50:43 -0600 [info]: gem 'fluent-mixin-config-placeholders' version '0.3.1'
 2017-03-23 11:50:43 -0600 [info]: gem 'fluent-plugin-docker' version '0.1.0'
 2017-03-23 11:50:43 -0600 [info]: gem 'fluent-plugin-elasticsearch' version '1.4.0'
@@ -98,72 +106,105 @@ $ fluentd -c test.conf
   </match>
 </ROOT>
 2017-03-23 11:50:43 -0600 [info]: listening fluent socket on 0.0.0.0:24224
+...
 ```
 
-## Fluent Bit + Forward Setup <a href="forward_setup" id="forward_setup"></a>
+## Fluent Bit and Forward setup
 
-Now that [Fluentd](http://fluentd.org) is ready to receive messages, we need to specify where the **forward** output plugin will flush the information using the following format:
+When Fluentd is ready to receive messages, specify where the `forward` output plugin will flush the information using the following format:
 
-```
-bin/fluent-bit -i INPUT -o forward://HOST:PORT
+```shell
+fluent-bit -i INPUT -o forward://HOST:PORT
 ```
 
-If the **TAG** parameter is not set, the plugin will retain the tag.
-Keep in mind that **TAG** is important for routing rules inside [Fluentd](http://fluentd.org).
+If the `tag` parameter isn't set, the plugin will retain the tag. The `tag` is important for routing rules inside Fluentd.
 
-Using the [CPU](../inputs/cpu-metrics.md) input plugin as an example we will flush CPU metrics to [Fluentd](http://fluentd.org) with tag _fluent_bit_:
+Using the [CPU](../inputs/cpu-metrics.md) input plugin as an example, you can flush `cpu` metrics with the `tag` `fluent_bit` to Fluentd:
 
-```bash
-$ bin/fluent-bit -i cpu -t fluent_bit -o forward://127.0.0.1:24224
+```shell
+fluent-bit -i cpu -t fluent_bit -o forward://127.0.0.1:24224
 ```
 
-Now on the [Fluentd](http://fluentd.org) side, you will see the CPU metrics gathered in the last seconds:
+In Fluentd, you will see the CPU metrics gathered in the last seconds:
 
-```bash
+```text
+...
 2017-03-23 11:53:06 -0600 fluent_bit: {"cpu_p":0.0,"user_p":0.0,"system_p":0.0,"cpu0.p_cpu":0.0,"cpu0.p_user":0.0,"cpu0.p_system":0.0,"cpu1.p_cpu":0.0,"cpu1.p_user":0.0,"cpu1.p_system":0.0,"cpu2.p_cpu":0.0,"cpu2.p_user":0.0,"cpu2.p_system":0.0,"cpu3.p_cpu":1.0,"cpu3.p_user":1.0,"cpu3.p_system":0.0}
 2017-03-23 11:53:07 -0600 fluent_bit: {"cpu_p":2.25,"user_p":2.0,"system_p":0.25,"cpu0.p_cpu":3.0,"cpu0.p_user":3.0,"cpu0.p_system":0.0,"cpu1.p_cpu":1.0,"cpu1.p_user":1.0,"cpu1.p_system":0.0,"cpu2.p_cpu":1.0,"cpu2.p_user":1.0,"cpu2.p_system":0.0,"cpu3.p_cpu":3.0,"cpu3.p_user":2.0,"cpu3.p_system":1.0}
 2017-03-23 11:53:08 -0600 fluent_bit: {"cpu_p":1.75,"user_p":1.0,"system_p":0.75,"cpu0.p_cpu":2.0,"cpu0.p_user":1.0,"cpu0.p_system":1.0,"cpu1.p_cpu":3.0,"cpu1.p_user":1.0,"cpu1.p_system":2.0,"cpu2.p_cpu":3.0,"cpu2.p_user":2.0,"cpu2.p_system":1.0,"cpu3.p_cpu":2.0,"cpu3.p_user":1.0,"cpu3.p_system":1.0}
 2017-03-23 11:53:09 -0600 fluent_bit: {"cpu_p":4.75,"user_p":3.5,"system_p":1.25,"cpu0.p_cpu":4.0,"cpu0.p_user":3.0,"cpu0.p_system":1.0,"cpu1.p_cpu":5.0,"cpu1.p_user":4.0,"cpu1.p_system":1.0,"cpu2.p_cpu":3.0,"cpu2.p_user":2.0,"cpu2.p_system":1.0,"cpu3.p_cpu":5.0,"cpu3.p_user":4.0,"cpu3.p_system":1.0}
+...
 ```
 
-So we gathered [CPU](../inputs/cpu-metrics.md) metrics and flushed them out to [Fluentd](http://fluentd.org) properly.
+This shows that [CPU](../inputs/cpu-metrics.md) metrics were gathered and flushed out to Fluentd properly.
 
-## Fluent Bit + Secure Forward Setup <a href="secure_forward_setup" id="secure_forward_setup"></a>
+## Fluent Bit and Secure Forward setup
 
-> DISCLAIMER: the following example does not consider the generation of certificates for best practice on production environments.
+The following example doesn't consider the generation of certificates for best practice on production environments.
 
-Secure Forward aims to provide a secure channel of communication with the remote Fluentd service using [TLS](../../administration/transport-security.md).
+Secure Forward provides a secure channel of communication with the remote Fluentd service using [TLS](../../administration/transport-security.md).
 
 ### Fluent Bit
 
-Paste this content in a file called _flb.conf_:
-
+Paste this content in a file called `flb` :
+
+{% tabs %}
+{% tab title="flb.yaml" %}
+
+```yaml
+service:
+  flush: 5
+  daemon: off
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu_usage
+
+  outputs:
+    - name: forward
+      match: '*'
+      host: 127.0.0.1
+      port: 24284
+      shared_key: secret
+      self_hostname: flb.local
+      tls: on
+      tls.verify: off
 ```
+
+{% endtab %}
+{% tab title="flb.conf" %}
+
+```text
 [SERVICE]
-    Flush      5
-    Daemon     off
-    Log_Level  info
+  Flush      5
+  Daemon     off
+  Log_Level  info
 
 [INPUT]
-    Name       cpu
-    Tag        cpu_usage
+  Name       cpu
+  Tag        cpu_usage
 
 [OUTPUT]
-    Name          forward
-    Match         *
-    Host          127.0.0.1
-    Port          24284
-    Shared_Key    secret
-    Self_Hostname flb.local
-    tls           on
-    tls.verify    off
+  Name          forward
+  Match         *
+  Host          127.0.0.1
+  Port          24284
+  Shared_Key    secret
+  Self_Hostname flb.local
+  tls           on
+  tls.verify    off
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ### Fluentd
 
-Paste this content in a file called _fld.conf_:
+Paste this content in a file called `fld.conf`:
 
-```
+```text
 <source>
   @type         secure_forward
   self_hostname myserver.local
@@ -176,45 +217,28 @@ Paste this content in a file called _fld.conf_:
 </match>
 ```
 
-If you're using Fluentd v1, set up it as below:
+### Test communication
 
-```
-<source>
-  @type forward
-  <transport tls>
-    cert_path /etc/td-agent/certs/fluentd.crt
-    private_key_path /etc/td-agent/certs/fluentd.key
-    private_key_passphrase password
-  </transport>
-  <security>
-    self_hostname myserver.local
-    shared_key secret
-  </security>
-</source>
+1. Start Fluentd:
 
-<match **>
- @type stdout
-</match>
-```
+   ```shell
+   fluentd -c fld.conf
+   ```
 
-### Test Communication
+1. Start Fluent Bit:
 
-Start Fluentd:
+   ```shell
+   # For YAML configuration.
+   fluent-bit --config flb.yaml
 
-```
-$ fluentd -c fld.conf
-```
-
-Start Fluent Bit:
-
-```
-$ fluent-bit -c flb.conf
-```
+   # For classic configuration
+   fluent-bit --config flb.conf
+   ```
 
-After five seconds, Fluent Bit will write records to Fluentd.
-In Fluentd output you will see a message like this:
+After five seconds, Fluent Bit will write records to Fluentd. In Fluentd output you will see a message like this:
 
-```
+```text
+...
 2017-03-23 13:34:40 -0600 [info]: using configuration file: <ROOT>
   <source>
     @type secure_forward
@@ -230,4 +254,5 @@ In Fluentd output you will see a message like this:
 2017-03-23 13:34:42 -0600 cpu_usage: {"cpu_p":1.75,"user_p":1.75,"system_p":0.0,"cpu0.p_cpu":3.0,"cpu0.p_user":3.0,"cpu0.p_system":0.0,"cpu1.p_cpu":2.0,"cpu1.p_user":2.0,"cpu1.p_system":0.0,"cpu2.p_cpu":0.0,"cpu2.p_user":0.0,"cpu2.p_system":0.0,"cpu3.p_cpu":1.0,"cpu3.p_user":1.0,"cpu3.p_system":0.0}
 2017-03-23 13:34:43 -0600 cpu_usage: {"cpu_p":1.75,"user_p":1.25,"system_p":0.5,"cpu0.p_cpu":3.0,"cpu0.p_user":3.0,"cpu0.p_system":0.0,"cpu1.p_cpu":2.0,"cpu1.p_user":2.0,"cpu1.p_system":0.0,"cpu2.p_cpu":0.0,"cpu2.p_user":0.0,"cpu2.p_system":0.0,"cpu3.p_cpu":1.0,"cpu3.p_user":0.0,"cpu3.p_system":1.0}
 2017-03-23 13:34:44 -0600 cpu_usage: {"cpu_p":5.0,"user_p":3.25,"system_p":1.75,"cpu0.p_cpu":4.0,"cpu0.p_user":2.0,"cpu0.p_system":2.0,"cpu1.p_cpu":8.0,"cpu1.p_user":5.0,"cpu1.p_system":3.0,"cpu2.p_cpu":4.0,"cpu2.p_user":3.0,"cpu2.p_system":1.0,"cpu3.p_cpu":4.0,"cpu3.p_user":2.0,"cpu3.p_system":2.0}
+...
 ```
diff --git a/pipeline/outputs/gelf.md b/pipeline/outputs/gelf.md
index ee115ec10..7bef1bb1c 100644
--- a/pipeline/outputs/gelf.md
+++ b/pipeline/outputs/gelf.md
@@ -1,49 +1,116 @@
-# GELF
+# Graylog Extended Log Format (GELF)
 
-**GELF** is [Graylog](https://www.graylog.org) Extended Log Format. The GELF output plugin allows to send logs in GELF format directly to a Graylog input using TLS, TCP or UDP protocols.
+The _[Graylog](https://www.graylog.org) Extended Log Format (GELF)_ output plugin lets you send logs in GELF format directly to a Graylog input using TLS, TCP, or UDP protocols.
 
-The following instructions assumes that you have a fully operational Graylog server running in your environment.
+The following instructions assume that you have a fully operational Graylog server running in your environment.
 
-## Configuration Parameters
+## Configuration parameters
 
-According to [GELF Payload Specification](https://go2docs.graylog.org/5-0/getting_in_log_data/gelf.html?Highlight=Payload#GELFPayloadSpecification), there are some mandatory and optional fields which are used by Graylog in GELF format. These fields are determined with _Gelf\\_\*\_Key\_ key in this plugin.
+According to the [GELF Payload Specification](https://go2docs.graylog.org/5-0/getting_in_log_data/gelf.html?Highlight=Payload#GELFPayloadSpecification), there are mandatory and optional fields used by Graylog in GELF format. These fields are determined by the `Gelf\_*_Key` key in this plugin.
 
-| Key                    | Description                                                                                                                                                                 | default       |
-| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- |
-| Match                  | Pattern to match which tags of logs to be outputted by this plugin                                                                                                          |               |
-| Host                   | IP address or hostname of the target Graylog server                                                                                                                         | 127.0.0.1     |
-| Port                   | The port that your Graylog GELF input is listening on                                                                                                                       | 12201         |
-| Mode                   | The protocol to use (`tls`, `tcp` or `udp`)                                                                                                                                 | udp           |
-| Gelf_Short_Message_Key | A short descriptive message (**MUST be set in GELF**)                                                                                                                       | short_message |
-| Gelf_Timestamp_Key     | Your log timestamp (_SHOULD be set in GELF_)                                                                                                                                | timestamp     |
-| Gelf_Host_Key          | Key which its value is used as the name of the host, source or application that sent this message. (**MUST be set in GELF**)                                                | host          |
-| Gelf_Full_Message_Key  | Key to use as the long message that can i.e. contain a backtrace. (_Optional in GELF_)                                                                                      | full_message  |
-| Gelf_Level_Key         | Key to be used as the log level. Its value must be in [standard syslog levels](https://en.wikipedia.org/wiki/Syslog#Severity_level) (between 0 and 7). (_Optional in GELF_) | level         |
-| Packet_Size            | If transport protocol is `udp`, you can set the size of packets to be sent.                                                                                                 | 1420          |
-| Compress               | If transport protocol is `udp`, you can set this if you want your UDP packets to be compressed.                                                                             | true          |
+| Key | Description | Default |
+| --- | ----------- | ------- |
+| `Match` | Pattern to match which tags of logs to be outputted by this plugin. | _none_ |
+| `Host` | IP address or hostname of the target Graylog server. | `127.0.0.1` |
+| `Port` | The port that your Graylog GELF input is listening on. | `12201` |
+| `Mode` | The protocol to use. Allowed values:`tls`, `tcp`, `udp`.| `udp` |
+| `Gelf_Tag_Key` | Key to be used for tag. (Optional in GELF.) | _none_ |
+| `Gelf_Short_Message_Key` | A short descriptive message. Must be set in GELF. | `short_message` |
+| `Gelf_Timestamp_Key` | Your log timestamp. Should be set in GELF. | `timestamp` |
+| `Gelf_Host_Key` | Key which its value is used as the name of the host, source or application that sent this message. Must be set in GELF. | `host` |
+| `Gelf_Full_Message_Key` | Key to use as the long message that can, for example, contain a backtrace. Optional in GELF. | `full_message`  |
+| `Gelf_Level_Key` | Key to be used as the log level. Its value must be in [standard syslog levels](https://en.wikipedia.org/wiki/Syslog#Severity_level) (between `0` and `7`). Optional in GELF. | `level` |
+| `Packet_Size` | If transport protocol is `udp`, you can set the size of packets to be sent. | `1420` |
+| `Compress` | If transport protocol is `udp`, you can set this if you want your UDP packets to be compressed. | `true` |
+| `Workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
 ### TLS / SSL
 
-GELF output plugin supports TLS/SSL, for more details about the properties available and general configuration, please refer to the [TLS/SSL](../../administration/transport-security.md) section.
+The GELF output plugin supports TLS/SSL. For information about the properties available and general configuration, see [TLS/SSL](../../administration/transport-security.md).
 
 ## Notes
 
-* If you're using Fluent Bit to collect Docker logs, note that Docker places your log in JSON under key `log`. So you can set `log` as your `Gelf_Short_Message_Key` to send everything in Docker logs to Graylog. In this case, you need your `log` value to be a string; so don't parse it using JSON parser.
-* The order of looking up the timestamp in this plugin is as follows:
-  1. Value of `Gelf_Timestamp_Key` provided in configuration
-  2. Value of `timestamp` key
-  3. If you're using [Docker JSON parser](../parsers/json.md), this parser can parse time and use it as timestamp of message. If all above fail, Fluent Bit tries to get timestamp extracted by your parser.
-  4. Timestamp does not set by Fluent Bit. In this case, your Graylog server will set it to the current timestamp (now).
-* Your log timestamp has to be in [UNIX Epoch Timestamp](https://en.wikipedia.org/wiki/Unix_time) format. If the `Gelf_Timestamp_Key` value of your log is not in this format, your Graylog server will ignore it.
-* If you're using Fluent Bit in Kubernetes and you're using [Kubernetes Filter Plugin](../filters/kubernetes.md), this plugin adds `host` value to your log by default, and you don't need to add it by your own.
-* The `version` of GELF message is also mandatory and Fluent Bit sets it to 1.1 which is the current latest version of GELF.
-* If you use `udp` as transport protocol and set `Compress` to `true`, Fluent Bit compresses your packets in GZIP format, which is the default compression that Graylog offers. This can be used to trade more CPU load for saving network bandwidth.
+Be aware that the following items can require changes to your configuration.
 
-## Configuration File Example
+### Docker logs
+
+If you're using Fluent Bit to collect Docker logs, Docker places your log in JSON under key `log`. Set `log` as your `Gelf_Short_Message_Key` to send everything in Docker logs to Graylog. In this case, your `log` value must be a string, so don't parse it using JSON parser.
+
+### Timestamps
+
+The order of looking up the timestamp in this plugin is as follows:
+
+1. Value of `Gelf_Timestamp_Key` provided in configuration.
+1. Value of `timestamp` key,
+1. If you're using [Docker JSON parser](../parsers/json.md), this parser can parse time and use it as timestamp of message. If these steps fail, Fluent Bit tries to get timestamp extracted by your parser.
+1. Timestamp isn't set by Fluent Bit. In this case, your Graylog server will set it to the current timestamp (now).
+
+Your log timestamp has to be in [Unix Epoch Timestamp](https://en.wikipedia.org/wiki/Unix_time) format. If the `Gelf_Timestamp_Key` value of your log isn't in this format, your Graylog server will ignore it.
+
+### Kubernetes
+
+If you're using Fluent Bit in Kubernetes and you're using [Kubernetes Filter Plugin](../filters/kubernetes.md), this plugin adds `host` value to your log by default, and you don't need to add it by your own.
+
+### Version
+
+The `version` of GELF message is also mandatory and Fluent Bit sets it to 1.1 which is the current latest version of GELF.
+
+### Compression
+
+If you use `udp` as transport protocol and set `Compress` to `true`, Fluent Bit compresses your packets in GZIP format, which is the default compression that Graylog offers. This can be used to trade more CPU load for saving network bandwidth.
+
+## Configuration file example
 
 If you're using Fluent Bit for shipping Kubernetes logs, you can use something like this as your configuration file:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+parsers:
+  - name: docker
+    format: json
+    time_key: time
+    time_format: '%Y-%m-%dT%H:%M:%S.%L'
+    time_keep: off
+
+pipeline:
+  inputs:
+    - name: tail
+      tag: kube.*
+      path: /var/log/containers/*.log
+      parser: docker
+      db: /var/log/flb_kube.db
+      mem_buf_limit: 5MB
+      refresh_interval: 10
+
+  filters:
+    - name: kubernetes
+      match: 'kube.*'
+      merge_log_key: log
+      merge_log: on
+      keep_log: off
+      annotations: off
+      labels: off
+
+    - name: nest
+      match: '*'
+      operation: lift
+      nested_under: log
+
+  outputs:
+    - name: gelf
+      match: 'kube.*'
+      host: <your-graylog-server>
+      port: 12201
+      mode: tcp
+      gelf_short_message_key: data
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
     Name                    tail
     Tag                     kube.*
@@ -84,29 +151,38 @@ If you're using Fluent Bit for shipping Kubernetes logs, you can use something l
     Time_Keep               Off
 ```
 
-By default, GELF tcp uses port 12201 and Docker places your logs in `/var/log/containers` directory. The logs are placed in value of the `log` key. For example, this is a log saved by Docker:
+{% endtab %}
+{% endtabs %}
 
-```javascript
+By default, GELF TCP uses port `12201` and Docker places your logs in `/var/log/containers` directory. The logs are placed in value of the `log` key. For example, this is a log saved by Docker:
+
+```text
+...
 {"log":"{\"data\": \"This is an example.\"}","stream":"stderr","time":"2019-07-21T12:45:11.273315023Z"}
+...
 ```
 
-If you use [Tail Input](../inputs/tail.md) and use a Parser like the `docker` parser shown above, it decodes your message and extracts `data` (and any other present) field. This is how this log in [stdout](standard-output.md) looks like after decoding:
+If you use [Tail Input](../inputs/tail.md) and use a Parser like the `docker` parser shown previously, it decodes your message and extracts `data` (and any other present) field. This is how this log in [stdout](standard-output.md) looks like after decoding:
 
-```
+```text
+...
 [0] kube.log: [1565770310.000198491, {"log"=>{"data"=>"This is an example."}, "stream"=>"stderr", "time"=>"2019-07-21T12:45:11.273315023Z"}]
+...
 ```
 
-Now, this is what happens to this log:
+This is what happens to the log:
 
 1. Fluent Bit GELF plugin adds `"version": "1.1"` to it.
-2. The [Nest Filter](../filters/nest.md), unnests fields inside `log` key. In our example, it puts `data` alongside `stream` and `time`.
-3. We used this `data` key as `Gelf_Short_Message_Key`; so GELF plugin changes it to `short_message`.
-4. [Kubernetes Filter](../filters/kubernetes.md) adds `host` name.
-5. Timestamp is generated.
-6. Any custom field (not present in [GELF Payload Specification](https://go2docs.graylog.org/5-0/getting_in_log_data/gelf.html?Highlight=Payload#GELFPayloadSpecification).) is prefixed by an underline.
+1. The [Nest Filter](../filters/nest.md), unnests fields inside `log` key. In the example, it puts `data` alongside `stream` and `time`.
+1. The `data` key was `Gelf_Short_Message_Key`, so GELF plugin changes it to `short_message`.
+1. [Kubernetes Filter](../filters/kubernetes.md) adds `host` name.
+1. Timestamp is generated.
+1. Any custom field (not present in [GELF Payload Specification](https://go2docs.graylog.org/5-0/getting_in_log_data/gelf.html?Highlight=Payload#GELFPayloadSpecification).) is prefixed by an underline.
 
-Finally, this is what our Graylog server input sees:
+Finally, this is what the Graylog server input sees:
 
-```javascript
+```text
+...
 {"version":"1.1", "short_message":"This is an example.", "host": "<Your Node Name>", "_stream":"stderr", "timestamp":1565770310.000199}
+...
 ```
diff --git a/pipeline/outputs/http.md b/pipeline/outputs/http.md
index 59ed7b5f5..6c34adcc0 100644
--- a/pipeline/outputs/http.md
+++ b/pipeline/outputs/http.md
@@ -1,136 +1,146 @@
 # HTTP
 
-The **http** output plugin allows to flush your records into a HTTP endpoint. For now the functionality is pretty basic and it issues a POST request with the data records in [MessagePack](http://msgpack.org) (or JSON) format.
-
-## Configuration Parameters
-
-| Key                        | Description                                                                                                                                                                                                                                                                                                                        | default   |
-| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
-| host                       | IP address or hostname of the target HTTP Server                                                                                                                                                                                                                                                                                   | 127.0.0.1 |
-| http\_User                 | Basic Auth Username                                                                                                                                                                                                                                                                                                                |           |
-| http\_Passwd               | Basic Auth Password. Requires HTTP\_User to be set                                                                                                                                                                                                                                                                                 |           |
-| AWS\_Auth                  | Enable AWS SigV4 authentication                                                                                                                                                                                                                                                                                                    | false     |
-| AWS\_Service               | Specify the AWS service code, i.e. es, xray, etc., of your service, used by SigV4 authentication. Usually can be found in the service endpoint's subdomains, `protocol://service-code.region-code.amazonaws.com`                                                                                                                   |           |
-| AWS\_Region                | Specify the AWS region of your service, used by SigV4 authentication                                                                                                                                                                                                                                                               |           |
-| AWS\_STS\_Endpoint         | Specify the custom sts endpoint to be used with STS API, used with the AWS_Role_ARN option, used by SigV4 authentication                                                                                                                                                                                                           |           |
-| AWS\_Role\_ARN             | AWS IAM Role to assume, used by SigV4 authentication                                                                                                                                                                                                                                                                               |           |
-| AWS\_External\_ID          | External ID for the AWS IAM Role specified with `aws_role_arn`, used by SigV4 authentication                                                                                                                                                                                                                                       |           |
-| port                       | TCP port of the target HTTP Server                                                                                                                                                                                                                                                                                                 | 80        |
-| Proxy                      | Specify an HTTP Proxy. The expected format of this value is `http://HOST:PORT`. Note that HTTPS is **not** currently supported. It is recommended not to set this and to configure the [HTTP proxy environment variables](https://docs.fluentbit.io/manual/administration/http-proxy) instead as they support both HTTP and HTTPS. |           |
-| uri                        | Specify an optional HTTP URI for the target web server, e.g: /something                                                                                                                                                                                                                                                            | /         |
-| compress                   | Set payload compression mechanism. Option available is 'gzip'                                                                                                                                                                                                                                                                      |           |
-| format                     | Specify the data format to be used in the HTTP request body, by default it uses _msgpack_. Other supported formats are _json_, _json\_stream_ and _json\_lines_ and _gelf_.                                                                                                                                                        | msgpack   |
-| allow\_duplicated\_headers | Specify if duplicated headers are allowed. If a duplicated header is found, the latest key/value set is preserved.                                                                                                                                                                                                                 | true      |
-| log\_response\_payload     | Specify if the response paylod should be logged or not.                                                                                                                                                                                                                                                                            | true      |
-| header\_tag                | Specify an optional HTTP header field for the original message tag.                                                                                                                                                                                                                                                                |           |
-| header                     | Add a HTTP header key/value pair. Multiple headers can be set.                                                                                                                                                                                                                                                                     |           |
-| json\_date\_key            | Specify the name of the time key in the output record. To disable the time key just set the value to `false`.                                                                                                                                                                                                                      | date      |
-| json\_date\_format         | Specify the format of the date. Supported formats are _double_, _epoch_, _iso8601_ (eg: _2018-05-30T09:39:52.000681Z_) and _java_sql_timestamp_ (eg: _2018-05-30 09:39:52.000681_)                                                                                                                                                 | double    |
-| gelf\_timestamp\_key       | Specify the key to use for `timestamp` in _gelf_ format                                                                                                                                                                                                                                                                            |           |
-| gelf\_host\_key            | Specify the key to use for the `host` in _gelf_ format                                                                                                                                                                                                                                                                             |           |
-| gelf\_short\_message\_key  | Specify the key to use as the `short` message in _gelf_ format                                                                                                                                                                                                                                                                     |           |
-| gelf\_full\_message\_key   | Specify the key to use for the `full` message in _gelf_ format                                                                                                                                                                                                                                                                     |           |
-| gelf\_level\_key           | Specify the key to use for the `level` in _gelf_ format                                                                                                                                                                                                                                                                            |           |
-| body\_key                  | Specify the key to use as the body of the request (must prefix with "$"). The key must contain either a binary or raw string, and the content type can be specified using headers\_key (which must be passed whenever body\_key is present). When this option is present, each msgpack record will create a separate request.      |           |
-| headers\_key               | Specify the key to use as the headers of the request (must prefix with "$"). The key must contain a map, which will have the contents merged on the request headers. This can be used for many purposes, such as specifying the content-type of the data contained in body\_key.                                                   |           |
-| Workers | Enables dedicated thread(s) for this output. Default value is set since version 1.8.13. For previous versions is 0. | 2 |
+The _HTTP_ output plugin lets you flush your records into an HTTP endpoint. It issues a POST request with the data records in [MessagePack](http://msgpack.org) (or JSON) format.
+
+## Configuration parameters
+
+The plugin supports the following configuration parameters:
+
+| Key | Description | Default |
+| --- | ----------- | -------- |
+| `host` | IP address or hostname of the target HTTP Server. | `127.0.0.1` |
+| `http_User` | Basic Auth username. | _none_ |
+| `http_Passwd` | Basic Auth password. Requires `HTTP_User` to be set. | _none_ |
+| `AWS_Auth` | Enable AWS SigV4 authentication. | `false` |
+| `AWS_Service` | Specify the AWS service code of your service, used by SigV4 authentication (for example, `es`, `xray`.) Usually found in the service endpoint's subdomains, `protocol://service-code.region-code.amazonaws.com`. | _none_ |
+| `AWS_Region` | Specify the AWS region of your service, used by SigV4 authentication. | _none_ |
+| `AWS_STS_Endpoint` | Specify the custom STS endpoint to be used by STS API. Used with the `AWS_Role_ARN option` and by SigV4 authentication. | _none_ |
+| `AWS_Role_ARN` | AWS IAM Role to assume, used by SigV4 authentication. | _none_ |
+| `AWS_External_ID` | External ID for the AWS IAM Role specified with `aws_role_arn`, used by SigV4 authentication. | _none_ |
+| `port` | TCP port of the target HTTP Server. | `80` |
+| `Proxy` | Specify an HTTP Proxy. The expected format of this value is `http://HOST:PORT`. HTTPS isn't supported. It's recommended to configure the [HTTP proxy environment variables](https://docs.fluentbit.io/manual/administration/http-proxy) instead as they support both HTTP and HTTPS. | _none_ |
+| `uri` | Specify an optional HTTP URI for the target web server. For example, `/somepath`. | `/` |
+| `compress` | Set payload compression mechanism. Allowed value: `gzip`. | _none_ |
+| `format` | Specify the data format to be used in the HTTP request body. Supported formats: `gelf`, `json`, `json_stream`, `json_lines`, `msgpack`. | `msgpack` |
+| `allow_duplicated_headers` | Specify if duplicated headers are allowed. If a duplicated header is found, the latest key/value set is preserved. | `true` |
+| `log_response_payload` | Specify if the response payload should be logged or not. | `true` |
+| `header_tag` | Specify an optional HTTP header field for the original message tag. | _none_ |
+| `header` | Add a HTTP header key/value pair. Multiple headers can be set. | _none_ |
+| `json_date_key` | Specify the name of the time key in the output record. To disable the time key, set the value to `false`. | `date` |
+| `json_date_format` | Specify the format of the date. Supported formats: `double`, `epoch`, `iso8601`, `java_sql_timestamp`. | `double` |
+| `gelf_timestamp_key` | Specify the key to use for `timestamp` in `gelf` format. | _none_ |
+| `gelf_host_key` | Specify the key to use for the `host` in `gelf` format. | _none_ |
+| `gelf_short_message_key` | Specify the key to use as the `short` message in `gelf` format. | _none_ |
+| `gelf_full_message_key` | Specify the key to use for the `full` message in `gelf` format. | _none_ |
+| `gelf_level_key` | Specify the key to use for the `level` in `gelf` format. | _none_ |
+| `body_key` | Specify the key to use as the body of the request (must prefix with `$`). The key must contain either a binary or raw string, and the content type can be specified using `headers_key`, which must be passed whenever `body_key` is present. When this option is present, each `msgpack` record will create a separate request. | _none_ |
+| `headers_key` | Specify the key to use as the headers of the request (must prefix with `$`). The key must contain a map, which will have the contents merged on the request headers. This can be used for many purposes, such as specifying the content type of the data contained in `body_key`.| _none_ |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `2` |
 
 ### TLS / SSL
 
-HTTP output plugin supports TLS/SSL, for more details about the properties available and general configuration, please refer to the [TLS/SSL](../../administration/transport-security.md) section.
+The HTTP output plugin supports TLS/SSL. For more details about the properties available and general configuration, see [TLS/SSL](../../administration/transport-security.md).
 
-## Getting Started
+## Get started
 
-In order to insert records into a HTTP server, you can run the plugin from the command line or through the configuration file:
+To insert records into an HTTP server, you can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-The **http** plugin, can read the parameters from the command line in two ways, through the **-p** argument (property) or setting them directly through the service URI. The URI format is the following:
+The HTTP plugin can read the parameters from the command line through the `-p` argument (property) or setting them directly through the service URI. The URI format is the following:
 
-```
+```text
 http://host:port/something
 ```
 
 Using the format specified, you could start Fluent Bit through:
 
-```
-$ fluent-bit -i cpu -t cpu -o http://192.168.2.3:80/something -m '*'
+```shell
+fluent-bit -i cpu -t cpu -o http://192.168.2.3:80/something -m '*'
 ```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file, append the following _Input_ & _Output_ sections:
+In your main configuration file append the following:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag:  cpu
+  outputs:
+    - name: http
+      match: '*'
+      host: 192.168.2.3
+      port: 80
+      uri: /something
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
-```python
+
+```text
 [INPUT]
-    Name  cpu
-    Tag   cpu
+  Name  cpu
+  Tag   cpu
 
 [OUTPUT]
-    Name  http
-    Match *
-    Host  192.168.2.3
-    Port  80
-    URI   /something
+  Name  http
+  Match *
+  Host  192.168.2.3
+  Port  80
+  URI   /something
 ```
-{% endtab %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-pipeline:
-    inputs:
-        - name: cpu
-          tag:  cpu
-    outputs:
-        - name: http
-          match: '*'
-          host: 192.168.2.3
-          port: 80
-          URI: /something
-```
 {% endtab %}
 {% endtabs %}
 
-By default, the URI becomes tag of the message, the original tag is ignored. To retain the tag, multiple configuration sections have to be made based and flush to different URIs.
+By default, the URI becomes tag of the message, the original tag is ignored. To retain the tag, multiple configuration sections have to be made based and flush to more than one URI.
 
-Another approach we also support is the sending the original message tag in a configurable header. It's up to the receiver to do what it wants with that header field: parse it and use it as the tag for example.
+Another supported approach is the sending the original message tag in a configurable header. It's up to the receiver to do what it wants with that header field. For example, parse it and use it as the tag for example.
 
-To configure this behaviour, add this config:
+To configure this behaviour, add this configuration:
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```
-[OUTPUT]
-    Name  http
-    Match *
-    Host  192.168.2.3
-    Port  80
-    URI   /something
-    Format json
-    header_tag  FLUENT-TAG
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: http
+      match: '*'
+      host: 192.168.2.3
+      port: 80
+      uri: /something
+      format: json
+      header_tag: FLUENT-TAG
 ```
+
 {% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-    outputs:
-        - name: http
-          match: '*'
-          host: 192.168.2.3
-          port: 80
-          URI: /something
-          format: json
-          header_tag: FLUENT-TAG
+```text
+[OUTPUT]
+  Name  http
+  Match *
+  Host  192.168.2.3
+  Port  80
+  URI   /something
+  Format json
+  header_tag  FLUENT-TAG
 ```
+
 {% endtab %}
 {% endtabs %}
 
 
 Provided you are using Fluentd as data receiver, you can combine `in_http` and `out_rewrite_tag_filter` to make use of this HTTP header.
 
-```
+```text
 <source>
   @type http
   add_http_headers true
@@ -146,76 +156,88 @@ Provided you are using Fluentd as data receiver, you can combine `in_http` and `
 </match>
 ```
 
-Notice how we override the tag, which is from URI path, with our custom header
+Fluent Bit overrides the tag, which is from URI path, with a custom header.
 
-#### Example : Add a header
+#### Add a header
+
+This example adds a header.
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```
-[OUTPUT]
-    Name           http
-    Match          *
-    Host           127.0.0.1
-    Port           9000
-    Header         X-Key-A Value_A
-    Header         X-Key-B Value_B
-    URI            /something
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: http
+      match: '*'
+      host: 127.0.0.1
+      port: 9000
+      header:
+        - X-Key-A Value_A
+        - X-Key-B Value_B
+      uri: /something
 ```
+
 {% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-    outputs:
-        - name: http
-          match: '*'
-          host: 127.0.0.1
-          port: 9000
-          header:
-            - X-Key-A Value_A
-            - X-Key-B Value_B
-          URI: /something
+```text
+[OUTPUT]
+  Name           http
+  Match          *
+  Host           127.0.0.1
+  Port           9000
+  Header         X-Key-A Value_A
+  Header         X-Key-B Value_B
+  URI            /something
 ```
+
 {% endtab %}
 {% endtabs %}
 
-#### Example : Sumo Logic HTTP Collector
+#### Sumo Logic HTTP collector
 
-Suggested configuration for Sumo Logic using `json_lines` with `iso8601` timestamps. The `PrivateKey` is specific to a configured HTTP collector.
+The following is a suggested configuration for Sumo Logic using `json_lines` with `iso8601` timestamps. The `PrivateKey` is specific to a configured HTTP collector.
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```
-[OUTPUT]
-    Name             http
-    Match            *
-    Host             collectors.au.sumologic.com
-    Port             443
-    URI              /receiver/v1/http/[PrivateKey]
-    Format           json_lines
-    Json_date_key    timestamp
-    Json_date_format iso8601
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: http
+      match: '*'
+      host: collectors.au.sumologic.com
+      port: 443
+      uri: /receiver/v1/http/[PrivateKey]
+      format: json_lines
+      json_date_key: timestamp
+      json_date_format: iso8601
 ```
+
 {% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
-    outputs:
-        - name: http
-          match: '*'
-          host: collectors.au.sumologic.com
-          port: 443
-          URI: /receiver/v1/http/[PrivateKey]
-          format: json_lines
-          json_date_key: timestamp
-          json_date_format: iso8601
+```text
+[OUTPUT]
+  Name             http
+  Match            *
+  Host             collectors.au.sumologic.com
+  Port             443
+  URI              /receiver/v1/http/[PrivateKey]
+  Format           json_lines
+  Json_date_key    timestamp
+  Json_date_format iso8601
 ```
+
 {% endtab %}
 {% endtabs %}
 
 A sample Sumo Logic query for the [CPU](../inputs/cpu-metrics.md) input. \(Requires `json_lines` format with `iso8601` date format for the `timestamp` field\).
 
-```
+```text
 _sourcecategory="my_fluent_bit"
 | json "cpu_p" as cpu
 | timeslice 1m
diff --git a/pipeline/outputs/influxdb.md b/pipeline/outputs/influxdb.md
index 53a8fe41b..aeb560780 100644
--- a/pipeline/outputs/influxdb.md
+++ b/pipeline/outputs/influxdb.md
@@ -1,210 +1,293 @@
 # InfluxDB
 
-The **influxdb** output plugin, allows to flush your records into a [InfluxDB](https://www.influxdata.com/time-series-platform/influxdb/) time series database. The following instructions assumes that you have a fully operational InfluxDB service running in your system.
+The _InfluxDB_ output plugin lets you flush your records into a [InfluxDB](https://www.influxdata.com/time-series-platform/influxdb/) time series database. The following instructions assume that you have an operational InfluxDB service running in your system.
 
-## Configuration Parameters
+## Configuration parameters
 
-| Key | Description | default |
+This plugin supports the following parameters:
+
+| Key | Description | Default |
 | :--- | :--- | :--- |
-| Host | IP address or hostname of the target InfluxDB service | 127.0.0.1 |
-| Port | TCP port of the target InfluxDB service | 8086 |
-| Database | InfluxDB database name where records will be inserted | fluentbit |
-| Bucket | InfluxDB bucket name where records will be inserted - if specified, `database` is ignored and v2 of API is used |  |
-| Org | InfluxDB organization name where the bucket is \(v2 only\) | fluent |
-| Sequence\_Tag | The name of the tag whose value is incremented for the consecutive simultaneous events. | \_seq |
-| HTTP\_User | Optional username for HTTP Basic Authentication |  |
-| HTTP\_Passwd | Password for user defined in HTTP\_User |  |
-| HTTP\_Token | Authentication token used with InfluDB v2 - if specified, both HTTP\_User and HTTP\_Passwd are ignored |  |
-| HTTP\_Header | Add a HTTP header key/value pair. Multiple headers can be set | |
-| Tag\_Keys | Space separated list of keys that needs to be tagged |  |
-| Auto\_Tags | Automatically tag keys where value is _string_. This option takes a boolean value: True/False, On/Off. | Off |
-| Uri | Custom URI endpoint | |
+| `Host` | IP address or hostname of the target InfluxDB service. | `127.0.0.1` |
+| `Port` | TCP port of the target InfluxDB service. | `8086` |
+| `Database` | InfluxDB database name where records will be inserted. | `fluentbit` |
+| `Bucket` | InfluxDB bucket name where records will be inserted. If specified, `database` is ignored and v2 of API is used. | _none_ |
+| `Org` | InfluxDB organization name where the bucket is (v2 only). | `fluent` |
+| `Sequence_Tag` | The name of the tag whose value is incremented for the consecutive simultaneous events. | `_seq` |
+| `HTTP_User` | Optional username for HTTP Basic Authentication. | _none_ |
+| `HTTP_Passwd` | Password for user defined in `HTTP_User`. | _none_ |
+| `HTTP_Token` | Authentication token used with InfluxDB v2. If specified, both `HTTP_User` and `HTTP_Passwd` are ignored. | _none_ |
+| `HTTP_Header` | Add a HTTP header key/value pair. Multiple headers can be set. | _none_ |
+| `Tag_Keys` | Space separated list of keys that needs to be tagged. | _none_ |
+| `Auto_Tags` | Automatically tag keys where value is `string`.  This option takes a Boolean value: `True`/`False`, `On`/`Off`. | `Off` |
+| `Uri` | Custom URI endpoint. | _none_ |
+| `Add_Integer_Suffix` | Use integer type of [InfluxDB's line protocol](https://docs.influxdata.com/influxdb/v1/write_protocols/line_protocol_reference/). This option takes a Boolean value: `True`/`False`, `On`/`Off`. | `Off` |
+| `Workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
 ### TLS / SSL
 
-InfluxDB output plugin supports TLS/SSL, for more details about the properties available and general configuration, please refer to the [TLS/SSL](../../administration/transport-security.md) section.
+The InfluxDB output plugin supports TLS/SSL. For more details about the properties available and general configuration, see [TLS/SSL](../../administration/transport-security.md).
 
-## Getting Started
+## Get started
 
-In order to start inserting records into an InfluxDB service, you can run the plugin from the command line or through the configuration file:
+To start inserting records into an InfluxDB service, you can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-The **influxdb** plugin, can read the parameters from the command line in two ways, through the **-p** argument \(property\) or setting them directly through the service URI. The URI format is the following:
+The InfluxDB plugin can read the parameters from the command line through the `-p` argument (property) or by setting them directly through the service URI. The URI format is the following:
 
 ```text
 influxdb://host:port
 ```
 
-Using the format specified, you could start Fluent Bit through:
+Using the format specified, you could start Fluent Bit:
 
-```text
-$ fluent-bit -i cpu -t cpu -o influxdb://127.0.0.1:8086 -m '*'
+```shell
+fluent-bit -i cpu -t cpu -o influxdb://127.0.0.1:8086 -m '*'
 ```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file append the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+  outputs:
+    - name: influxdb
+      match: '*'
+      host: 127.0.0.1
+      port: 8086
+      database: fluentbit
+      sequence_tag: _seq
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [INPUT]
-    Name  cpu
-    Tag   cpu
+  Name  cpu
+  Tag   cpu
 
 [OUTPUT]
-    Name          influxdb
-    Match         *
-    Host          127.0.0.1
-    Port          8086
-    Database      fluentbit
-    Sequence_Tag  _seq
+  Name          influxdb
+  Match         *
+  Host          127.0.0.1
+  Port          8086
+  Database      fluentbit
+  Sequence_Tag  _seq
 ```
 
+{% endtab %}
+{% endtabs %}
+
 #### Tagging
 
 Basic example of `Tag_Keys` usage:
 
-```python
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: tail
+      tag: apache.access
+      parser: apache2
+      path: /var/log/apache2/access.log
+
+  outputs:
+    - name: influxdb
+      match: '*'
+      host: 127.0.0.1
+      port: 8086
+      database: fluentbit
+      sequence_tag: _seq
+      # make tags from method and path fields
+      tag_keys: method path
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name            tail
-    Tag             apache.access
-    parser          apache2
-    path            /var/log/apache2/access.log
+  Name            tail
+  Tag             apache.access
+  parser          apache2
+  path            /var/log/apache2/access.log
 
 [OUTPUT]
-    Name          influxdb
-    Match         *
-    Host          127.0.0.1
-    Port          8086
-    Database      fluentbit
-    Sequence_Tag  _seq
-    # make tags from method and path fields
-    Tag_Keys      method path
+  Name          influxdb
+  Match         *
+  Host          127.0.0.1
+  Port          8086
+  Database      fluentbit
+  Sequence_Tag  _seq
+  # make tags from method and path fields
+  Tag_Keys      method path
 ```
 
-With **Auto\_Tags=On** in this example cause error, because every parsed field value type is _string_. Best usage of this option in metrics like record where one or more field value is not _string_ typed.
+{% endtab %}
+{% endtabs %}
+
+`Auto_Tags=On` in this example causes an error, because every parsed field value type is `string`. The best usage of this option in metrics like record where one or more field value isn't `string` typed.
+
+A basic example of `Tags_List_Key` usage:
 
-Basic example of `Tags_List_Key` usage:
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-```python
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      # tagged fields: level, ID, businessObjectID, status
+      dummy: '{"msg": "Transfer completed", "level": "info", "ID": "1234", "businessObjectID": "qwerty", "status": "OK", "tags": ["ID", "businessObjectID"]}'
+
+  outputs:
+    - name: influxdb
+      match: '*'
+      host: 127.0.0.1
+      port: 8086
+      database: fluentbit
+      sequence_tag: _seq
+      # make tags from method and path fields
+      tag_keys: method path
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name              dummy
-    # tagged fields: level, ID, businessObjectID, status
-    Dummy             {"msg": "Transfer completed", "level": "info", "ID": "1234", "businessObjectID": "qwerty", "status": "OK", "tags": ["ID", "businessObjectID"]}
+  Name              dummy
+  # tagged fields: level, ID, businessObjectID, status
+  Dummy             {"msg": "Transfer completed", "level": "info", "ID": "1234", "businessObjectID": "qwerty", "status": "OK", "tags": ["ID", "businessObjectID"]}
 
 [OUTPUT]
-    Name          influxdb
-    Match         *
-    Host          127.0.0.1
-    Port          8086
-    Bucket        My_Bucket
-    Org           My_Org
-    Sequence_Tag  _seq
-    HTTP_Token    My_Token
-    # tag all fields inside tags string array
-    Tags_List_Enabled True
-    Tags_List_Key tags
-    # tag level, status fields
-    Tag_Keys level status
+  Name          influxdb
+  Match         *
+  Host          127.0.0.1
+  Port          8086
+  Bucket        My_Bucket
+  Org           My_Org
+  Sequence_Tag  _seq
+  HTTP_Token    My_Token
+  # tag all fields inside tags string array
+  Tags_List_Enabled True
+  Tags_List_Key tags
+  # tag level, status fields
+  Tag_Keys level status
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ### Testing
 
-Before to start Fluent Bit, make sure the target database exists on InfluxDB, using the above example, we will insert the data into a _fluentbit_ database.
+Before starting Fluent Bit, ensure the target database exists on InfluxDB. Using the previous example, insert the data into a `fluentbit` database.
 
-#### 1. Create database
+1. Log into the InfluxDB console:
 
-Log into InfluxDB console:
+   ```shell
+   influx
+   ```
 
-```text
-$ influx
-Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
-Connected to http://localhost:8086 version 1.1.0
-InfluxDB shell version: 1.1.0
->
-```
+   Which should return a result like:
 
-Create the database:
+   ```text
+   Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
+   Connected to http://localhost:8086 version 1.1.0
+   InfluxDB shell version: 1.1.0
+   >
+   ```
 
-```text
-> create database fluentbit
->
-```
+1. Create the database:
 
-Check the database exists:
+   ```text
+   > create database fluentbit
+   >
+   ```
 
-```text
-> show databases
-name: databases
-name
-----
-_internal
-fluentbit
-
->
-```
+1. Check that the database exists:
 
-#### 2. Run Fluent Bit
+   ```text
+   > show databases
+   name: databases
+   name
+   ----
+   _internal
+   fluentbit
 
-The following command will gather CPU metrics from the system and send the data to InfluxDB database every five seconds:
+   >
+   ```
 
-```text
-$ bin/fluent-bit -i cpu -t cpu -o influxdb -m '*'
-```
+1. Run Fluent Bit:
 
-Note that all records coming from the _cpu_ input plugin, have a tag _cpu_, this tag is used to generate the measurement in InfluxDB
+   The following command will gather CPU metrics from the system and send the data to InfluxDB database every five seconds:
 
-#### 3. Query the data
+   ```shell
+   fluent-bit -i cpu -t cpu -o influxdb -m '*'
+   ```
 
-From InfluxDB console, choose your database:
+   All records coming from the `cpu` input plugin have a tag `cpu`. This tag is used to generate the measurement in InfluxDB.
 
-```text
-> use fluentbit
-Using database fluentbit
-```
+1. Query the data:
 
-Now query some specific fields:
+   From InfluxDB console, choose your database:
 
-```text
-> SELECT cpu_p, system_p, user_p FROM cpu
-name: cpu
-time                  cpu_p   system_p    user_p
-----                  -----   --------    ------
-1481132860000000000   2.75        0.5      2.25
-1481132861000000000   2           0.5      1.5
-1481132862000000000   4.75        1.5      3.25
-1481132863000000000   6.75        1.25     5.5
-1481132864000000000   11.25       3.75     7.5
-```
+   ```text
+   > use fluentbit
+   Using database fluentbit
+   ```
 
-The CPU input plugin gather more metrics per CPU core, in the above example we just selected three specific metrics. The following query will give a full result:
+1. Query some specific fields:
 
-```text
-> SELECT * FROM cpu
-```
+   ```text
+   > SELECT cpu_p, system_p, user_p FROM cpu
+   name: cpu
+   time                  cpu_p   system_p    user_p
+   ----                  -----   --------    ------
+   1481132860000000000   2.75        0.5      2.25
+   1481132861000000000   2           0.5      1.5
+   1481132862000000000   4.75        1.5      3.25
+   1481132863000000000   6.75        1.25     5.5
+   1481132864000000000   11.25       3.75     7.5
+   ```
 
-#### 4. View tags
+   The CPU input plugin gathers more metrics per CPU core. This example selected three specific metrics. The following query will give a full result:
 
-Query tagged keys:
+   ```text
+   > SELECT * FROM cpu
+   ```
 
-```text
-> SHOW TAG KEYS ON fluentbit FROM "apache.access"
-name: apache.access
-tagKey
-------
-_seq
-method
-path
-```
+1. View tags by querying tagged keys:
 
-And now query _method_ key values:
+   ```text
+   > SHOW TAG KEYS ON fluentbit FROM "apache.access"
+   name: apache.access
+   tagKey
+   ------
+   _seq
+   method
+   path
+   ```
 
-```text
-> SHOW TAG VALUES ON fluentbit FROM "apache.access" WITH KEY = "method"
-name: apache.access
-key    value
----    -----
-method "MATCH"
-method "POST"
-```
+1. Query `method` key values:
 
+   ```text
+   > SHOW TAG VALUES ON fluentbit FROM "apache.access" WITH KEY = "method"
+   name: apache.access
+   key    value
+   ---    -----
+   method "MATCH"
+   method "POST"
+   ```
diff --git a/pipeline/outputs/kafka-rest-proxy.md b/pipeline/outputs/kafka-rest-proxy.md
index 399d57108..eca41e1b5 100644
--- a/pipeline/outputs/kafka-rest-proxy.md
+++ b/pipeline/outputs/kafka-rest-proxy.md
@@ -1,42 +1,66 @@
-# Kafka REST Proxy
+# Kafka REST proxy
 
-The **kafka-rest** output plugin, allows to flush your records into a [Kafka REST Proxy](http://docs.confluent.io/current/kafka-rest/docs/index.html) server. The following instructions assumes that you have a fully operational Kafka REST Proxy and Kafka services running in your environment.
+The _Kafka rest_ (`kafka-rest`) output plugin lets you flush your records into a [Kafka REST Proxy](http://docs.confluent.io/current/kafka-rest/docs/index.html) server. The following instructions assume you have an operational Kafka REST Proxy and Kafka services running in your environment.
 
-## Configuration Parameters
+## Configuration parameters
+
+This plugin supports the following parameters:
 
 | Key | Description | default |
 | :--- | :--- | :--- |
-| Host | IP address or hostname of the target Kafka REST Proxy server | 127.0.0.1 |
-| Port | TCP port of the target Kafka REST Proxy server | 8082 |
-| Topic | Set the Kafka topic | fluent-bit |
-| Partition | Set the partition number \(optional\) |  |
-| Message\_Key | Set a message key \(optional\) |  |
-| Time\_Key | The Time\_Key property defines the name of the field that holds the record timestamp. | @timestamp |
-| Time\_Key\_Format | Defines the format of the timestamp. | %Y-%m-%dT%H:%M:%S |
-| Include\_Tag\_Key | Append the Tag name to the final record. | Off |
-| Tag\_Key | If Include\_Tag\_Key is enabled, this property defines the key name for the tag. | \_flb-key |
+| `Host` | IP address or hostname of the target Kafka REST Proxy server. | `127.0.0.1` |
+| `Port` | TCP port of the target Kafka REST Proxy server. | `8082` |
+| `Topic` | Set the Kafka topic. | `fluent-bit` |
+| `Partition` | Optional. Set the partition number. | _none_ |
+| `Message_Key` | Optional. Set a message key. | _none_ |
+| `Time_Key` | The `Time_Key` property defines the name of the field that holds the record timestamp. | `@timestamp` |
+| `Time_Key_Format` | Defines the format of the timestamp. | `%Y-%m-%dT%H:%M:%S` |
+| `Include_Tag_Key` | Append the Tag name to the final record. | `Off` |
+| `Tag_Key` | If `Include_Tag_Key` is enabled, this property defines the key name for the tag. | `_flb-key` |
+| `Workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
 ### TLS / SSL
 
-Kafka REST Proxy output plugin supports TLS/SSL, for more details about the properties available and general configuration, please refer to the [TLS/SSL](../../administration/transport-security.md) section.
+The Kafka REST Proxy output plugin supports TLS/SSL. For more details about the properties available and general configuration, see [TLS/SSL](../../administration/transport-security.md).
 
-## Getting Started
+## Get started
 
-In order to insert records into a Kafka REST Proxy service, you can run the plugin from the command line or through the configuration file:
+To insert records into a Kafka REST Proxy service, you can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-The **kafka-rest** plugin, can read the parameters from the command line in two ways, through the **-p** argument \(property\), e.g:
+The Kafka REST plugin can read the parameters from the command line through the `-p` argument (property):
 
-```text
-$ fluent-bit -i cpu -t cpu -o kafka-rest -p host=127.0.0.1 -p port=8082 -m '*'
+```shell
+fluent-bit -i cpu -t cpu -o kafka-rest -p host=127.0.0.1 -p port=8082 -m '*'
 ```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file append the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
 
-```python
+  outputs:
+    - name: kafka-rest
+      match: '*'
+      host: 127.0.0.1
+      port: 8082
+      topic: fluent-bit
+      message_key: my_key
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
     Name  cpu
     Tag   cpu
@@ -50,3 +74,5 @@ In your main configuration file append the following _Input_ & _Output_ sections
     Message_Key my_key
 ```
 
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/outputs/kafka.md b/pipeline/outputs/kafka.md
index cfe3e4f75..af13981b9 100644
--- a/pipeline/outputs/kafka.md
+++ b/pipeline/outputs/kafka.md
@@ -1,116 +1,319 @@
-# Kafka
+# Kafka Producer
 
-Kafka output plugin allows to ingest your records into an [Apache Kafka](https://kafka.apache.org/) service. This plugin use the official [librdkafka C library](https://github.com/edenhill/librdkafka) \(built-in dependency\)
+The _Kafka Producer_ output plugin lets you ingest your records into an [Apache Kafka](https://kafka.apache.org/) service. This plugin uses the official [librdkafka C library](https://github.com/edenhill/librdkafka).
 
-## Configuration Parameters
+In Fluent Bit 4.0.4 and later, the Kafka input plugin supports authentication with AWS MSK IAM, enabling integration with Amazon MSK (Managed Streaming for Apache Kafka) clusters that require IAM-based access.
 
-| Key | Description | default |
+## Configuration parameters
+
+This plugin supports the following parameters:
+
+| Key | Description | Default |
 | :--- | :--- | :--- |
-| format | Specify data format, options available: json, msgpack. | json |
-| message\_key | Optional key to store the message |  |
-| message\_key\_field | If set, the value of Message\_Key\_Field in the record will indicate the message key. If not set nor found in the record, Message\_Key will be used \(if set\). |  |
-| timestamp\_key | Set the key to store the record timestamp | @timestamp |
-| timestamp\_format | Specify timestamp format, should be 'double', '[iso8601](https://en.wikipedia.org/wiki/ISO_8601)' (seconds precision) or 'iso8601_ns' (fractional seconds precision) | double |
-| brokers | Single or multiple list of Kafka Brokers, e.g: 192.168.1.3:9092, 192.168.1.4:9092. |  |
-| topics | Single entry or list of topics separated by comma \(,\) that Fluent Bit will use to send messages to Kafka. If only one topic is set, that one will be used for all records. Instead if multiple topics exists, the one set in the record by Topic\_Key will be used. | fluent-bit |
-| topic\_key | If multiple Topics exists, the value of Topic\_Key in the record will indicate the topic to use. E.g: if Topic\_Key is _router_ and the record is {"key1": 123, "router": "route\_2"}, Fluent Bit will use topic _route\_2_. Note that if the value of Topic\_Key is not present in Topics, then by default the first topic in the Topics list will indicate the topic to be used. |  |
-| dynamic\_topic | adds unknown topics \(found in Topic\_Key\) to Topics. So in Topics only a default topic needs to be configured | Off |
-| queue\_full\_retries | Fluent Bit queues data into rdkafka library, if for some reason the underlying library cannot flush the records the queue might fills up blocking new addition of records. The `queue_full_retries` option set the number of local retries to enqueue the data. The default value is 10 times, the interval between each retry is 1 second. Setting the `queue_full_retries` value to `0` set's an unlimited number of retries. | 10 |
-| rdkafka.{property} | `{property}` can be any [librdkafka properties](https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md) |  |
+| `format` | Specify data format. Available formats: `json`, `msgpack`, `raw`. | `json` |
+| `message_key` | Optional key to store the message. | _none_ |
+| `message_key_field` | If set, the value of `message_key_field` in the record will indicate the message key. If not set nor found in the record, `message_key` will be used if set. | _none_ |
+| `timestamp_key` | Set the key to store the record timestamp | `@timestamp` |
+| `timestamp_format` | Specify timestamp format. Allowed values:`double`, `[iso8601](https://en.wikipedia.org/wiki/ISO_8601)` (seconds precision) or `iso8601_ns` (fractional seconds precision). | `double` |
+| `brokers` | Single or multiple list of Kafka Brokers. For example, `192.168.1.3:9092`, `192.168.1.4:9092`. | _none_ |
+| `topics` | Single entry or list of topics separated by comma (,) that Fluent Bit will use to send messages to Kafka. If only one topic is set, that one will be used for all records. Instead if multiple topics exists, the one set in the record by `Topic_Key` will be used. | `fluent-bit` |
+| `topic_key` | If multiple `topics` exist, the value of `Topic_Key` in the record will indicate the topic to use. For example, if `Topic_Key` is `router` and the record is `{"key1": 123, "router": "route_2"}`, Fluent Bit will use `topic _route_2_`. If the value of `Topic_Key` isn't present in `topics`, then the first topic in the `topics` list will indicate the topic to be used. | _none_ |
+| `dynamic_topic` | Adds unknown topics (found in `Topic_Key`) to `topics`. In `topics`, only a default topic needs to be configured. | `Off` |
+| `queue_full_retries` | Fluent Bit queues data into `rdkafka` library. If the underlying library can't flush the records the queue might fill up, blocking new addition of records. `queue_full_retries` sets the number of local retries to enqueue the data. The interval between retries is 1 second. Setting the `queue_full_retries` value to `0` sets an unlimited number of retries. | `10` |
+| `rdkafka.{property}` | `{property}` can be any [librdkafka properties](https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md) |  |
+| `raw_log_key` | When using the raw format and set, the value of `raw_log_key` in the record will be send to Kafka as the payload. | _none_ |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
-> Setting `rdkafka.log.connection.close` to `false` and `rdkafka.request.required.acks` to 1 are examples of recommended settings of librdfkafka properties.
+Setting `rdkafka.log.connection.close` to `false` and `rdkafka.request.required.acks` to `1` are examples of recommended settings of `librdfkafka` properties.
 
-## Getting Started
+## Get started
 
-In order to insert records into Apache Kafka, you can run the plugin from the command line or through the configuration file:
+To insert records into Apache Kafka, you can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-The **kafka** plugin can read parameters through the **-p** argument \(property\), e.g:
+The Kafka plugin can read parameters through the `-p` argument (property):
 
-```text
-$ fluent-bit -i cpu -o kafka -p brokers=192.168.1.3:9092 -p topics=test
+```shell
+fluent-bit -i cpu -o kafka -p brokers=192.168.1.3:9092 -p topics=test
 ```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file append the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+
+  outputs:
+    - name: kafka
+      match: '*'
+      host: 192.1681.3:9092
+      topics: test
+```
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name  cpu
+  Name  cpu
 
 [OUTPUT]
-    Name        kafka
-    Match       *
-    Brokers     192.168.1.3:9092
-    Topics      test
+  Name        kafka
+  Match       *
+  Brokers     192.168.1.3:9092
+  Topics      test
 ```
 
-### Avro Support
+{% endtab %}
+{% endtabs %}
 
-Fluent-bit comes with support for avro encoding for the out_kafka plugin.
-Avro support is optional and must be activated at build-time by using a
-build def with cmake: `-DFLB_AVRO_ENCODER=On` such as in the following
-example which activates:
+### Avro support
 
-* out_kafka with avro encoding
-* fluent-bit's prometheus
-* metrics via an embedded http endpoint
-* debugging support
-* builds the test suites
+Fluent Bit comes with support for Avro encoding for the `out_kafka` plugin. Avro support is optional and must be activated at build time by using a build def with `cmake`: `-DFLB_AVRO_ENCODER=On` such as in the following example which activates:
 
-```
+- `out_kafka` with Avro encoding
+- Fluent Bit Prometheus
+- Metrics using an embedded HTTP endpoint
+- Debugging support
+- Builds the test suites
+
+```shell
 cmake -DFLB_DEV=On -DFLB_OUT_KAFKA=On -DFLB_TLS=On -DFLB_TESTS_RUNTIME=On -DFLB_TESTS_INTERNAL=On -DCMAKE_BUILD_TYPE=Debug -DFLB_HTTP_SERVER=true -DFLB_AVRO_ENCODER=On ../
 ```
 
-#### Kafka Configuration File with Avro Encoding
+#### Kafka configuration file with Avro encoding
+
+In this example, the Fluent Bit configuration tails Kubernetes logs, updates the log lines with Kubernetes metadata using the Kubernetes filter. It then sends the updated log lines to a Kafka broker encoded with a specific Avro schema.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: tail
+      tag: kube.*
+      alias: some-alias
+      path: /logdir/*.log
+      db: /dbdir/some.db
+      skip_long_lines: on
+      refresh_interval: 10
+      parser: some-parser
+
+  filters:
+    - name: kubernetes
+      match: 'kube.*'
+      kube_url: https://some_kube_api:443
+      kube_ca_file: /certs/ca.crt
+      kube_token_file: /tokens/token
+      kube_tag_prefix: kube.var.log.containers.
+      merge_log: on
+      merge_log_key: log_processed
+
+  outputs:
+    - name: kafka
+      match: '*'
+      brokers: 192.168.1.3:9092
+      topics: test
+      schema_str:  '{"name":"avro_logging","type":"record","fields":[{"name":"timestamp","type":"string"},{"name":"stream","type":"string"},{"name":"log","type":"string"},{"name":"kubernetes","type":{"name":"krec","type":"record","fields":[{"name":"pod_name","type":"string"},{"name":"namespace_name","type":"string"},{"name":"pod_id","type":"string"},{"name":"labels","type":{"type":"map","values":"string"}},{"name":"annotations","type":{"type":"map","values":"string"}},{"name":"host","type":"string"},{"name":"container_name","type":"string"},{"name":"docker_id","type":"string"},{"name":"container_hash","type":"string"},{"name":"container_image","type":"string"}]}},{"name":"cluster_name","type":"string"},{"name":"fabric","type":"string"}]}'
+      schema_id: some_schema_id
+      rdkafka.client.id: some_client_id
+      rdkafka.debug: all
+      rdkafka.enable.ssl.certificate.verification: true
+      rdkafka.ssl.certificate.location: /certs/some.cert
+      rdkafka.ssl.key.location: /certs/some.key
+      rdkafka.ssl.ca.location: /certs/some-bundle.crt
+      rdkafka.security.protocol: ssl
+      rdkafka.request.required.acks: 1
+      rdkafka.log.connection.close: false
+      format: avro
+      rdkafka.log_level: 7
+      rdkafka.metadata.broker.list: 192.168.1.3:9092
+```
 
-This is example fluent-bit config tails kubernetes logs, decorates the
-log lines with kubernetes metadata via the kubernetes filter, and then
-sends the fully decorated log lines to a kafka broker encoded with a
-specific avro schema.
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name              tail
-    Tag               kube.*
-    Alias             some-alias
-    Path              /logdir/*.log
-    DB                /dbdir/some.db
-    Skip_Long_Lines   On
-    Refresh_Interval  10
-    Parser some-parser
+  Name              tail
+  Tag               kube.*
+  Alias             some-alias
+  Path              /logdir/*.log
+  DB                /dbdir/some.db
+  Skip_Long_Lines   On
+  Refresh_Interval  10
+  Parser some-parser
 
 [FILTER]
-    Name                kubernetes
-    Match               kube.*
-    Kube_URL            https://some_kube_api:443
-    Kube_CA_File        /certs/ca.crt
-    Kube_Token_File     /tokens/token
-    Kube_Tag_Prefix     kube.var.log.containers.
-    Merge_Log           On
-    Merge_Log_Key       log_processed
+  Name                kubernetes
+  Match               kube.*
+  Kube_URL            https://some_kube_api:443
+  Kube_CA_File        /certs/ca.crt
+  Kube_Token_File     /tokens/token
+  Kube_Tag_Prefix     kube.var.log.containers.
+  Merge_Log           On
+  Merge_Log_Key       log_processed
 
 [OUTPUT]
-    Name        kafka
-    Match       *
-    Brokers     192.168.1.3:9092
-    Topics      test
-    Schema_str  {"name":"avro_logging","type":"record","fields":[{"name":"timestamp","type":"string"},{"name":"stream","type":"string"},{"name":"log","type":"string"},{"name":"kubernetes","type":{"name":"krec","type":"record","fields":[{"name":"pod_name","type":"string"},{"name":"namespace_name","type":"string"},{"name":"pod_id","type":"string"},{"name":"labels","type":{"type":"map","values":"string"}},{"name":"annotations","type":{"type":"map","values":"string"}},{"name":"host","type":"string"},{"name":"container_name","type":"string"},{"name":"docker_id","type":"string"},{"name":"container_hash","type":"string"},{"name":"container_image","type":"string"}]}},{"name":"cluster_name","type":"string"},{"name":"fabric","type":"string"}]}
-    Schema_id some_schema_id
-    rdkafka.client.id some_client_id
-    rdkafka.debug All
-    rdkafka.enable.ssl.certificate.verification true
-
-    rdkafka.ssl.certificate.location /certs/some.cert
-    rdkafka.ssl.key.location /certs/some.key
-    rdkafka.ssl.ca.location /certs/some-bundle.crt
-    rdkafka.security.protocol ssl
-    rdkafka.request.required.acks 1
-    rdkafka.log.connection.close false
-
-    Format avro
-    rdkafka.log_level 7
-    rdkafka.metadata.broker.list 192.168.1.3:9092
+  Name        kafka
+  Match       *
+  Brokers     192.168.1.3:9092
+  Topics      test
+  Schema_str  {"name":"avro_logging","type":"record","fields":[{"name":"timestamp","type":"string"},{"name":"stream","type":"string"},{"name":"log","type":"string"},{"name":"kubernetes","type":{"name":"krec","type":"record","fields":[{"name":"pod_name","type":"string"},{"name":"namespace_name","type":"string"},{"name":"pod_id","type":"string"},{"name":"labels","type":{"type":"map","values":"string"}},{"name":"annotations","type":{"type":"map","values":"string"}},{"name":"host","type":"string"},{"name":"container_name","type":"string"},{"name":"docker_id","type":"string"},{"name":"container_hash","type":"string"},{"name":"container_image","type":"string"}]}},{"name":"cluster_name","type":"string"},{"name":"fabric","type":"string"}]}
+  Schema_id some_schema_id
+  rdkafka.client.id some_client_id
+  rdkafka.debug All
+  rdkafka.enable.ssl.certificate.verification true
+
+  rdkafka.ssl.certificate.location /certs/some.cert
+  rdkafka.ssl.key.location /certs/some.key
+  rdkafka.ssl.ca.location /certs/some-bundle.crt
+  rdkafka.security.protocol ssl
+  rdkafka.request.required.acks 1
+  rdkafka.log.connection.close false
+
+  Format avro
+  rdkafka.log_level 7
+  rdkafka.metadata.broker.list 192.168.1.3:9092
+```
+
+{% endtab %}
+{% endtabs %}
+
+#### Kafka configuration file with `raw`format
+
+This example Fluent Bit configuration file creates example records with the `payloadkey` and `msgkey` keys. The `msgkey` value is used as the Kafka message key, and the `payloadkey` value as the payload.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      tag: example.data
+      dummy: '{"payloadkey":"Data to send to kafka", "msgkey": "Key to use in the message"}'
+
+  outputs:
+    - name: kafka
+      match: '*'
+      host: 192.1681.3:9092
+      topics: test
+      format: raw
+      raw_log_key: payloadkey
+      message_key_field: msgkey
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[INPUT]
+  Name dummy
+  Tag  example.data
+  Dummy {"payloadkey":"Data to send to kafka", "msgkey": "Key to use in the message"}
+
+
+[OUTPUT]
+  Name        kafka
+  Match       *
+  Brokers     192.168.1.3:9092
+  Topics      test
+  Format      raw
+  Raw_Log_Key       payloadkey
+  Message_Key_Field msgkey
+```
+
+{% endtab %}
+{% endtabs %}
+
+## AWS MSK IAM authentication
+
+Fluent Bit 4.0.4 and later supports authentication to Amazon MSK (Managed Streaming for Apache Kafka) clusters using AWS IAM for the Kafka output plugin. This lets you securely send data to MSK brokers with AWS credentials, leveraging IAM roles and policies for access control.
+
+### Prerequisites
+
+If you are compiling Fluent Bit from source, ensure the following requirements are met to enable AWS MSK IAM support:
+
+- Build Requirements
+
+  The packages `libsasl2` and `libsasl2-dev` must be installed on your build environment.
+
+- Runtime Requirements:
+
+  - Network Access: Fluent Bit must be able to reach your MSK broker endpoints (AWS VPC setup).
+  - AWS Credentials: Provide credentials using any supported AWS method:
+    - IAM roles (recommended for EC2, ECS, or EKS)
+    - Environment variables (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`)
+    - AWS credentials file (`~/.aws/credentials`)
+    - Instance metadata service (IMDS)
+
+  These credentials are discovered by default when `aws_msk_iam` flag is enabled.
+
+-  IAM Permissions: The credentials must allow access to the target MSK cluster.
+
+### AWS MSK IAM configuration parameters
+
+This plugin supports the following parameters:
+
+| Property                  | Description                                         | Type    | Default                      |
+|---------------------------|-----------------------------------------------------|---------|-------------------------------|
+| `aws_msk_iam`             | Optional. Enable AWS MSK IAM authentication.         | Boolean | `false`           |
+| `aws_msk_iam_cluster_arn` | Full ARN of the MSK cluster for region extraction. Required if `aws_msk_iam` is set.   | String  | _none_ |
+
+### Configuration example
+
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: random
+
+  outputs:
+    - name: kafka
+      match: '*'
+      brokers: my-cluster.abcdef.c1.kafka.us-east-1.amazonaws.com:9098
+      topics: my-topic
+      aws_msk_iam: true
+      aws_msk_iam_cluster_arn: arn:aws:kafka:us-east-1:123456789012:cluster/my-cluster/abcdef-1234-5678-9012-abcdefghijkl-s3
+```
+
+{% endtab %}
+{% endtabs %}
+
+### AWS IAM policy
+
+IAM policies and permissions can be complex and can vary depending on your organization's security requirements. If you are unsure about the correct permissions or best practices, consult with your AWS administrator or an AWS expert who is familiar with MSK and IAM security.
+
+The AWS credentials used by Fluent Bit must have permission to connect to your MSK cluster. Here is a minimal example policy:
+
+```json
+{
+    "Version": "2012-10-17",
+    "Statement": [
+        {
+            "Sid": "VisualEditor0",
+            "Effect": "Allow",
+            "Action": [
+                "kafka-cluster:*",
+                "kafka-cluster:DescribeCluster",
+                "kafka-cluster:ReadData",
+                "kafka-cluster:DescribeTopic",
+                "kafka-cluster:Connect"
+            ],
+            "Resource": "*"
+        }
+    ]
+}
 ```
diff --git a/pipeline/outputs/kinesis.md b/pipeline/outputs/kinesis.md
index b21766678..047ba89f6 100644
--- a/pipeline/outputs/kinesis.md
+++ b/pipeline/outputs/kinesis.md
@@ -4,133 +4,128 @@ description: Send logs to Amazon Kinesis Streams
 
 # Amazon Kinesis Data Streams
 
-![](../../.gitbook/assets/image%20%288%29.png)
+The Amazon Kinesis Data Streams output plugin lets you ingest your records into the [Kinesis](https://aws.amazon.com/kinesis/data-streams/) service.
 
-The Amazon Kinesis Data Streams output plugin allows to ingest your records into the [Kinesis](https://aws.amazon.com/kinesis/data-streams/) service.
+This is the documentation for the core Fluent Bit Kinesis plugin written in C. It has all the core features of the [aws/amazon-kinesis-streams-for-fluent-bit](https://github.com/aws/amazon-kinesis-streams-for-fluent-bit) Golang Fluent Bit plugin released in 2019. The original Golang plugin is named `kinesis`, and this new high performance and highly efficient Kinesis plugin is called `kinesis_streams` to prevent conflicts or confusion.
 
-This is the documentation for the core Fluent Bit Kinesis plugin written in C. It has all the core features of the [aws/amazon-kinesis-streams-for-fluent-bit](https://github.com/aws/amazon-kinesis-streams-for-fluent-bit) Golang Fluent Bit plugin released in 2019. The Golang plugin was named `kinesis`; this new high performance and highly efficient kinesis plugin is called `kinesis_streams` to prevent conflicts/confusion.
+This `kinesis_streams` plugin always uses a random partition key when uploading records to Kinesis through the [PutRecords API](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html).
 
-Currently, this `kinesis_streams` plugin will always use a random partition key when uploading records to kinesis via the [PutRecords API](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html).
+For information about how AWS credentials are fetched, see [AWS credentials](../../administration/aws-credentials.md).
 
-See [here](https://github.com/fluent/fluent-bit-docs/tree/43c4fe134611da471e706b0edb2f9acd7cdfdbc3/administration/aws-credentials.md) for details on how AWS credentials are fetched.
+## Configuration parameters
 
-## Configuration Parameters
+| Key | Description | Default |
+| --- | ----------- | ------- |
+| `region` | The AWS region. | _none_ |
+| `stream` | The name of the Kinesis Streams Delivery stream that you want log records sent to. | _none_ |
+| `time_key` | Add the timestamp to the record under this key. | `false` |
+| `time_key_format` | The strftime compliant format string for the timestamp. Supports millisecond precision with `%3N` and supports nanosecond precision with `%9N` and `%L`. For example, adding `%3N` to support millisecond `%Y-%m-%dT%H:%M:%S.%3N`. This option is used with `time_key`. | `%Y-%m-%dT%H:%M:%S` |
+| `log_key` | By default, the whole log record will be sent to Kinesis. If you specify a key name with this option, then only the value of that key will be sent to Kinesis. For example, if you are using the Fluentd Docker log driver, you can specify `log_key log` and only the log message will be sent to Kinesis. | _none_ |
+| `role_arn` | ARN of an IAM role to assume (for cross account access). | _none_ |
+| `endpoint` | Specify a custom endpoint for the Kinesis API. | _none_ |
+| `port` | TCP port of the Kinesis Streams service. | `443` |
+| `sts_endpoint` | Custom endpoint for the STS API. | _none_ |
+| `auto_retry_requests` | Immediately retry failed requests to AWS services once. This option doesn't affect the normal Fluent Bit retry mechanism with backoff. Instead, it enables an immediate retry with no delay for networking errors, which might help improve throughput when there are transient/random networking issues. | `true` |
+| `external_id` | Specify an external ID for the STS API, can be used with the `role_arn` parameter if your role requires an external ID. | _none_ |
+| `profile` | AWS profile name to use. | `default` |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `1` |
 
-| Key | Description |
-| :--- | :--- |
-| region | The AWS region. |
-| stream | The name of the Kinesis Streams Delivery stream that you want log records sent to. |
-| time\_key | Add the timestamp to the record under this key. By default the timestamp from Fluent Bit will not be added to records sent to Kinesis. |
-| time\_key\_format | strftime compliant format string for the timestamp; for example, the default is '%Y-%m-%dT%H:%M:%S'. Supports millisecond precision with '%3N' and supports nanosecond precision with '%9N' and '%L'; for example, adding '%3N' to support millisecond '%Y-%m-%dT%H:%M:%S.%3N'. This option is used with time\_key. |
-| log\_key | By default, the whole log record will be sent to Kinesis. If you specify a key name with this option, then only the value of that key will be sent to Kinesis. For example, if you are using the Fluentd Docker log driver, you can specify `log_key log` and only the log message will be sent to Kinesis. |
-| role\_arn | ARN of an IAM role to assume \(for cross account access\). |
-| endpoint | Specify a custom endpoint for the Kinesis API. |
-| sts\_endpoint | Custom endpoint for the STS API. |
-| auto\_retry\_requests | Immediately retry failed requests to AWS services once. This option does not affect the normal Fluent Bit retry mechanism with backoff. Instead, it enables an immediate retry with no delay for networking errors, which may help improve throughput when there are transient/random networking issues. This option defaults to `true`. |
-| external\_id | Specify an external ID for the STS API, can be used with the role_arn parameter if your role requires an external ID. |
-| profile | AWS profile name to use. Defaults to `default`. |
+## Get started
 
-## Getting Started
+To send records into Amazon Kinesis Data Streams, you can run the plugin from the command line or through the configuration file.
 
-In order to send records into Amazon Kinesis Data Streams, you can run the plugin from the command line or through the configuration file:
+### Command line
 
-### Command Line
+The `kinesis_streams` plugin can read the parameters from the command line through the `-p` (property) argument. For example:
 
-The **kinesis\_streams** plugin, can read the parameters from the command line through the **-p** argument \(property\), e.g:
-
-```text
-$ fluent-bit -i cpu -o kinesis_streams -p stream=my-stream -p region=us-west-2 -m '*' -f 1
+```shell
+fluent-bit -i cpu -o kinesis_streams -p stream=my-stream -p region=us-west-2 -m '*' -f 1
 ```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file append the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-In your main configuration file append the following _Output_ section:
+```yaml
+pipeline:
+
+  outputs:
+    - name: kinesis_steams
+      match: '*'
+      region: us-east-1
+      stream: my-stream
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [OUTPUT]
-    Name  kinesis_streams
-    Match *
-    region us-east-1
-    stream my-stream
+  Name  kinesis_streams
+  Match *
+  region us-east-1
+  stream my-stream
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ### Permissions
 
 The following AWS IAM permissions are required to use this plugin:
 
-```
+```json
 {
-	"Version": "2012-10-17",
-	"Statement": [{
-		"Effect": "Allow",
-		"Action": [
-			"kinesis:PutRecords"
-		],
-		"Resource": "*"
-	}]
+  "Version": "2012-10-17",
+  "Statement": [{
+    "Effect": "Allow",
+    "Action": [
+      "kinesis:PutRecords"
+    ],
+    "Resource": "*"
+  }]
 }
 ```
 
-### Worker support
-
-Fluent Bit 1.7 adds a new feature called `workers` which enables outputs to have dedicated threads. This `kinesis_streams` plugin fully supports workers.
-
-Example:
-
-```text
-[OUTPUT]
-    Name  kinesis_streams
-    Match *
-    region us-east-1
-    stream my-stream
-    workers 2
-```
-
-If you enable a single worker, you are enabling a dedicated thread for your Kinesis output. We recommend starting with without workers, evaluating the performance, and then adding workers one at a time until you reach your desired/needed throughput. For most users, no workers or a single worker will be sufficient.
-
-### AWS for Fluent Bit
+## Container images
 
 Amazon distributes a container image with Fluent Bit and these plugins.
 
-#### GitHub
+### GitHub
 
-[github.com/aws/aws-for-fluent-bit](https://github.com/aws/aws-for-fluent-bit)
+The [aws-for-fluent-bit](https://github.com/aws/aws-for-fluent-bit) container image is available on GitHub.
 
-#### Amazon ECR Public Gallery
+### Amazon ECR Public Gallery
 
-[aws-for-fluent-bit](https://gallery.ecr.aws/aws-observability/aws-for-fluent-bit)
+The [aws-for-fluent-bit](https://gallery.ecr.aws/aws-observability/aws-for-fluent-bit) container image is available on the Amazon ECR Public Gallery. Use the following command to download images with different tags:
 
-Our images are available in Amazon ECR Public Gallery. You can download images with different tags by following command:
-
-```text
-docker pull public.ecr.aws/aws-observability/aws-for-fluent-bit:<tag>
+```shell
+docker pull public.ecr.aws/aws-observability/aws-for-fluent-bit:TAG
 ```
 
-For example, you can pull the image with latest version by:
-
-```text
-docker pull public.ecr.aws/aws-observability/aws-for-fluent-bit:latest
-```
+Replace `TAG` with the tag of the image you want to download. You can also use the value `latest` to download the latest image.
 
-If you see errors for image pull limits, try log into public ECR with your AWS credentials:
+If you see errors for image pull limits, try to log into the gallery with your AWS credentials:
 
-```text
+```shell
 aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
 ```
 
-You can check the [Amazon ECR Public official doc](https://docs.aws.amazon.com/AmazonECR/latest/public/get-set-up-for-amazon-ecr.html) for more details.
-
-#### Docker Hub
+You can use the Fluent Bit SSM Public Parameters to find the Amazon ECR image URI in your region:
 
-[amazon/aws-for-fluent-bit](https://hub.docker.com/r/amazon/aws-for-fluent-bit/tags)
+```shell
+aws ssm get-parameters-by-path --path /aws/service/aws-for-fluent-bit/
+```
 
-#### Amazon ECR
+For more details, see the [Amazon ECR Public official doc](https://docs.aws.amazon.com/AmazonECR/latest/public/get-set-up-for-amazon-ecr.html).
 
-You can use our SSM Public Parameters to find the Amazon ECR image URI in your region:
+### Docker Hub
 
-```text
-aws ssm get-parameters-by-path --path /aws/service/aws-for-fluent-bit/
-```
+The [aws-for-fluent-bit](https://hub.docker.com/r/amazon/aws-for-fluent-bit/tags) container image is available on Docker Hub.
 
-For more see [the AWS for Fluent Bit github repo](https://github.com/aws/aws-for-fluent-bit#public-images).
+### More information
 
+For more information, see the [aws-for-fluent-bit README](https://github.com/aws/aws-for-fluent-bit#public-images) on GitHub.
diff --git a/pipeline/outputs/logdna.md b/pipeline/outputs/logdna.md
index 3416dff2a..af77a76f7 100644
--- a/pipeline/outputs/logdna.md
+++ b/pipeline/outputs/logdna.md
@@ -1,104 +1,70 @@
 # LogDNA
 
-[LogDNA](https://logdna.com/) is an intuitive cloud based log management system that provides you an easy interface to query your logs once they are stored.
-
-The Fluent Bit `logdna` output plugin allows you to send your log or events to a [LogDNA](https://logdna.com/) compliant service like:
-
-* [LogDNA](https://logdna.com/)
-* [IBM Log Analysis](https://www.ibm.com/cloud/log-analysis)
-
-Before to get started with the plugin configuration, make sure to obtain the proper account to get access to the service. You can start with a free trial in the following link:
-
-* [LogDNA Sign Up ](https://logdna.com/sign-up/)
-
-## Configuration Parameters
-
-<table>
-  <thead>
-    <tr>
-      <th style="text-align:left">Key</th>
-      <th style="text-align:left">Description</th>
-      <th style="text-align:left">Default</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td style="text-align:left">logdna_host</td>
-      <td style="text-align:left">LogDNA API host address</td>
-      <td style="text-align:left">logs.logdna.com</td>
-    </tr>
-    <tr>
-      <td style="text-align:left">logdna_port</td>
-      <td style="text-align:left">LogDNA TCP Port</td>
-      <td style="text-align:left">443</td>
-    </tr>
-    <tr>
-      <td style="text-align:left">api_key</td>
-      <td style="text-align:left">API key to get access to the service. This property is <b>mandatory</b>.</td>
-      <td
-      style="text-align:left"></td>
-    </tr>
-    <tr>
-      <td style="text-align:left">hostname</td>
-      <td style="text-align:left">
-        <p>Name of the local machine or device where Fluent Bit is running.
-          <br />
-        </p>
-        <p>When this value is not set, Fluent Bit lookup the hostname and auto populate
-          the value. If it cannot be found, an <code>unknown</code> value will be set
-          instead.</p>
-      </td>
-      <td style="text-align:left"></td>
-    </tr>
-    <tr>
-      <td style="text-align:left">mac</td>
-      <td style="text-align:left">Mac address. This value is optional.</td>
-      <td style="text-align:left"></td>
-    </tr>
-    <tr>
-      <td style="text-align:left">ip</td>
-      <td style="text-align:left">IP address of the local hostname. This value is optional.</td>
-      <td style="text-align:left"></td>
-    </tr>
-    <tr>
-      <td style="text-align:left">tags</td>
-      <td style="text-align:left">A list of comma separated strings to group records in LogDNA and simplify
-        the query with filters.</td>
-      <td style="text-align:left"></td>
-    </tr>
-    <tr>
-      <td style="text-align:left">file</td>
-      <td style="text-align:left">Optional name of a file being monitored. Note that this value is only
-        set if the record do not contain a reference to it.</td>
-      <td style="text-align:left"></td>
-    </tr>
-    <tr>
-      <td style="text-align:left">app</td>
-      <td style="text-align:left">Name of the application. This value is auto discovered on each record,
-        if not found, the default value is used.</td>
-      <td style="text-align:left">Fluent Bit</td>
-    </tr>
-  </tbody>
-</table>
-
-## Auto Enrichment & Data Discovery
-
-One of the features of Fluent Bit + LogDNA integration is the ability to auto enrich each record with further context.
-
-When the plugin process each record \(or log\), it tries to lookup for specific key names that might contain specific context for the record in question, the following table describe the keys and the discovery logic:
+The _LogDNA_ output plugin sends logs and events to a LogDNA-compliant service.
+
+## Configuration parameters
+
+This plugin uses the following configuration parameters:
+
+| Key | Description | Default |
+| --- | ----------- | ------- |
+| `logdna_host` | The LogDNA API host address. | `logs.logdna.com` |
+| `logdna_port` | The LogDNA TCP Port. | `443` |
+| `logdna_endpoint` | The LogDNA ingestion endpoint. | `/logs/ingest` |
+| `api_key` | Required. The API key to get access to the service. | _none_ |
+| `hostname` | Name of the local machine or device where Fluent Bit is running. If no value is specifies, Fluent Bit will look up the hostname and auto populate its value. If Fluent Bit is unable to find a value, it will set the value `unknown` instead. | _none_ |
+| `mac` | The MAC address. This value is optional. |  |
+| `ip` | The IP address of the local hostname. This value is optional. |  |
+| `tags` | A list of comma-separated strings to group records in LogDNA and simplify the query with filters. | _none_ |
+| `file` | Optional name of a file being monitored. This value is only set if the record doesn't contain a reference to it. | _none_ |
+| `app` | Name of the application. This value is automatically discovered on each record. If no value is found, the default value is used. | `Fluent Bit` |
+| `workers` | The number of [workers](../../administration/multithreading#outputs) to perform flush operations for this output. | `0` |
+
+## Data discovery and enrichment
+
+The LogDNA output plugin can automatically discover and enrich records with additional content.
+
+When the login processes a record or log, it searches for specific key names that might contain context for the record in question. The following table describe these keys and the discovery logic:
 
 | Key | Description |
 | :--- | :--- |
-| level | If the record contains a key called `level` or `severity`, it will populate the context `level` key with that value. If not found, the context key is not set. |
-| file | if the record contains a key called `file`, it will populate the context `file` with the value found, otherwise If the plugin configuration provided a `file` property, that value will be used instead \(see table above\). |
-| app | If the record contains a key called `app`, it will populate the context `app` with the value found, otherwise it will use the value set for `app` in the configuration property \(see table above\). |
-| meta | if the record contains a key called `meta`, it will populate the context `meta` with the value found. |
-
-## Getting Started
+| `level` | If the record contains a key called `level` or `severity`, Fluent Bit will populate the context `level` key with that value. If not found, Fluent Bit won't set the context key. |
+| `file` | If the record contains a key called `file`, it will populate the context `file` with the value found. Otherwise, if the plugin configuration provided a `file` property, that value will be used instead. |
+| `app` | If the record contains a key called `app`, it will populate the context `app` with the value found, otherwise it will use the value set for `app` in the configuration property. |
+| `meta` | If the record contains a key called `meta`, it will populate the context `meta` with the value found. |
+
+## Example configuration
+
+The following example configuration uses a `dummy` input and `logdna` output:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"log":"a simple log message", "severity": "INFO", "meta": {"s1": 12345, "s2": true}, "app": "Fluent Bit"}'
+      samples: 1
+
+  outputs:
+    - name: logdna
+      match: '*'
+      api_key: YOUR_API_KEY_HERE
+      hostname: my-hostname
+      ip: 192.168.1.2
+      mac: aa:bb:cc:dd:ee:ff
+      tags: aa, bb
+```
 
-The following configuration example, will emit a dummy example record and ingest it on LogDNA. Copy and paste the following content in a file called `logdna.conf`:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [SERVICE]
     flush     1
     log_level info
@@ -118,36 +84,35 @@ The following configuration example, will emit a dummy example record and ingest
     tags      aa, bb
 ```
 
-run Fluent Bit with the new configuration file:
+{% endtab %}
+{% endtabs %}
 
-```text
-$ fluent-bit -c logdna.conf
+Run Fluent Bit with the new configuration file:
+
+```shell
+# For YAML configuration.
+fluent-bit --config fluent-bit.yaml
+
+# For classic configuration.
+fluent-bit --config fluent-bit.conf
 ```
 
 Fluent Bit output:
 
 ```text
-Fluent Bit v1.5.0
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
-
-[2020/04/07 17:44:37] [ info] [storage] version=1.0.3, initializing...
-[2020/04/07 17:44:37] [ info] [storage] in-memory
-[2020/04/07 17:44:37] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128
+...
 [2020/04/07 17:44:37] [ info] [engine] started (pid=2157706)
 [2020/04/07 17:44:37] [ info] [output:logdna:logdna.0] configured, hostname=monox-fluent-bit-2
 [2020/04/07 17:44:37] [ info] [sp] stream processor started
 [2020/04/07 17:44:38] [ info] [output:logdna:logdna.0] logs.logdna.com:443, HTTP status=200
 {"status":"ok","batchID":"f95849a8-ec6c-4775-9d52-30763604df9b:40710:ld72"}
+...
 ```
 
 Your record will be available and visible in your LogDNA dashboard after a few seconds.
 
-### Query your Data in LogDNA
-
-In your LogDNA dashboard, go to the top filters and mark the Tags `aa` and `bb`, then you will be able to see your records as the example below:
+### Query your data in LogDNA
 
-![](../../.gitbook/assets/logdna.png)
+In your LogDNA dashboard, go to the top filters and mark the Tags `aa` and `bb`, then you will be able to see your records as shown:
 
+![LogDNA dashboard](../../.gitbook/assets/logdna.png)
diff --git a/pipeline/outputs/loki.md b/pipeline/outputs/loki.md
index 09c40b9d9..0343dcbd9 100644
--- a/pipeline/outputs/loki.md
+++ b/pipeline/outputs/loki.md
@@ -1,255 +1,602 @@
 # Loki
 
 [Loki](https://grafana.com/oss/loki/) is multi-tenant log aggregation system inspired by Prometheus.
-It is designed to be very cost effective and easy to operate.
 
-The Fluent Bit `loki` built-in output plugin allows you to send your log or events to a Loki service.
-It supports data enrichment with Kubernetes labels, custom label keys and Tenant ID within others.
+The Fluent Bit _Loki_ built-in output plugin lets you send your log or events to a Loki service. It supports data enrichment with Kubernetes labels, custom label keys, and Tenant ID, along with other information.
 
-Be aware there is a separate Golang output plugin provided by [Grafana](https://grafana.com/docs/loki/latest/clients/fluentbit/) with different configuration options.
+There is a separate Golang output plugin provided by [Grafana](https://grafana.com/docs/loki/latest/clients/fluentbit/) with different configuration options.
 
-## Configuration Parameters
+## Configuration parameters
 
 | Key | Description | Default |
-| :--- | :--- | :--- |
-| host | Loki hostname or IP address. Do not include the subpath, i.e. `loki/api/v1/push`, but just the base hostname/URL.  | 127.0.0.1 |
-| uri | Specify a custom HTTP URI. It must start with forward slash.| /loki/api/v1/push |
-| port | Loki TCP port | 3100 |
-| tls | Use TLS authentication | off |
-| http\_user | Set HTTP basic authentication user name |  |
-| http\_passwd | Set HTTP basic authentication password |  |
-| bearer\_token | Set bearer token authentication token value. |  |
-| header | Add additional arbitrary HTTP header key/value pair. Multiple headers can be set. |  |
-| tenant\_id | Tenant ID used by default to push logs to Loki. If omitted or empty it assumes Loki is running in single-tenant mode and no X-Scope-OrgID header is sent. |  |
-| labels | Stream labels for API request. It can be multiple comma separated of strings specifying  `key=value` pairs. In addition to fixed parameters, it also allows to add custom record keys \(similar to `label_keys` property\). More details in the Labels section. | job=fluent-bit |
-| label\_keys | Optional list of record keys that will be placed as stream labels. This configuration property is for records key only. More details in the Labels section. |  |
-| label\_map\_path | Specify the label map file path. The file defines how to extract labels from each record. More details in the Labels section. | |
-| remove\_keys | Optional list of keys to remove. | |
-| drop\_single\_key | If set to true and after extracting labels only a single key remains, the log line sent to Loki will be the value of that key in line\_format. | off |
-| line\_format | Format to use when flattening the record to a log line. Valid values are `json` or `key_value`. If set to `json`,  the log line sent to Loki will be the Fluent Bit record dumped as JSON. If set to `key_value`, the log line will be each item in the record concatenated together \(separated by a single space\) in the format. | json |
-| auto\_kubernetes\_labels | If set to true, it will add all Kubernetes labels to the Stream labels | off |
-| tenant\_id\_key | Specify the name of the key from the original record that contains the Tenant ID. The value of the key is set as `X-Scope-OrgID` of HTTP header. It is useful to set Tenant ID dynamically. ||
-| compress | Set payload compression mechanism. The only available option is gzip. Default = "", which means no compression. ||
+|:----|:------------|:--------|
+| `host` | Loki base hostname or IP address. Don't include the sub-path, only the base hostname or URL.  | `127.0.0.1`         |
+| `uri`  | Specify a custom HTTP URI. It must start with a forward slash (`/`).| `/loki/api/v1/push` |
+| `port` | The Loki TCP port. | `3100` |
+| `tls` | Use TLS authentication. | `off` |
+| `http_user` | Set HTTP basic authentication user name. | _none_ |
+| `http_passwd` | Set HTTP basic authentication password. | _none_ |
+| `bearer_token` | Set bearer token authentication token value. | _none_ |
+| `header` | Add additional arbitrary HTTP header key/value pair. Multiple headers can be set. | _none_ |
+| `tenant_id` | Tenant ID used by default to push logs to Loki. If omitted or empty it assumes Loki is running in single-tenant mode and no `X-Scope-OrgID` header is sent. | _none_ |
+| `labels` | Stream labels for API request. It can be multiple comma separated of strings specifying `key=value` pairs. Allows fixed parameters, or adding custom record keys (similar to the `label_keys` property). See the Labels section. | `job=fluent-bit` |
+| `label_keys` | (Optional.) List of record keys that will be placed as stream labels. This configuration property is for records key only. See the Labels section. | _none_ |
+| `label_map_path` | Specify the label map path. The file defines how to extract labels from each record. See the Labels section. | _none_ |
+| `structured_metadata` | (Optional.) Comma-separated list of `key=value` strings specifying structured metadata for the log line. Like the `labels` parameter, values can reference record keys using record accessors. See [Use `structured_metadata`.](#use-structured_metadata). | _none_ |
+| `structured_metadata_map_keys` | (Optional.) Comma-separated list of record key strings specifying record values of type `map`, used to dynamically populate structured metadata for the log line. Values can only reference record keys using record accessors, which should reference map values. Each entry from the referenced map will be used to add an entry to the structured metadata. See [Use `structured_metadata`.](#use-structured_metadata). | _none_ |
+| `remove_keys` | (Optional.) List of keys to remove. | _none_ |
+| `drop_single_key` | When set to `true` and after extracting labels only a single key remains, the log line sent to Loki will be the value of that key in `line_format`. If set to `raw` and the log line is a string, the log line will be sent unquoted. | `off` |
+| `line_format` | Format to use when flattening the record to a log line. Valid values are `json` or `key_value`. If set to `json`, the log line sent to Loki will be the Fluent Bit record dumped as JSON. If set to `key_value`, the log line will be each item in the record concatenated together (separated by a single space) in the format. | `json` |
+| `auto_kubernetes_labels` | If set to `true`, adds all Kubernetes labels to the Stream labels. | `off` |
+| `tenant_id_key` | Specify the name of the key from the original record that contains the Tenant ID. The value of the key is set as `X-Scope-OrgID` of HTTP header. Use to set Tenant ID dynamically. | _none_ |
+| `compress` | Set payload compression mechanism. The only available option is `gzip`. | `""` (no compression) |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
 ## Labels
 
-Loki store the record logs inside Streams, a stream is defined by a set of labels, at least one label is required.
+Loki stores the record logs inside Streams. A stream is defined by a set of labels, and at least one label is required.
 
-Fluent Bit implements a flexible mechanism to set labels by using fixed key/value pairs of text but also allowing to set as labels certain keys that exists as part of the records that are being processed.
-Consider the following JSON record \(pretty printed for readability\):
+Fluent Bit implements a flexible mechanism to set labels by using fixed key/value pairs of text. It also allows setting as labels certain keys that exists as part of the records that are being processed.
 
-```javascript
+Consider the following JSON record (pretty printed for readability):
+
+```json
 {
-    "key": 1,
-    "sub": {
-        "stream": "stdout",
-        "id": "some id"
-    },
-    "kubernetes": {
-        "labels": {
-            "team": "Santiago Wanderers"
-        }
+  "key": 1,
+  "sub": {
+    "stream": "stdout",
+    "id": "some id"
+  },
+  "kubernetes": {
+    "labels": {
+      "team": "Santiago Wanderers"
     }
+  }
 }
 ```
 
-If you decide that your Loki Stream will be composed by two labels called `job` and the value of the record key called `stream` , your `labels` configuration properties might look as follows:
+If you decide that your Loki Stream will be composed by two labels called `job` and the value of the record key called `stream` , your `labels` configuration properties might look something like the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: loki
+      match: '*'
+      labels: job=fluentbit, $sub['stream']
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [OUTPUT]
-    name   loki
-    match  *
-    labels job=fluentbit, $sub['stream']
+  name   loki
+  match  *
+  labels job=fluentbit, $sub['stream']
 ```
 
-As you can see the label `job` has the value `fluentbit` and the second label is configured to access the nested map called `sub` targeting the value of the key `stream` .
-Note that the second label name **must** starts with a `$`, that means that's a [Record Accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md) pattern so it provide you the ability to retrieve values from nested maps by using the key names.
+{% endtab %}
+{% endtabs %}
+
+The label `job` has the value `fluentbit` and the second label is configured to access the nested map called `sub` targeting the value of the key `stream` .
+
+The second label name must start with a dollar sign `$`, meaning it's a [Record Accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md) pattern, which provides the ability to retrieve values from nested maps by using the key names.
 
-When processing above's configuration, internally the ending labels for the stream in question becomes:
+When processing the previous configuration, internally the ending labels for the stream in question becomes:
 
 ```text
 job="fluentbit", stream="stdout"
 ```
 
-Another feature of Labels management is the ability to provide custom key names, using the same record accessor pattern we can specify the key name manually and let the value to be populated automatically at runtime, e.g:
+Another feature of Labels management is the ability to provide custom key names. Using the same record accessor pattern you can specify the key name manually and let the value populate automatically at runtime:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: loki
+      match: '*'
+      labels: job=fluentbit, mystream=$sub['stream']
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [OUTPUT]
-    name   loki
-    match  *
-    labels job=fluentbit, mystream=$sub['stream']
+  name   loki
+  match  *
+  labels job=fluentbit, mystream=$sub['stream']
 ```
 
+{% endtab %}
+{% endtabs %}
+
 When processing that new configuration, the internal labels will be:
 
 ```text
 job="fluentbit", mystream="stdout"
 ```
 
-### Using the `label_keys` property
+### Use `label_keys`
 
-The additional configuration property called `label_keys` allow to specify multiple record keys that needs to be placed as part of the outgoing Stream Labels, yes, this is a similar feature than the one explained above in the `labels` property.
-Consider this as another way to set a record key in the Stream, but with the limitation that you cannot use a custom name for the key value.
+The `label_keys` configuration property lets you specify multiple record keys which need to be placed as part of the outgoing Stream Labels. This is another way to set a record key in the Stream, but with the limitation that you can't use a custom name for the key value.
 
 The following configuration examples generate the same Stream Labels:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: loki
+      match: '*'
+      labels: job=fluentbit
+      label_keys: $sub['stream']
+```
+
+{% endtab %}
+
+{% tab title="fluent-bit.conf" %}
+
 ```text
 [OUTPUT]
-    name       loki
-    match      *
-    labels     job=fluentbit
-    label_keys $sub['stream']
+  name       loki
+  match      *
+  labels     job=fluentbit
+  label_keys $sub['stream']
+```
+
+{% endtab %}
+{% endtabs %}
+
+The previous configuration accomplishes the same as this one:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: loki
+      match: '*'
+      labels: job=fluentbit, $sub['stream']
 ```
 
-the above configuration accomplish the same than this one:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [OUTPUT]
-    name   loki
-    match  *
-    labels job=fluentbit, $sub['stream']
+  name   loki
+  match  *
+  labels job=fluentbit, $sub['stream']
 ```
 
-both will generate the following Streams label:
+{% endtab %}
+{% endtabs %}
+
+Both generate the following Streams label:
 
 ```text
 job="fluentbit", stream="stdout"
 ```
 
-### Using the `label_map_path` property
+### Use `label_map_path`
 
-The configuration property `label_map_path` is to read a JSON file that defines how to extract labels from each record.
+The `label_map_path` configuration property reads a JSON file that defines how to extract labels from each record.
 
-The file should contain a JSON object. Each keys define how to get label value from a nested record. Each values are used as label names.
+The file should contain a JSON object. Each key defines how to get label value from a nested record. Each value is used as a label name.
 
 The following configuration examples generate the same Stream Labels:
 
-map.json:
+`map.json`:
+
 ```json
 {
-    "sub": {
-           "stream": "stream"
-    }
+  "sub": {
+    "stream": "stream"
+  }
 }
 ```
 
-The following configuration examples generate the same Stream Labels:
+Add the JSON path to the plugin output configuration:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: loki
+      match: '*'
+      label_map_path: /path/to/map.json
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [OUTPUT]
-    name   loki
-    match  *
-    label_map_path /path/to/map.json
+  name   loki
+  match  *
+  label_map_path /path/to/map.json
 ```
 
+{% endtab %}
+{% endtabs %}
 
-the above configuration accomplish the same than this one:
+The previous configurations accomplish the same as this one:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: loki
+      match: '*'
+      labels: job=fluentbit, $sub['stream']
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [OUTPUT]
-    name   loki
-    match  *
-    labels job=fluentbit, $sub['stream']
+  name   loki
+  match  *
+  labels job=fluentbit, $sub['stream']
 ```
 
-both will generate the following Streams label:
+{% endtab %}
+{% endtabs %}
+
+Both will generate the following Streams label:
 
 ```text
 job="fluentbit", stream="stdout"
 ```
 
-### Kubernetes & Labels
+#### Kubernetes and labels
+
+If you're running in a Kubernetes environment, consider enabling the `auto_kubernetes_labels` option, which populates the streams with the Pod labels for you. Consider the following configuration:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
 
-Note that if you are running in a Kubernetes environment, you might want to enable the option `auto_kubernetes_labels` which will auto-populate the streams with the Pod labels for you. Consider the following configuration:
+  outputs:
+    - name: loki
+      match: '*'
+      labels: job=fluentbit
+      auto_kubernetes_labels: on
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```python
+```text
 [OUTPUT]
-    name                   loki
-    match                  *
-    labels                 job=fluentbit
-    auto_kubernetes_labels on
+  name                   loki
+  match                  *
+  labels                 job=fluentbit
+  auto_kubernetes_labels on
 ```
 
-Based in the JSON example provided above, the internal stream labels will be:
+{% endtab %}
+{% endtabs %}
+
+Based on the JSON example provided, the internal stream labels will be:
 
 ```text
 job="fluentbit", team="Santiago Wanderers"
 ```
 
-## Networking and TLS Configuration
+## Use `drop_single_key`
+
+If there's only one key remaining after removing keys, you can use the `drop_single_key` property to send its value to Loki, rather than a single `key=value` pair.
+
+Consider this JSON example:
+
+```json
+{"key":"value"}
+```
+
+If the value is a string, `line_format` is `json`, and `drop_single_key` is `true`, it will be sent as a quoted string.
 
-This plugin inherit core Fluent Bit features to customize the network behavior and optionally enable TLS in the communication channel. For more details about the specific options available refer to the following articles:
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-* [Networking Setup](../../administration/networking.md): timeouts, keepalive and source address
-* [Security & TLS](../../administration/transport-security.md): all about TLS configuration and certificates
+```yaml
+pipeline:
 
-Note that all options mentioned in the articles above must be enabled in the plugin configuration in question.
+  outputs:
+    - name: loki
+      match: '*'
+      drop_single_key: on
+      line_format: json
+```
 
-### Fluent Bit + Grafana Cloud
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-Fluent Bit supports sending logs (and metrics) to [Grafana Cloud](https://grafana.com/products/cloud/) by providing the appropriate URL and ensuring TLS is enabled.
+```text
+[OUTPUT]
+  name            loki
+  match           *
+  drop_single_key on
+  line_format     json
+```
 
-An example configuration - make sure to set the credentials and ensure the host URL matches the correct one for your deployment:
+{% endtab %}
+{% endtabs %}
+
+The outputted line would show in Loki as:
 
 ```text
-    [OUTPUT]
-        Name        loki
-        Match       *
-        Host        logs-prod-eu-west-0.grafana.net
-        port        443
-        tls         on
-        tls.verify  on
-        http_user   XXX
-        http_passwd XXX
+"value"
 ```
 
-## Getting Started
+If `drop_single_key` is `raw`, or `line_format` is `key_value`, it will show in Loki as:
+
+```text
+value
+```
 
-The following configuration example, will emit a dummy example record and ingest it on Loki .
-Copy and paste the following content into a file called `out_loki.conf`:
+If you want both structured JSON and plain text logs in Loki, set `drop_single_key` to `raw` and `line_format` to `json`. Loki doesn't interpret a quoted string as valid JSON. To remove the quotes without `drop_single_key` set to `raw`, use a query like this:
 
 ```text
-[SERVICE]
-    flush     1
-    log_level info
+{"job"="fluent-bit"} | regexp `^"?(?P<log>.*?)"?$` | line_format "{{.log}}"
+```
 
-[INPUT]
-    name      dummy
-    dummy     {"key": 1, "sub": {"stream": "stdout", "id": "some id"}, "kubernetes": {"labels": {"team": "Santiago Wanderers"}}}
-    samples   1
+If `drop_single_key` is `off`, it will show in Loki as:
 
+```json
+{"key":"value"}
+```
+
+You can get the same behavior this flag provides in Loki with `drop_single_key` set to `off` with this query:
+
+```text
+{"job"="fluent-bit"} | json | line_format "{{.log}}"
+```
+
+## Use `structured_metadata`
+
+[Structured metadata](https://grafana.com/docs/loki/latest/get-started/labels/structured-metadata/) lets you attach custom fields to individual log lines without embedding the information in the content of the log line. This capability works well for high cardinality data that isn't suited for using labels. Although not a label, the `structured_metadata` configuration parameter operates similarly to the `labels` parameter. Both parameters are comma-delimited `key=value` lists, and both can use record accessors to reference keys within the record being processed.
+
+The following configuration:
+
+- Defines fixed values for the cluster and region labels.
+- Uses the record accessor pattern to set the namespace label to the namespace name as determined by the Kubernetes metadata filter (not shown).
+- Uses a structured metadata field to hold the Kubernetes pod name.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: loki
+      match: '*'
+      labels: cluster=my-k8s-cluster, region=us-east-1, namespace=$kubernetes['namespace_name']
+      structured_metadata: pod=$kubernetes['pod_name']
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-    name                   loki
-    match                  *
-    host                   127.0.0.1
-    port                   3100
-    labels                 job=fluentbit
-    label_keys             $sub['stream']
-    auto_kubernetes_labels on
+  name                loki
+  match               *
+  labels              cluster=my-k8s-cluster, region=us-east-1, namespace=$kubernetes['namespace_name']
+  structured_metadata pod=$kubernetes['pod_name']
+```
+
+{% endtab %}
+{% endtabs %}
+
+Other common uses for structured metadata include trace and span IDs, process and thread IDs, and log levels.
+
+Structured metadata is officially supported starting with Loki 3.0, and shouldn't be used with Loki deployments prior to Loki 3.0.
+
+### Structured metadata maps
+
+In addition to the `structured_metadata` configuration parameter, a `structured_metadata_map_keys` is available, which can be used to dynamically populate structured metadata from map values in the log record. `structured_metadata_map_keys` can be set with a list of record accessors, where each one should reference map values in the log record. Record accessors which don't match a map value will be skipped.
+
+The following configuration is similar to the previous example, except now all entries in the log record map value `$kubernetes` will be used as structured metadata entries:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: loki
+      match: '*'
+      labels: cluster=my-k8s-cluster, region=us-east-1
+      structured_metadata_map_keys: $kubernetes
 ```
 
-run Fluent Bit with the new configuration file:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
-$ fluent-bit -c out_loki.conf
+[OUTPUT]
+  name                         loki
+  match                        *
+  labels                       cluster=my-k8s-cluster, region=us-east-1
+  structured_metadata_map_keys $kubernetes
+```
+
+{% endtab %}
+{% endtabs %}
+
+Assuming the value `$kubernetes` is a map containing two entries `namespace_name` and `pod_name`, the previous configuration is equivalent to:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: loki
+      match: '*'
+      labels: cluster=my-k8s-cluster, region=us-east-1
+      structured_metadata: $kubernetes['namespace_name'], $kubernetes['pod_name']
 ```
 
-Fluent Bit output:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
-Fluent Bit v1.7.0
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+[OUTPUT]
+  name                loki
+  match               *
+  labels              cluster=my-k8s-cluster, region=us-east-1
+  structured_metadata $kubernetes['namespace_name'],$kubernetes['pod_name']
+```
 
-[2020/10/14 20:57:45] [ info] [engine] started (pid=809736)
-[2020/10/14 20:57:45] [ info] [storage] version=1.0.6, initializing...
-[2020/10/14 20:57:45] [ info] [storage] in-memory
-[2020/10/14 20:57:45] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128
-[2020/10/14 20:57:45] [ info] [output:loki:loki.0] configured, hostname=127.0.0.1:3100
-[2020/10/14 20:57:45] [ info] [sp] stream processor started
-[2020/10/14 20:57:46] [debug] [http] request payload (272 bytes)
-[2020/10/14 20:57:46] [ info] [output:loki:loki.0] 127.0.0.1:3100, HTTP status=204
+{% endtab %}
+{% endtabs %}
+
+## Networking and TLS configuration
+
+This plugin inherits core Fluent Bit features to customize the network behavior and optionally enable TLS in the communication channel. For more details about the specific options available, refer to the following articles:
+
+- [Networking Setup](../../administration/networking.md): timeouts, keepalive and source address
+- [Security and TLS](../../administration/transport-security.md): all about TLS configuration and certificates
+
+All options mentioned in these articles must be enabled in the plugin configuration in question.
+
+### Fluent Bit and Grafana Cloud
+
+Fluent Bit supports sending logs and metrics to [Grafana Cloud](https://grafana.com/products/cloud/) by providing the appropriate URL and ensuring TLS is enabled.
+
+The following samples show example configurations. Be sure to set the credentials (shown here with `XXX`) and ensure the host URL matches the correct one for your deployment:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: loki
+      match: '*'
+      host: logs-prod-eu-west-0.grafana.net
+      port: 433
+      tls: on
+      tls.verify: on
+      http_user: XXX
+      http_password: XXX
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[OUTPUT]
+  Name        loki
+  Match       *
+  Host        logs-prod-eu-west-0.grafana.net
+  port        443
+  tls         on
+  tls.verify  on
+  http_user   XXX
+  http_passwd XXX
+```
+
+{% endtab %}
+{% endtabs %}
+
+## Get started
+
+The following configuration example emits a dummy example record and ingests it on Loki. Copy and paste the following content into a file `out_loki.yaml` or `out_loki.conf`:
+
+{% tabs %}
+{% tab title="out-loki.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"key": 1, "sub": {"stream": "stdout", "id": "some id"}, "kubernetes": {"labels": {"team": "Santiago Wanderers"}}}'
+      samples: 1
+
+  outputs:
+    - name: loki
+      match: '*'
+      host: 127.0.0.1
+      port: 3100
+      labels: job=fluentbit
+      label_keys: $sub['stream']
+      auto_kubernetes_labels: on
 ```
 
+{% endtab %}
+{% tab title="out-loki.conf" %}
+
+```text
+[SERVICE]
+  flush     1
+  log_level info
+
+[INPUT]
+  name      dummy
+  dummy     {"key": 1, "sub": {"stream": "stdout", "id": "some id"}, "kubernetes": {"labels": {"team": "Santiago Wanderers"}}}
+  samples   1
+
+[OUTPUT]
+  name                   loki
+  match                  *
+  host                   127.0.0.1
+  port                   3100
+  labels                 job=fluentbit
+  label_keys             $sub['stream']
+  auto_kubernetes_labels on
+```
+
+{% endtab %}
+{% endtabs %}
+
+Run Fluent Bit with the corresponding new configuration file:
+
+```shell
+# For YAML configuration.
+fluent-bit --config out_loki.yaml
+
+# For classic configuration.
+fluent-bit --config out_loki.conf
+```
+
+Which returns output that similar to the following:
+
+```text
+...
+[2020/10/14 20:57:46] [ info] [output:loki:loki.0] 127.0.0.1:3100, HTTP status=204
+...
+```
diff --git a/pipeline/outputs/nats.md b/pipeline/outputs/nats.md
index c2586e45a..65d865f6d 100644
--- a/pipeline/outputs/nats.md
+++ b/pipeline/outputs/nats.md
@@ -1,32 +1,29 @@
 # NATS
 
-The **nats** output plugin, allows to flush your records into a [NATS Server](https://docs.nats.io/nats-concepts/intro) end point. The following instructions assumes that you have a fully operational NATS Server in place.
+The _NATS_ output plugin lets you flush your records into a [NATS Server](https://docs.nats.io/) server endpoint.
 
-In order to flush records, the **nats** plugin requires to know two parameters:
+## Configuration parameters
 
-| parameter | description | default |
-| :--- | :--- | :--- |
-| host | IP address or hostname of the NATS Server | 127.0.0.1 |
-| port | TCP port of the target NATS Server | 4222 |
+| Key | Description | Default |
+| --- | ----------- | ------- |
+| `host` | The IP address or hostname of the NATS server. | `127.0.0.1` |
+| `port` | The TCP port of the target NATS server. | `4222` |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
-In order to override the default configuration values, the plugin uses the optional Fluent Bit network address format, e.g:
+{% hint style="info" %}
 
-```text
-nats://host:port
-```
+To override the default configuration values, this plugin uses the optional Fluent Bit network address format (for example, `nats://host:port`).
 
-## Running
+{% endhint %}
 
-[Fluent Bit](http://fluentbit.io) only requires to know that it needs to use the **nats** output plugin, if no extra information is given, it will use the default values specified in the above table.
+## Get started
 
-```bash
-$ bin/fluent-bit -i cpu -o nats -V -f 5
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+You can get started with the NATS output plugin through the command line. If you use the following command without specifying parameter values, Fluent Bit uses the default values defined in the previous section.
 
+```shell
+$ fluent-bit -i cpu -o nats -V -f 5
+
+...
 [2016/03/04 10:17:33] [ info] Configuration
 flush time     : 5 seconds
 input plugins  : cpu
@@ -41,13 +38,11 @@ cpu[i=3] all=6.000000 user=5.000000 system=1.000000
 ...
 ```
 
-As described above, the target service and storage point can be changed, e.g:
-
 ## Data format
 
-For every set of records flushed to a NATS Server, Fluent Bit uses the following JSON format:
+For every set of records flushed to a NATS server, Fluent Bit uses the following format:
 
-```javascript
+```text
 [
   [UNIX_TIMESTAMP, JSON_MAP_1],
   [UNIX_TIMESTAMP, JSON_MAP_2],
@@ -55,13 +50,12 @@ For every set of records flushed to a NATS Server, Fluent Bit uses the following
 ]
 ```
 
-Each record is an individual entity represented in a JSON array that contains a UNIX\_TIMESTAMP and a JSON map with a set of key/values. A summarized output of the CPU input plugin will looks as this:
+Each record is an individual entity represented in a JSON array that contains a Unix timestamp and a JSON map with a set of key/value pairs. A summarized output of the CPU input plugin will resemble the following:
 
-```text
+```json
 [
   [1457108504,{"tag":"fluentbit","cpu_p":1.500000,"user_p":1,"system_p":0.500000}],
   [1457108505,{"tag":"fluentbit","cpu_p":4.500000,"user_p":3,"system_p":1.500000}],
   [1457108506,{"tag":"fluentbit","cpu_p":6.500000,"user_p":4.500000,"system_p":2}]
 ]
 ```
-
diff --git a/pipeline/outputs/new-relic.md b/pipeline/outputs/new-relic.md
index 29219f6c8..7c5224a17 100644
--- a/pipeline/outputs/new-relic.md
+++ b/pipeline/outputs/new-relic.md
@@ -1,120 +1,78 @@
 # New Relic
 
-[New Relic](https://newrelic.com/) is a data management platform that gives you real-time insights of your data for developers, operations and management teams.
+The _New Relic_ output plugin lets you send logs to New Relic.
 
-The Fluent Bit `nrlogs` output plugin allows you to send your logs to New Relic service.
+## Configuration parameters
 
-Before to get started with the plugin configuration, make sure to obtain the proper account to get access to the service. You can register and start with a free trial in the following link:
-
-* [New Relic Sign Up](https://newrelic.com/signup)
+| Key | Description | Default |
+| --- | ----------- | ------- |
+| `base_uri` | The New Relic API endpoint. | `https://log-api.newrelic.com/log/v1`|
+| `api_key` | Your [New Relic API key](https://docs.newrelic.com/docs/apis/intro-apis/new-relic-api-keys/). Either an `api_key` or `license_key` is required.| _none_ |
+| `license_key` | Your [New Relic license key](https://docs.newrelic.com/docs/apis/intro-apis/new-relic-api-keys/). Either an `api_key` or `license_key` is required. | _none_ |
+| `compress` | Sets the compression mechanism for the payload. Possible values: `gzip` or `false`. | `gzip` |
+| `workers` | Sets the number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
+
+## Example configuration
+
+The following example configuration uses a `dummy` input plugin and a `nrlogs` output plugin.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"message":"a simple message", "temp": "0.74", "extra": "false"}'
+      samples: 1
+
+  outputs:
+    - name: nrlogs
+      match: '*'
+      api_key: YOUR_API_KEY_HERE
+```
 
-## Configuration Parameters
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-
-
-<table>
-  <thead>
-    <tr>
-      <th style="text-align:left">base_uri</th>
-      <th style="text-align:left">
-        <p>Full address of New Relic API end-point. By default the value points to
-          the US end-point.
-          <br />
-        </p>
-        <p>If you want to use the EU end-point you can set this key to the following
-          value:
-          <br />
-          <br /><a href="https://log-api.eu.newrelic.com/log/v1">https://log-api.eu.newrelic.com/log/v1</a>
-        </p>
-      </th>
-      <th style="text-align:left"><a href="https://log-api.newrelic.com/log/v1">https://log-api.newrelic.com/log/v1</a>
-      </th>
-    </tr>
-  </thead>
-  <tbody></tbody>
-</table>
-
-<table>
-  <thead>
-    <tr>
-      <th style="text-align:left">api_key</th>
-      <th style="text-align:left">
-        <p>Your key for data ingestion. The API key is also called the ingestion
-          key, you can get more details on how to generated in the official documentation
-          <a
-          href="https://docs.newrelic.com/docs/apis/get-started/intro-apis/types-new-relic-api-keys#event-insert-key">here</a>.</p>
-        <p>From a configuration perspective either an <code>api_key</code> or an <code>license_key</code> is
-          required. New Relic suggest to use primary the <code>api_key</code>.</p>
-      </th>
-      <th style="text-align:left"></th>
-    </tr>
-  </thead>
-  <tbody></tbody>
-</table>
-
-<table>
-  <thead>
-    <tr>
-      <th style="text-align:left">license_key</th>
-      <th style="text-align:left">
-        <p>Optional authentication parameter for data ingestion.
-          <br />
-        </p>
-        <p>Note that New Relic suggest to use the <code>api_key</code> instead. You
-          can read more about the License Key <a href="https://docs.newrelic.com/docs/accounts/install-new-relic/account-setup/license-key">here</a>.</p>
-      </th>
-      <th style="text-align:left"></th>
-    </tr>
-  </thead>
-  <tbody></tbody>
-</table>
-
-| compress | Set the compression mechanism for the payload. This option allows two values: `gzip` \(enabled by default\) or `false` to disable compression. | gzip |
-| :--- | :--- | :--- |
-
-
-The following configuration example, will emit a dummy example record and ingest it on New Relic. Copy and paste the following content in a file called `newrelic.conf`:
-
-```python
+```text
 [SERVICE]
-    flush     1
-    log_level info
+  flush     1
+  log_level info
 
 [INPUT]
-    name      dummy
-    dummy     {"message":"a simple message", "temp": "0.74", "extra": "false"}
-    samples   1
+  name      dummy
+  dummy     {"message":"a simple message", "temp": "0.74", "extra": "false"}
+  samples   1
 
 [OUTPUT]
-    name      nrlogs
-    match     *
-    api_key   YOUR_API_KEY_HERE
+  name      nrlogs
+  match     *
+  api_key   YOUR_API_KEY_HERE
 ```
 
-run Fluent Bit with the new configuration file:
+{% endtab %}
+{% endtabs %}
 
-```text
-$ fluent-bit -c newrelic.conf
+Run Fluent Bit with the new configuration file:
+
+```shell
+# For YAML configuration.
+fluent-bit --config fluent-bit.yaml
+
+# For classic configuration
+fluent-bit --config fluent-bit.conf
 ```
 
 Fluent Bit output:
 
 ```text
-Fluent Bit v1.5.0
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
-
-[2020/04/10 10:58:32] [ info] [storage] version=1.0.3, initializing...
-[2020/04/10 10:58:32] [ info] [storage] in-memory
-[2020/04/10 10:58:32] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128
-[2020/04/10 10:58:32] [ info] [engine] started (pid=2772591)
-[2020/04/10 10:58:32] [ info] [output:newrelic:newrelic.0] configured, hostname=log-api.newrelic.com:443
-[2020/04/10 10:58:32] [ info] [sp] stream processor started
+...
 [2020/04/10 10:58:35] [ info] [output:nrlogs:nrlogs.0] log-api.newrelic.com:443, HTTP status=202
 {"requestId":"feb312fe-004e-b000-0000-0171650764ac"}
+...
 ```
-
diff --git a/pipeline/outputs/null.md b/pipeline/outputs/null.md
index b6f4f26cf..63088961f 100644
--- a/pipeline/outputs/null.md
+++ b/pipeline/outputs/null.md
@@ -1,34 +1,53 @@
-# NULL
+# Null
 
-The **null** output plugin just throws away events.
+The _Null_ output plugin discards events.
 
-## Configuration Parameters
+## Configuration parameters
 
-The plugin doesn't support configuration parameters.
+This plugin doesn't have any configuration parameters.
 
-## Getting Started
+## Get started
 
 You can run the plugin from the command line or through the configuration file:
 
-### Command Line
+### Command line
 
-From the command line you can let Fluent Bit throws away events with the following options:
+From the command line you can let Fluent Bit discard events with the following options:
 
-```bash
-$ fluent-bit -i cpu -o null
+```shell
+fluent-bit -i cpu -o null
 ```
 
-### Configuration File
+### Configuration file
 
-In your main configuration file append the following Input & Output sections:
+In your main configuration file append the following:
 
-```python
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
+
+  outputs:
+    - name: null
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name cpu
-    Tag  cpu
+  Name cpu
+  Tag  cpu
 
 [OUTPUT]
-    Name null
-    Match *
+  Name null
+  Match *
 ```
 
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/outputs/observe.md b/pipeline/outputs/observe.md
index 2e722422e..36bbd95d2 100644
--- a/pipeline/outputs/observe.md
+++ b/pipeline/outputs/observe.md
@@ -1,28 +1,52 @@
 # Observe
 
-Observe employs the **http** output plugin, allowing you to flush your records [into Observe](https://docs.observeinc.com/en/latest/content/data-ingestion/forwarders/fluentbit.html).
+Use the [HTTP output plugin](`http`) to flush your records [into Observe](https://docs.observeinc.com/en/latest/content/data-ingestion/forwarders/fluentbit.html). It issues a POST request with the data records in [MessagePack](http://msgpack.org) (or JSON) format.
 
-For now the functionality is pretty basic and it issues a POST request with the data records in [MessagePack](http://msgpack.org) (or JSON) format.  
+## Configuration parameters
 
-The following are the specific HTTP parameters to employ:
+The following HTTP configuration parameters are relevant to Observe:
 
-## Configuration Parameters
+| Key | Description | Default |
+| --- | ----------- | ------- |
+| `host` | IP address or hostname of the Observe data collection endpoint. Replace `$(OBSERVE_CUSTOMER)` with your [Customer ID](https://docs.observeinc.com/en/latest/content/hints/CustomerId.html). | `OBSERVE_CUSTOMER.collect.observeinc.com` |
+| `port` | TCP port to use when sending data to Observe. | `443` |
+| `tls` | Specifies whether to use TLS. | `on` |
+| `uri` | Specifies the HTTP URI for Observe. | `/v1/http/fluentbit` |
+| `format` | The data format to be used in the HTTP request body. | `msgpack` |
+| `header` | The specific header that provides the Observe token needed to authorize sending data [into a data stream](https://docs.observeinc.com/en/latest/content/data-ingestion/datastreams.html?highlight=ingest%20token#create-a-datastream). | 'Authorization     Bearer ${OBSERVE_TOKEN}' |
+| `header` | The specific header that instructs Observe how to decode incoming payloads. | `X-Observe-Decoder fluent` |
+| `compress` | Sets the payload compression mechanism. Possible values: `gzip`, `false`. | `gzip` |
+| `tls.ca_file` | For Windows only: the path to the root cert. | _none_ |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
-| Key                        | Description                                                                                                                                                                                                                                                                                                                        | default   |
-| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
-| host                       | IP address or hostname of Observe's data collection endpoint.  $(OBSERVE_CUSTOMER) is your [Customer ID](https://docs.observeinc.com/en/latest/content/common-topics/HelpfulHints.html?highlight=customer%20id#customer-id)                                                                                                                                                                                                                                                                      | OBSERVE_CUSTOMER.collect.observeinc.com |
-| port                       | TCP port of to employ when sending to Observe                                                                                                                                                                                                                                                                                      | 443      |
-| tls                        | Specify to use tls                                                                                                                                                                                                                                                                                                                 | on       |
-| uri                        | Specify the HTTP URI for the Observe's data ingest                                                                                                                                                                                                                                                                                 | /v1/http/fluentbit |
-| format                     | The data format to be used in the HTTP request body                                                                                                                                                                                                                                                                                | msgpack   |
-| header                     | The specific header that provides the Observe token needed to authorize sending data [into a datastream](https://docs.observeinc.com/en/latest/content/data-ingestion/datastreams.html?highlight=ingest%20token#create-a-datastream).                                                                                                                                                                                                                                                              | Authorization     Bearer ${OBSERVE_TOKEN} |
-| header                     | The specific header to instructs Observe how to decode incoming payloads                                                                                                                                                                                                                                                           | X-Observe-Decoder fluent |
-| compress                   | Set payload compression mechanism. Option available is 'gzip'                                                                                                                                                                                                                                                                      | gzip      |
-| tls.ca_file                | **For use with Windows**: provide path to root cert                                                                                                                                                                                                                                                                                |           |
+### Configuration file
 
-### Configuration File
+In your main configuration file append the following:
 
-In your main configuration file, append the following _Input_ & _Output_ sections:
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: http
+      match: '*'
+      host: my-observe-customer-id.collect.observeinc.com
+      port: 443
+      tls: on
+      uri: /v1/http/fluentbit
+      format: msgpack
+      header:
+        - 'Authorization     Bearer ${OBSERVE_TOKEN}'
+        - 'X-Observe-Decoder fluent'
+      compress: gzip
+      # For Windows: provide path to root cert
+      #tls.ca_file  C:\fluent-bit\isrgrootx1.pem
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [OUTPUT]
@@ -41,5 +65,7 @@ In your main configuration file, append the following _Input_ & _Output_ section
 
     # For Windows: provide path to root cert
     #tls.ca_file  C:\fluent-bit\isrgrootx1.pem
-    
 ```
+
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/outputs/oci-logging-analytics.md b/pipeline/outputs/oci-logging-analytics.md
index 54abb039a..09a68ba26 100644
--- a/pipeline/outputs/oci-logging-analytics.md
+++ b/pipeline/outputs/oci-logging-analytics.md
@@ -1,131 +1,220 @@
 ---
-description: Send logs to Oracle Cloud Infrastructure Logging Analytics Service
+description: Send logs to Oracle Cloud Infrastructure Log Analytics Service
 ---
 
 # Oracle Cloud Infrastructure Logging Analytics
 
-Oracle Cloud Infrastructure Logging Analytics output plugin allows you to ingest your log records into [OCI Logging Analytics](https://www.oracle.com/manageability/logging-analytics) service.
+The _Oracle Cloud Infrastructure Logging Analytics_ output plugin lets you ingest your log records into the [Oracle Cloud Infrastructure (OCI) Log Analytics](https://docs.oracle.com/en-us/iaas/log-analytics/home.htm) service.
 
-Oracle Cloud Infrastructure Logging Analytics is a machine learning-based cloud service that monitors, aggregates, indexes, and analyzes all log data from on-premises and multicloud environments. Enabling users to search, explore, and correlate this data to troubleshoot and resolve problems faster and derive insights to make better operational decisions.
+## Configuration parameters
 
-For details about OCI Logging Analytics refer to https://docs.oracle.com/en-us/iaas/logging-analytics/index.html
+This plugin uses the following configuration parameters:
 
-## Configuration Parameters
+| Key | Description | Default |
+| --- | ----------- | ------- |
+| `config_file_location` | The location of the [configuration file](https://docs.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm#SDK_and_CLI_Configuration_File) that contains OCI authentication details. | _none_ |
+| `profile_name` | The OCI configuration profile name to be used from the configuration file. | `DEFAULT` |
+| `namespace` | The OCI tenancy namespace to upload log data to. | _none_ |
+| `proxy` | The proxy name, in `http://host:port` format. Only supports HTTP protocol. | _none_ |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `1` |
+| `oci_config_in_record` | If set to `true`, the following `oci_la_*` will be read from the record itself instead of the output plugin configuration. | `false` |
+| `oci_la_log_group_id` | Required. The Oracle Cloud Identifier (OCID) of the Log Analytics where you want to store logs. | _none_ |
+| `oci_la_log_source_name` | Required. The Log Analytics Source to use for processing log records. | _none_ |
+| `oci_la_entity_id` | The OCID of the Log Analytics entity. | _none_ |
+| `oci_la_entity_type` | The entity type of the Log Analytics entity. | _none_ |
+| `oci_la_log_path` | Specifies the original location of the log files. | _none_ |
+| `oci_la_global_metadata` | Specifies additional global metadata along with original log content to Log Analytics. The format is `key_name value`. This option can be set multiple times. | _none_ |
+| `oci_la_metadata` | Specifies additional metadata for a log event along with original log content to Log Analytics. The format is `key_name value`. This option can be set multiple times. | _none_ |
 
-Following are the top level configuration properties of the plugin:
+### TLS/SSL
 
-| Key                  | Description                                                                                                                                                                                                                          | default |
-|:---------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------|
-| config_file_location | The location of the configuration file containing OCI authentication details. Reference for generating the configuration file - https://docs.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm#SDK_and_CLI_Configuration_File |         |
-| profile_name         | OCI Config Profile Name to be used from the configuration file                                                                                                                                                                       | DEFAULT |
-| namespace            | OCI Tenancy Namespace in which the collected log data is to be uploaded                                                                                                                                                              |         |
-| proxy                | define proxy if required, in http://host:port format, supports only http protocol                                                                                                                                                    |         |
+The OCI Logging Analytics output plugin supports TLS/SSL. For more details about the properties available and general configuration, see [TLS/SSL](../../administration/transport-security.md).
 
-The following parameters are to set the Logging Analytics resources that must be used to process your logs by OCI Logging Analytics.
-
-| Key                     | Description                                                                                                                                                                                   | default |
-|:------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------|
-| oci_config_in_record    | If set to true, the following oci_la_* will be read from the record itself instead of the output plugin configuration.                                                                        | false   |
-| oci_la_log_group_id     | The OCID of the Logging Analytics Log Group where the logs must be stored. This is a mandatory parameter                                                                                      |         |
-| oci_la_log_source_name  | The Logging Analytics Source that must be used to process the log records. This is a mandatory parameter                                                                                      |         |
-| oci_la_entity_id        | The OCID of the Logging Analytics Entity	                                                                                                                                                     |         |   
-| oci_la_entity_type	     | The entity type of the Logging Analytics Entity	                                                                                                                                              |         |
-| oci_la_log_path	        | Specify the original location of the log files	                                                                                                                                               |         |
-| oci_la_global_metadata	 | Use this parameter to specify additional global metadata along with original log content to Logging Analytics. The format is 'key_name value'. This option can be set multiple times          |         |
-| oci_la_metadata	        | Use this parameter to specify additional metadata for a log event along with original log content to Logging Analytics. The format is 'key_name value'. This option can be set multiple times |         |
-
-## TLS/SSL
-
-OCI Logging Analytics output plugin supports TLS/SSL, for more details about the properties available and general configuration, please refer to the [TLS/SSL](../../administration/transport-security.md) section.
-
-## Getting Started
+## Get started
 
 ### Prerequisites
 
-- OCI Logging Analytics service must be onboarded with the minumum required policies, in the OCI region where you want to monitor. Refer [Logging Analytics Quick Start](https://docs.oracle.com/en-us/iaas/logging-analytics/doc/quick-start.html) for details.
-- Create OCI Logging Analytics LogGroup(s) if not done already. Refer [Create Log Group](https://docs.oracle.com/en-us/iaas/logging-analytics/doc/create-logging-analytics-resources.html#GUID-D1758CFB-861F-420D-B12F-34D1CC5E3E0E) for details.
+- You must onboard with the OCI Log Analytics service for the minimum required policies in the OCI region where you want to monitor. Refer to [Log Analytics Quick Start](https://docs.oracle.com/en-us/iaas/log-analytics/doc/quick-start.html) for details.
+
+- You must create one or more OCI Log Analytics log groups. Refer to [Create Log Group](https://docs.oracle.com/en-us/iaas/log-analytics/doc/create-logging-analytics-resources.html#GUID-D1758CFB-861F-420D-B12F-34D1CC5E3E0E) for details.
 
-### Running the output plugin
+### Run the output plugin
 
-In order to insert records into the OCI Logging Analytics service, you can run the plugin from the command line or through the configuration file:
+To insert records into the OCI Log Analytics service, you can run the plugin from the command line or through a configuration file.
 
 #### Command line
 
-The OCI Logging Analytics plugin can read the parameters from the command line in two ways, through the -p argument (property), e.g:
+The OCI Logging Analytics plugin can read the parameters from the command line in two ways, through the `-p` (property) argument. For example:
 
-```text
-$ fluent-bit -i dummy -t dummy -o oci_logan -p config_file_location=<location> -p namespace=<namespace> \
+```shell
+fluent-bit -i dummy -t dummy -o oci_logan -p config_file_location=<location> -p namespace=<namespace> \
   -p oci_la_log_group_id=<lg_id> -p oci_la_log_source_name=<ls_name> -p tls=on -p tls.verify=off -m '*'
 ```
 
 #### Configuration file
 
-In your main configuration file append the following Input & Output sections:
+In your main configuration file append the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      tag: dummy
+
+  outputs:
+    - name: oracle_log_analytics
+      match: '*'
+      namespace: <namespace>
+      config_file_location: <location>
+      profile_name: ADMIN
+      oci_la_log_source_name: <log-source-name>
+      oci_la_log_group_id: <log-group-ocid>
+      tls: on
+      tls.verify: off
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name dummy
-    Tag dummy
+  Name dummy
+  Tag dummy
+
 [Output]
-    Name oracle_log_analytics
-    Match *
-    Namespace <namespace>
-    config_file_location <location>
-    profile_name ADMIN
-    oci_la_log_source_name <log-source-name>
-    oci_la_log_group_id <log-group-ocid>
-    tls On
-    tls.verify Off
+  Name oracle_log_analytics
+  Match *
+  Namespace <namespace>
+  config_file_location <location>
+  profile_name ADMIN
+  oci_la_log_source_name <log-source-name>
+  oci_la_log_group_id <log-group-ocid>
+  tls On
+  tls.verify Off
 ```
 
-### Insert oci_la configs in the record
+{% endtab %}
+{% endtabs %}
+
+### Insert `oci_la` configurations in the record
+
+In case of multiple inputs, where `oci_la_*` properties can differ, you can add the properties in the record itself and instruct the plugin to read these properties from the record. The option `oci_config_in_record`, when set to `true` in the output config, will make the plugin read the mandatory and optional `oci_la` properties from the incoming record. The user must ensure that the necessary configurations have been inserted using relevant filters, otherwise the respective chunk will be dropped. The following example inserts `oci_la_log_source_name` and `oci_la_log_group_id` in the record:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      tag: dummy
+
+  filters:
+    - name: modify
+      match: '*'
+      add:
+        - oci_la_log_source_name <LOG_SOURCE_NAME>
+        - oci_la_log_group_id <LOG_GROUP_OCID>
+
+  outputs:
+    - name: oracle_log_analytics
+      match: '*'
+      config_file_location: <oci_file_path>
+      profile_name: ADMIN
+      oci_config_in_record: true
+      tls: on
+      tls.verify: off
+```
 
-In case of multiple inputs, where oci_la_* properties can differ, you can add the properties in the record itself and instruct the plugin to read these properties from the record. The option oci_config_in_record, when set to true in the output config, will make the plugin read the mandatory and optional oci_la properties from the incoming record. The user must ensure that the necessary configs have been inserted using relevant filters, otherwise the respective chunk will be dropped. Below is an example to insert oci_la_log_source_name and oci_la_log_group_id in the record:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name dummy
-    Tag dummy
+  Name dummy
+  Tag dummy
+
 [Filter]
-    Name modify
-    Match *
-    Add oci_la_log_source_name <LOG_SOURCE_NAME>
-    Add oci_la_log_group_id <LOG_GROUP_OCID>
+  Name modify
+  Match *
+  Add oci_la_log_source_name <LOG_SOURCE_NAME>
+  Add oci_la_log_group_id <LOG_GROUP_OCID>
+
 [Output]
-    Name oracle_log_analytics
-    Match *
-    config_file_location <oci_file_path>
-    profile_name ADMIN
-    oci_config_in_record true
-    tls On
-    tls.verify Off
+  Name oracle_log_analytics
+  Match *
+  config_file_location <oci_file_path>
+  profile_name ADMIN
+  oci_config_in_record true
+  tls On
+  tls.verify Off
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ### Add optional metadata
 
 You can attach certain metadata to the log events collected from various inputs.
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      tag: dummy
+
+  outputs:
+    - name: oracle_log_analytics
+      match: '*'
+      namespace: example_namespace
+      config_file_location: /Users/example_file_location
+      profile_name: ADMIN
+      oci_la_log_source_name: example_log_source
+      oci_la_log_group_id: ocid.xxxxxx
+      oci_la_global_metadata:
+        - glob_key1 value1
+        - glob_key2 value2
+      oci_la_metadata:
+        - key1 value1
+        - key2 value2
+      tls: on
+      tls.verify: off
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
 ```text
 [INPUT]
-    Name dummy
-    Tag dummy
+  Name dummy
+  Tag dummy
+
 [Output]
-    Name oracle_log_analytics
-    Match *
-    Namespace example_namespace
-    config_file_location /Users/example_file_location
-    profile_name ADMIN
-    oci_la_log_source_name example_log_source
-    oci_la_log_group_id ocid.xxxxxx
-    oci_la_global_metadata glob_key1 value1
-    oci_la_global_metadata glob_key2 value2
-    oci_la_metadata key1 value1
-    oci_la_metadata key2 value2
-    tls On
-    tls.verify Off
+  Name oracle_log_analytics
+  Match *
+  Namespace example_namespace
+  config_file_location /Users/example_file_location
+  profile_name ADMIN
+  oci_la_log_source_name example_log_source
+  oci_la_log_group_id ocid.xxxxxx
+  oci_la_global_metadata glob_key1 value1
+  oci_la_global_metadata glob_key2 value2
+  oci_la_metadata key1 value1
+  oci_la_metadata key2 value2
+  tls On
+  tls.verify Off
 ```
 
-The above configuration will generate a payload that looks like this
+{% endtab %}
+{% endtabs %}
+
+The previous configuration will generate a payload that resembles the following:
 
 ```json
 {
@@ -138,50 +227,100 @@ The above configuration will generate a payload that looks like this
       "metadata": {
         "key1": "value1",
         "key2": "value2"
-    },
-    "logSourceName": "example_log_source",
-    "logRecords": [
-      "dummy"
-    ]
-  }
+      },
+      "logSourceName": "example_log_source",
+      "logRecords": [
+        "dummy"
+      ]
+    }
   ]
 }
 ```
 
-The multiple oci_la_global_metadata and oci_la_metadata options are turned into a JSON object of key value pairs, nested under the key metadata.
+The multiple `oci_la_global_metadata` and `oci_la_metadata` options are turned into a JSON object of key value pairs, nested under the key metadata.
+
+With `oci_config_in_record` option set to `true`, the metadata key/value pairs will need to be injected in the record as an object of key/value pairs nested under the respective metadata field. The following example shows one such configuration:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      tag: dummy
+
+  filters:
+    - name: modify
+      match: '*'
+      add:
+        - olgm.key1 val1
+        - olgm.key2 val2
+
+    - name: nest
+      match: '*'
+      operation: olgm.*
+      wildcard: olgm.*
+      nest_under: oci_la_global_metadata
+      remove_prefix: olgm.
+
+    - name: modify
+      match: '*'
+      add:
+        - oci_la_log_source_name <LOG_SOURCE_NAME>
+        - oci_la_log_group_id <LOG_GROUP_OCID>
+
+  outputs:
+    - name: oracle_log_analytics
+      match: '*'
+      config_file_location: <oci_file_path>
+      namespace: <oci_tenancy_namespace>
+      profile_name: ADMIN
+      oci_config_in_record: true
+      tls: on
+      tls.verify: off
+```
 
-With oci_config_in_record option set to true, the metadata key-value pairs will need to be injected in the record as an object of key value pair nested under the respective metadata field. Below is an example of one such configuration
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name dummy
-    Tag dummy
+  Name dummy
+  Tag dummy
+
 [FILTER]
-    Name Modify
-    Match *
-    Add olgm.key1 val1
-    Add olgm.key2 val2
+  Name Modify
+  Match *
+  Add olgm.key1 val1
+  Add olgm.key2 val2
+
 [FILTER]
-    Name nest
-    Match *
-    Operation nest
-    Wildcard olgm.*
-    Nest_under oci_la_global_metadata
-    Remove_prefix olgm.
+  Name nest
+  Match *
+  Operation nest
+  Wildcard olgm.*
+  Nest_under oci_la_global_metadata
+  Remove_prefix olgm.
+
 [Filter]
-    Name modify
-    Match *
-    Add oci_la_log_source_name <LOG_SOURCE_NAME>
-    Add oci_la_log_group_id <LOG_GROUP_OCID>
+  Name modify
+  Match *
+  Add oci_la_log_source_name <LOG_SOURCE_NAME>
+  Add oci_la_log_group_id <LOG_GROUP_OCID>
+
 [Output]
-    Name oracle_log_analytics
-    Match *
-    config_file_location <oci_file_path>
-    namespace <oci_tenancy_namespace>
-    profile_name ADMIN
-    oci_config_in_record true
-    tls On
-    tls.verify Off
+  Name oracle_log_analytics
+  Match *
+  config_file_location <oci_file_path>
+  namespace <oci_tenancy_namespace>
+  profile_name ADMIN
+  oci_config_in_record true
+  tls On
+  tls.verify Off
 ```
 
-The above configuration first injects the necessary metadata keys and values in the record directly, with a prefix olgm. attached to the keys in order to segregate the metadata keys from rest of the record keys. Then, using a nest filter only the metadata keys are selected by the filter and nested under oci_la_global_metadata key in the record, and the prefix olgm. is removed from the metadata keys.
\ No newline at end of file
+{% endtab %}
+{% endtabs %}
+
+The previous configuration first injects the necessary metadata keys and values in the record directly, with a prefix `olgm.` attached to the keys, which segregates the metadata keys from rest of the record keys. Then, using a `nest` filter, only the metadata keys are selected by the filter and nested under the `oci_la_global_metadata` key in the record, and the prefix `olgm.` is removed from the metadata keys.
diff --git a/pipeline/outputs/openobserve.md b/pipeline/outputs/openobserve.md
new file mode 100644
index 000000000..83a85aa5d
--- /dev/null
+++ b/pipeline/outputs/openobserve.md
@@ -0,0 +1,79 @@
+---
+title: OpenObserve
+description: Send logs to OpenObserve using Fluent Bit
+---
+
+# OpenObserve
+
+Use the OpenObserve output plugin to ingest logs into [OpenObserve](https://openobserve.ai/).
+
+Before you begin, you need the following fields, which can be found under **Ingestion** in OpenObserve Cloud. Alternatively, you can achieve this with various installation types as mentioned in the [OpenObserve documentation](https://openobserve.ai/docs/quickstart/):
+
+- [OpenObserve account](https://cloud.openobserve.ai/)
+- `HTTP_User`
+- `HTTP_Passwd`
+
+## Configuration parameters
+
+This plugin supports the following parameters:
+
+| Key | Description | Default |
+| --- | ----------- | ------- |
+| `Host` | The OpenObserve server where you are sending logs. | `localhost` |
+| `TLS`  | Enable end-to-end security using TLS. Set to `on` to enable TLS communication with OpenObserve. | `on` |
+| `compress` | Recommended. Compresses the payload in GZIP format. OpenObserve recommends setting this to `gzip` for optimized log ingestion. | _none_ |
+| `HTTP_User` | Username for HTTP authentication. | _none_ |
+| `HTTP_Passwd` | Password for HTTP authentication. | _none_ |
+| `URI` | The API path used to send logs. | `/api/default/default/_json` |
+| `Format` | The format of the log payload. OpenObserve expects JSON. | `json` |
+| `json_date_key` | Optional. The JSON key used for timestamps in the logs. | `timestamp` |
+| `json_date_format` | Optional. The format of the date in logs. OpenObserve supports ISO 8601. | `iso8601` |
+| `include_tag_key` | If `true`, a tag is appended to the output. The key name is used in the `tag_key` property. | `false` |
+
+### Configuration file
+
+Use this configuration file to get started:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: http
+      match: '*'
+      uri: /api/default/default/_json
+      host: localhost
+      port: 5080
+      tls: on
+      format: json
+      json_date_key: timestamp
+      json_date_format: iso8601
+      http_user: <YOUR_HTTP_USER>
+      http_passwd: <YOUR_HTTP_PASSWORD>
+      compress: gzip
+
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[OUTPUT]
+  Name http
+  Match *
+  URI /api/default/default/_json
+  Host localhost
+  Port 5080
+  tls on
+  Format json
+  Json_date_key    timestamp
+  Json_date_format iso8601
+  HTTP_User <YOUR_HTTP_USER>
+  HTTP_Passwd <YOUR_HTTP_PASSWORD>
+  compress gzip
+```
+
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/outputs/opensearch.md b/pipeline/outputs/opensearch.md
index e238486e0..f4e03d313 100644
--- a/pipeline/outputs/opensearch.md
+++ b/pipeline/outputs/opensearch.md
@@ -4,118 +4,141 @@ description: Send logs to Amazon OpenSearch Service
 
 # OpenSearch
 
-The **opensearch** output plugin, allows to ingest your records into an [OpenSearch](https://opensearch.org/) database.
-The following instructions assumes that you have a fully operational OpenSearch service running in your environment.
-
-## Configuration Parameters
-
-| Key | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                  | default |
-| :--- |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| :--- |
-| Host | IP address or hostname of the target OpenSearch instance                                                                                                                                                                                                                                                                                                                                                                                                     | 127.0.0.1 |
-| Port | TCP port of the target OpenSearch instance                                                                                                                                                                                                                                                                                                                                                                                                                   | 9200 |
-| Path | OpenSearch accepts new data on HTTP query path "/\_bulk". But it is also possible to serve OpenSearch behind a reverse proxy on a subpath. This option defines such path on the fluent-bit side. It simply adds a path prefix in the indexing HTTP POST URI.                                                                                                                                                                                                 | Empty string |
-| Buffer\_Size | Specify the buffer size used to read the response from the OpenSearch HTTP service. This option is useful for debugging purposes where is required to read full responses, note that response size grows depending of the number of records inserted. To set an _unlimited_ amount of memory set this value to **False**, otherwise the value must be according to the [Unit Size](../../administration/configuring-fluent-bit/unit-sizes.md) specification. | 4KB |
-| Pipeline | OpenSearch allows to setup filters called pipelines. This option allows to define which pipeline the database should use. For performance reasons is strongly suggested to do parsing and filtering on Fluent Bit side, avoid pipelines.                                                                                                                                                                                                                     |  |
-| AWS\_Auth | Enable AWS Sigv4 Authentication for Amazon OpenSearch Service                                                                                                                                                                                                                                                                                                                                                                                                | Off |
-| AWS\_Region | Specify the AWS region for Amazon OpenSearch Service                                                                                                                                                                                                                                                                                                                                                                                                         |  |
-| AWS\_STS\_Endpoint | Specify the custom sts endpoint to be used with STS API for Amazon OpenSearch Service                                                                                                                                                                                                                                                                                                                                                                        |  |
-| AWS\_Role\_ARN | AWS IAM Role to assume to put records to your Amazon cluster                                                                                                                                                                                                                                                                                                                                                                                                 |  |
-| AWS\_External\_ID | External ID for the AWS IAM Role specified with `aws_role_arn`                                                                                                                                                                                                                                                                                                                                                                                               |  |
-| AWS\_Service\_Name | Service name to be used in AWS Sigv4 signature. For integration with Amazon OpenSearch Serverless, set to `aoss`. See the [FAQ](opensearch.md#faq) section on Amazon OpenSearch Serverless for more information.                                                                                                                                                                                                                                                                                                                                                                                              | es |
-| AWS\_Profile | AWS profile name | default |
-| HTTP\_User | Optional username credential for access                                                                                                                                                                                                                                                                                                                                                                                                                      |  |
-| HTTP\_Passwd | Password for user defined in HTTP\_User                                                                                                                                                                                                                                                                                                                                                                                                                      |  |
-| Index | Index name, supports [Record Accessor syntax](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md) from 2.0.5 onwards.                                             | fluent-bit |
-| Type | Type name. This option is ignored if `Suppress_Type_Name` is enabled.                                                                                                                                                                                                                                                                                                                                                                                                                                                    | \_doc |
-| Logstash\_Format | Enable Logstash format compatibility. This option takes a boolean value: True/False, On/Off                                                                                                                                                                                                                                                                                                                                                                  | Off |
-| Logstash\_Prefix | When Logstash\_Format is enabled, the Index name is composed using a prefix and the date, e.g: If Logstash\_Prefix is equals to 'mydata' your index will become 'mydata-YYYY.MM.DD'. The last string appended belongs to the date when the data is being generated.                                                                                                                                                                                          | logstash |
-| Logstash\_Prefix\_Key | When included: the value of the key in the record will be evaluated as key reference and overrides Logstash\_Prefix for index generation. If the key/value is not found in the record then the Logstash\_Prefix option will act as a fallback. The parameter is expected to be a [record accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md). |  |
-| Logstash\_Prefix\_Separator | Set a separator between logstash_prefix and date.                                                                                                           | - |
-| Logstash\_DateFormat | Time format \(based on [strftime](http://man7.org/linux/man-pages/man3/strftime.3.html)\) to generate the second part of the Index name.                                                                                                                                                                                                                                                                                                                     | %Y.%m.%d |
-| Time\_Key | When Logstash\_Format is enabled, each record will get a new timestamp field. The Time\_Key property defines the name of that field.                                                                                                                                                                                                                                                                                                                         | @timestamp |
-| Time\_Key\_Format | When Logstash\_Format is enabled, this property defines the format of the timestamp.                                                                                                                                                                                                                                                                                                                                                                         | %Y-%m-%dT%H:%M:%S |
-| Time\_Key\_Nanos | When Logstash\_Format is enabled, enabling this property sends nanosecond precision timestamps.                                                                                                                                                                                                                                                                                                                                                              | Off |
-| Include\_Tag\_Key | When enabled, it append the Tag name to the record.                                                                                                                                                                                                                                                                                                                                                                                                          | Off |
-| Tag\_Key | When Include\_Tag\_Key is enabled, this property defines the key name for the tag.                                                                                                                                                                                                                                                                                                                                                                           | \_flb-key |
-| Generate\_ID | When enabled, generate `_id` for outgoing records. This prevents duplicate records when retrying.                                                                                                                                                                                                                                                                                                                                                            | Off |
-| Id\_Key | If set, `_id` will be the value of the key from incoming record and `Generate_ID` option is ignored.                                                                                                                                                                                                                                                                                                                                                         |  |
-| Write\_Operation | Operation to use to write in bulk requests.                                                                                                                                                                                                                                                                                                                                                                                                                  | create |
-| Replace\_Dots | When enabled, replace field name dots with underscore.                                                                                                                                                                                                                                                                                                                                                                                                       | Off |
-| Trace\_Output | When enabled print the OpenSearch API calls to stdout \(for diag only\)                                                                                                                                                                                                                                                                                                                                                                                      | Off |
-| Trace\_Error | When enabled print the OpenSearch API calls to stdout when OpenSearch returns an error \(for diag only\)                                                                                                                                                                                                                                                                                                                                                     | Off |
-| Current\_Time\_Index | Use current time for index generation instead of message record                                                                                                                                                                                                                                                                                                                                                                                              | Off |
-| Suppress\_Type\_Name | When enabled, mapping types is removed and `Type` option is ignored.                                                                                                                                                                                                                        | Off |
-| Workers | Enables dedicated thread(s) for this output. Default value is set since version 1.8.13. For previous versions is 0.                                                                                                                                                                                                                                                                                                                                          | 2 |
-| Compress | Set payload compression mechanism. The only available option is `gzip`. Default = "", which means no compression. |  |
-
-> The parameters _index_ and _type_ can be confusing if you are new to OpenSearch, if you have used a common relational database before, they can be compared to the _database_ and _table_ concepts. Also see [the FAQ below](opensearch.md#faq)
+The _OpenSearch_ output plugin lets you ingest your records into an [OpenSearch](https://opensearch.org/) database. The following instructions assume you have an operational OpenSearch service running in your environment.
+
+## Configuration parameters
+
+This plugin supports the following parameters:
+
+| Key | Description | Default |
+|:--- |:----------- |:------- |
+| `Host` | IP address or hostname of the target OpenSearch instance. | `127.0.0.1` |
+| `Port` | TCP port of the target OpenSearch instance. | `9200` |
+| `Path` | OpenSearch accepts new data on HTTP query path `/_bulk`. It's possible to serve OpenSearch behind a reverse proxy on a sub-path. This option defines such path on the Fluent Bit side. It adds a path prefix in the indexing HTTP POST URI. | Empty string |
+| `Buffer_Size` | Specify the buffer size used to read the response from the OpenSearch HTTP service. Use for debugging purposes where it's required to read full responses. The response size grows depending of the number of records inserted. Set this value to `False` to set an unlimited amount of memory. Otherwise set the value according to the [Unit Size](../../administration/configuring-fluent-bit/unit-sizes.md) specification. | `4KB` |
+| `Pipeline` | OpenSearch lets you set up filters called pipelines. This option defines which pipeline the database should use. For performance reasons is strongly suggested to do parsing and filtering on Fluent Bit side, avoid pipelines. | _none_ |
+| `AWS_Auth` | Enable AWS Sigv4 Authentication for Amazon OpenSearch Service. | `Off` |
+| `AWS_Region` | Specify the AWS region for Amazon OpenSearch Service. | _none_ |
+| `AWS_STS_Endpoint` | Specify the custom STS endpoint to be used with STS API for Amazon OpenSearch Service. | _none_ |
+| `AWS_Role_ARN` | AWS IAM Role to assume to put records to your Amazon cluster. | _none_ |
+| `AWS_External_ID` | External ID for the AWS IAM Role specified with `aws_role_arn`. | _none_ |
+| `AWS_Service_Name` | Service name to be used in AWS Sigv4 signature. For integration with Amazon OpenSearch Serverless, set to `aoss`. See the [FAQ](opensearch.md#faq) section on Amazon OpenSearch Serverless for more information. | `es` |
+| `AWS_Profile` | AWS profile name. | `default` |
+| `HTTP_User` | Optional. Username credential for access. | _none_ |
+| `HTTP_Passwd` | Password for user defined in `HTTP_User`. | _none_ |
+| `Index` | Index name, supports [Record Accessor syntax](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md) from 2.0.5 or later. | `fluent-bit` |
+| `Type` | Type name. This option is ignored if `Suppress_Type_Name` is enabled. | `_doc` |
+| `Logstash_Format` | Enable Logstash format compatibility. This option takes a boolean value: `True`/`False`, `On`/`Off` | `Off` |
+| `Logstash_Prefix` | When `Logstash_Format` is enabled, the Index name is composed using a prefix and the date. For example, if `Logstash_Prefix` is equal to `mydata` your index will become `mydata-YYYY.MM.DD`. The last string appended belongs to the date when the data is being generated. | `logstash` |
+| `Logstash_Prefix_Key` | When included, the value of the key in the record will be evaluated as key reference and overrides `Logstash_Prefix` for index generation. If the key/value isn't found in the record then the `Logstash_Prefix` option will act as a fallback. The parameter is expected to be a [record accessor](../../administration/configuring-fluent-bit/classic-mode/record-accessor.md). | _none_ |
+| `Logstash_Prefix_Separator` | Set a separator between `Logstash_Prefix` and `Date`. | `-` |
+| `Logstash_DateFormat` | Time format, based on [strftime](http://man7.org/linux/man-pages/man3/strftime.3.html), to generate the second part of the `Index` name. | `%Y.%m.%d` |
+| `Time_Key` | When `Logstash_Format` is enabled, each record will get a new timestamp field. The `Time_Key` property defines the name of that field. | `@timestamp` |
+| `Time_Key_Format` | When `Logstash_Format` is enabled, this property defines the format of the timestamp. | `%Y-%m-%dT%H:%M:%S` |
+| `Time_Key_Nanos` | When `Logstash_Format` is enabled, enabling this property sends nanosecond precision timestamps. | `Off` |
+| `Include_Tag_Key` | When enabled, append the `Tag` name to the record. | `Off` |
+| `Tag_Key | When `Include_Tag_Key` is enabled, this property defines the key name for the tag. | `_flb-key` |
+| `Generate_ID` | When enabled, generate `_id` for outgoing records. This prevents duplicate records when retrying. | `Off` |
+| `Id_Key` | If set, `_id` will be the value of the key from incoming record and `Generate_ID` option is ignored. | _none_ |
+| `Write_Operation` | Operation to use to write in bulk requests. | `create` |
+| `Replace_Dots` | When enabled, replace field name dots (`.`) with underscores (`_`). | `Off` |
+| `Trace_Output` | When enabled, print the OpenSearch API calls to stdout (for diagnostics only). | `Off` |
+| `Trace_Error` | When enabled, print the OpenSearch API calls to stdout when OpenSearch returns an error (for diagnostics only). | `Off` |
+| `Current_Time_Index` | Use current time for index generation instead of message record. | `Off` |
+| `Suppress_Type_Name` | When enabled, mapping types is removed and the `Type` option is ignored. | `Off` |
+| `Workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
+| `Compress` | Set payload compression mechanism. Allowed value: `gzip`. | _none_ (no compression) |
+
+The parameters `index` and `type` can be confusing if you are new to OpenSearch. If you have used a common relational database before, they can be compared to the `database` and `table` concepts. Also see [the FAQ](opensearch.md#faq).
 
 ### TLS / SSL
 
-OpenSearch output plugin supports TLS/SSL, for more details about the properties available and general configuration, please refer to the [TLS/SSL](../../administration/transport-security.md) section.
+The OpenSearch output plugin supports TLS/SSL. For more details about the properties available and general configuration, see [TLS/SSL](../../administration/transport-security.md).
 
-### write\_operation
+### `write_operation`
 
-The write\_operation can be any of:
+The `write_operation` can be any of:
 
-| Operation | Description          |
-| ------------- | ----------- |
-| create (default) | adds new data - if the data already exists (based on its id), the op is skipped.|
-| index            | new data is added while existing data (based on its id) is replaced (reindexed).|
-| update           | updates existing data (based on its id). If no data is found, the op is skipped.|
-| upsert           | known as merge or insert if the data does not exist, updates if the data exists (based on its id).|
+| Operation        | Description                                                                                        |
+|------------------|----------------------------------------------------------------------------------------------------|
+| `create` (default) | Adds new data - if the data already exists (based on its id), the op is skipped.                   |
+| `index`            | New data is added while existing data (based on its id) is replaced (reindexed).                   |
+| `update`           | Updates existing data (based on its id). If no data is found, the op is skipped.                   |
+| `upsert`           | Known as `merge` or `insert` if the data doesn't exist. Updates if the data exists (based on its id). |
 
-**Please note, `Id_Key` or `Generate_ID` is required in update, and upsert scenario.**
+`Id_Key` or `Generate_ID` is required for `update` and `upsert`.
 
-## Getting Started
+## Get started
 
-In order to insert records into an OpenSearch service, you can run the plugin from the command line or through the configuration file:
+To insert records into an OpenSearch service, you can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-The **opensearch** plugin, can read the parameters from the command line in two ways, through the **-p** argument \(property\) or setting them directly through the service URI. The URI format is the following:
+The OpenSearch plugin can read the parameters from the command line in two ways, through the `-p` argument (property) or by setting them directly through the service URI. The URI format is the following:
 
 ```text
 es://host:port/index/type
 ```
 
-Using the format specified, you could start Fluent Bit through:
+Using the format specified, start Fluent Bit through:
 
-```text
-$ fluent-bit -i cpu -t cpu -o es://192.168.2.3:9200/my_index/my_type \
-    -o stdout -m '*'
+```shell
+fluent-bit -i cpu -t cpu -o es://192.168.2.3:9200/my_index/my_type \
+  -o stdout -m '*'
 ```
 
 which is similar to do:
 
-```text
-$ fluent-bit -i cpu -t cpu -o opensearch -p Host=192.168.2.3 -p Port=9200 \
-    -p Index=my_index -p Type=my_type -o stdout -m '*'
+```shell
+fluent-bit -i cpu -t cpu -o opensearch -p Host=192.168.2.3 -p Port=9200 \
+  -p Index=my_index -p Type=my_type -o stdout -m '*'
 ```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file append the following:
 
-In your main configuration file append the following _Input_ & _Output_ sections. You can visualize this configuration [here](https://link.calyptia.com/qhq)
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
+
+  outputs:
+    - name: opensearch
+      match: '*'
+      host: 192.168.2.3
+      port: 9200
+      index: my_index
+      type: my_type
+```
 
-```python
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name  cpu
-    Tag   cpu
+  Name cpu
+  Tag  cpu
 
 [OUTPUT]
-    Name  opensearch
-    Match *
-    Host  192.168.2.3
-    Port  9200
-    Index my_index
-    Type  my_type
+  Name  opensearch
+  Match *
+  Host  192.168.2.3
+  Port  9200
+  Index my_index
+  Type  my_type
 ```
 
-![example configuration visualization from calyptia](../../.gitbook/assets/image%20%282%29.png)
+{% endtab %}
+{% endtabs %}
 
 ## About OpenSearch field names
 
-Some input plugins may generate messages where the field names contains dots. This **opensearch** plugin replaces them with an underscore, e.g:
+Some input plugins can generate messages where the field names contain dots (`.`). The OpenSearch plugin replaces them with an underscore (`_`):
 
 ```text
 {"cpu0.p_cpu"=>17.000000}
@@ -127,51 +150,95 @@ becomes
 {"cpu0_p_cpu"=>17.000000}
 ```
 
-## FAQ
+## Frequently asked questions
 
-### Logstash_Prefix_Key
+### `Logstash_Prefix_Key`
 
 The following snippet demonstrates using the namespace name as extracted by the
-`kubernetes` filter as logstash preifix:
+`kubernetes` filter as `logstash` prefix:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: opensearch
+      match: '*'
+      # ...
+      logstash_prefix: logstash
+      logstash_prefix_key: $kubernetes['namespace_name']
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [OUTPUT]
-    Name opensearch
-    Match *
-    # ...
-    Logstash_Prefix logstash
-    Logstash_Prefix_Key $kubernetes['namespace_name']
-    # ...
+  Name opensearch
+  Match *
+  # ...
+  Logstash_Prefix logstash
+  Logstash_Prefix_Key $kubernetes['namespace_name']
+  # ...
 ```
 
+{% endtab %}
+{% endtabs %}
+
 For records that do nor have the field `kubernetes.namespace_name`, the default prefix, `logstash` will be used.
 
-### Fluent Bit + Amazon OpenSearch Service <a id="#aws-es"></a>
+### Fluent Bit and Amazon OpenSearch Service
 
 The Amazon OpenSearch Service adds an extra security layer where HTTP requests must be signed with AWS Sigv4. This plugin supports Amazon OpenSearch Service with IAM Authentication.
 
-See [here](../../administration/aws-credentials.md) for details on how AWS credentials are fetched.
+For details about how AWS credentials are fetched, see [AWS credentials](../../administration/aws-credentials.md).
 
 Example configuration:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: opensearch
+      match: '*'
+      host: vpc-test-domain-ke7thhzoo7jawsrhmm6mb7ite7y.us-west-2.es.amazonaws.com
+      port: 443
+      index: my_index
+      type: my_type
+      aws_auth: on
+      aws_region: us-west-2
+      tls: on
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
 ```text
 [OUTPUT]
-    Name  opensearch
-    Match *
-    Host  vpc-test-domain-ke7thhzoo7jawsrhmm6mb7ite7y.us-west-2.es.amazonaws.com
-    Port  443
-    Index my_index
-    Type  my_type
-    AWS_Auth On
-    AWS_Region us-west-2
-    tls     On
+  Name  opensearch
+  Match *
+  Host  vpc-test-domain-ke7thhzoo7jawsrhmm6mb7ite7y.us-west-2.es.amazonaws.com
+  Port  443
+  Index my_index
+  Type  my_type
+  AWS_Auth On
+  AWS_Region us-west-2
+  tls     On
 ```
 
+{% endtab %}
+{% endtabs %}
+
 Notice that the `Port` is set to `443`, `tls` is enabled, and `AWS_Region` is set.
 
 ### Action/metadata contains an unknown parameter type
 
-Similarly to Elastic Cloud, OpenSearch in version 2.0 and above needs to have type option being removed by setting `Suppress_Type_Name On`.
+Similar to Elastic Cloud, OpenSearch in version 2.0 and later needs to have the type option removed by setting `Suppress_Type_Name On`.
 
 Without this you will see errors like:
 
@@ -179,30 +246,67 @@ Without this you will see errors like:
 {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Action/metadata line [1] contains an unknown parameter [_type]"}],"type":"illegal_argument_exception","reason":"Action/metadata line [1] contains an unknown parameter [_type]"},"status":400}
 ```
 
-### Fluent-Bit + Amazon OpenSearch Serverless <a id="#aws-opensearch-serverless"></a>
-Amazon OpenSearch Serverless is an offering that eliminates your need to manage OpenSearch clusters. All existing Fluent Bit OpenSearch output plugin options work with OpenSearch Serverless. For Fluent Bit, the only difference is that you must specify the service name as `aoss` (Amazon OpenSearch Serverless) when you enable `AWS_Auth`:
-```
-AWS_Auth On
-AWS_Region <aws-region>
-AWS_Service_Name aoss
+### Fluent Bit and Amazon OpenSearch serverless
+
+Amazon OpenSearch Serverless is an offering that eliminates your need to manage OpenSearch clusters. All existing Fluent Bit OpenSearch output plugin options work with OpenSearch Serverless. For Fluent Bit, you must specify the service name as `aoss` (Amazon OpenSearch Serverless) when you enable `AWS_Auth`:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: opensearch
+      match: '*'
+      host: vpc-test-domain-ke7thhzoo7jawsrhmm6mb7ite7y.us-west-2.es.amazonaws.com
+      port: 443
+      index: my_index
+      type: my_type
+      aws_auth: on
+      aws_region: <aws-region>
+      aws_service_name: aoss
 ```
 
-**Data Access Permissions**
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-When sending logs to OpenSearch Serverless, your AWS IAM entity needs [OpenSearch Serverless Data Access permisions](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html). Give your IAM entity the following data access permissions to your serverless collection:
+```text
+[OUTPUT]
+  Name  opensearch
+  Match *
+  Host  vpc-test-domain-ke7thhzoo7jawsrhmm6mb7ite7y.us-west-2.es.amazonaws.com
+  Port  443
+  Index my_index
+  Type  my_type
+  AWS_Auth On
+  AWS_Region <aws-region>
+  AWS_Service_Name aoss
 ```
+
+{% endtab %}
+{% endtabs %}
+
+#### Data access permissions
+
+When sending logs to OpenSearch Serverless, your AWS IAM entity needs [OpenSearch Serverless Data Access permissions](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html). Give your IAM entity the following data access permissions to your serverless collection:
+
+```text
 aoss:CreateIndex
 aoss:UpdateIndex
 aoss:WriteDocument
 ```
-With data access permissions, IAM policies are not needed to access the collection.
+
+With data access permissions, IAM policies aren't needed to access the collection.
 
 ### Issues with the OpenSearch cluster
 
-Occasionally the Fluent Bit service may generate errors without any additional detail in the logs to explain the source of the issue, even with the service's log_level attribute set to [Debug](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/configuration-file). 
+The Fluent Bit service might generate errors without any additional detail in the logs to explain the source of the issue, even with the service's `log_level` attribute set to [Debug](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/configuration-file).
 
 For example, in this scenario the logs show that a connection was successfully established with the OpenSearch domain, and yet an error is still returned:
-```
+
+```text
+...
 [2023/07/10 19:26:00] [debug] [http_client] not using http_proxy for header
 [2023/07/10 19:26:00] [debug] [output:opensearch:opensearch.5] Signing request with AWS Sigv4
 [2023/07/10 19:26:00] [debug] [aws_credentials] Requesting credentials from the EC2 provider..
@@ -212,35 +316,33 @@ For example, in this scenario the logs show that a connection was successfully e
 [2023/07/10 19:26:00] [debug] [task] task_id=2 reached retry-attempts limit 5/5
 [2023/07/10 19:26:00] [error] [engine] chunk '7578-1689017013.184552017.flb' cannot be retried: task_id=2, input=tail.6 > output=opensearch.5
 [2023/07/10 19:26:00] [debug] [task] destroy task=0x7fd1cc4d5ad0 (task_id=2)
+...
 ```
 
-This behavior could be indicative of a hard-to-detect issue with index shard usage in the OpenSearch domain.
-
-While OpenSearch index shards and disk space are related, they are not directly tied to one another.
+This behavior could be indicative of a hard-to-detect issue with index shard usage in the OpenSearch domain. Although OpenSearch index shards and disk space are related, they're not directly tied to one another. OpenSearch domains are limited to 1,000 index shards per data node, regardless of the size of the nodes. Shard usage isn't proportional to disk usage. An individual index shard can hold anywhere from a few kilobytes to dozens of gigabytes of data.
 
-OpenSearch domains are limited to 1000 index shards per data node, regardless of the size of the nodes. And, importantly, shard usage is not proportional to disk usage: an individual index shard can hold anywhere from a few kilobytes to dozens of gigabytes of data. 
+Depending index creation and shard allocation configuration in the OpenSearch domain, all the available index shards could be used before the data nodes run out of disk space. This can result in exhibition disk-related performance issues (nodes crashing, data corruption, or the dashboard going offline). The primary issue that arises when a domain is out of available index shards is that new indexes can no longer be created (although logs can still be added to existing indexes).
 
-In other words, depending on the way index creation and shard allocation are configured in the OpenSearch domain, all of the available index shards could be used long before the data nodes run out of disk space and begin exhibiting disk-related performance issues (e.g. nodes crashing, data corruption, or the dashboard going offline). 
+When that happens, the Fluent Bit OpenSearch output can show confusing behavior. For example:
 
-The primary issue that arises when a domain is out of available index shards is that new indexes can no longer be created (though logs can still be added to existing indexes).
-
-When that happens, the Fluent Bit OpenSearch output may begin showing confusing behavior. For example:
 - Errors suddenly appear (outputs were previously working and there were no changes to the Fluent Bit configuration when the errors began)
-- Errors are not consistently occurring (some logs are still reaching the OpenSearch domain)
+- Errors aren't consistently occurring (some logs are still reaching the OpenSearch domain)
 - The Fluent Bit service logs show errors, but without any detail as to the root cause
 
 If any of those symptoms are present, consider using the OpenSearch domain's API endpoints to troubleshoot possible shard issues.
 
-Running this command will show both the shard count and disk usage on all of the nodes in the domain. 
-```
+Running this command will show both the shard count and disk usage on all the nodes in the domain.
+
+```text
 GET _cat/allocation?v
 ```
 
-Index creation issues will begin to appear if any hot data nodes have around 1000 shards OR if the total number of shards spread across hot and ultrawarm data nodes in the cluster is greater than 1000 times the total number of nodes (e.g., in a cluster with 6 nodes, the maximum shard count would be 6000).
+Index creation issues can appear if any hot data nodes have around 1,000 shards. Creation issues can also occur if the total number of shards spread across hot and ultra warm data nodes in the cluster is greater than 1,000 times the total number of nodes. For example, in a cluster with six nodes, the maximum shard count would be `6000`.
 
-Alternatively, running this command to manually create a new index will return an explicit error related to shard count if the maximum has been exceeded.
-```
+Alternately, running this command to manually create a new index will return an explicit error related to shard count if the maximum has been exceeded:
+
+```text
 PUT <index-name>
 ```
 
-There are multiple ways to resolve excessive shard usage in an OpenSearch domain such as deleting or combining indexes, adding more data nodes to the cluster, or updating the domain's index creation and sharding strategy. Consult the OpenSearch documentation for more information on how to use these strategies.
+There are multiple ways to resolve excessive shard usage in an OpenSearch domain. Deleting or combining indexes, adding more data nodes to the cluster, or updating the domain's index creation and sharding strategy can resolve this issue. Consult the OpenSearch documentation for more information about how to use these strategies.
diff --git a/pipeline/outputs/opentelemetry.md b/pipeline/outputs/opentelemetry.md
index a70d84396..0068eb23a 100644
--- a/pipeline/outputs/opentelemetry.md
+++ b/pipeline/outputs/opentelemetry.md
@@ -4,46 +4,100 @@ description: An output plugin to submit Logs, Metrics, or Traces to an OpenTelem
 
 # OpenTelemetry
 
-The OpenTelemetry plugin allows you to take logs, metrics, and traces from Fluent Bit and submit them to an OpenTelemetry HTTP endpoint.
-
-Important Note: At the moment only HTTP endpoints are supported.
-
-| Key                  | Description                                                  | Default   |
-| -------------------- | ------------------------------------------------------------ | --------- |
-| host                 | IP address or hostname of the target HTTP Server             | 127.0.0.1 |
-| http_user            | Basic Auth Username                                          |           |
-| http_passwd          | Basic Auth Password. Requires HTTP_user to be set            |           |
-| port                 | TCP port of the target HTTP Server                           | 80        |
-| proxy                | Specify an HTTP Proxy. The expected format of this value is `http://HOST:PORT`. Note that HTTPS is **not** currently supported. It is recommended not to set this and to configure the [HTTP proxy environment variables](https://docs.fluentbit.io/manual/administration/http-proxy) instead as they support both HTTP and HTTPS. |           |
-| metrics_uri                  | Specify an optional HTTP URI for the target web server listening for metrics, e.g: /v1/metrics | /         |
-| logs_uri                  | Specify an optional HTTP URI for the target web server listening for logs, e.g: /v1/logs | /         |
-| traces_uri                  | Specify an optional HTTP URI for the target web server listening for traces, e.g: /v1/traces | /         |
-| header               | Add a HTTP header key/value pair. Multiple headers can be set. |           |
-| log_response_payload | Log the response payload within the Fluent Bit log           | false     |
-| logs_body_key | The log body key to look up in the log events body/message. Sets the Body field of the opentelemtry logs data model.   | message     |
-| logs_trace_id_message_key | The trace id key to look up in the log events body/message. Sets the TraceId field of the opentelemtry logs data model.  | traceId     |
-| logs_span_id_message_key | The span id key to look up in the log events body/message. Sets the SpanId field of the opentelemtry logs data model.  | spanId     |
-| logs_severity_text_message_key | The severity text id key to look up in the log events body/message. Sets the SeverityText field of the opentelemtry logs data model.  | severityText     |
-| logs_severity_number_message_key | The severity number id key to look up in the log events body/message. Sets the SeverityNumber field of the opentelemtry logs data model.  | severityNumber     |
-| add_label            | This allows you to add custom labels to all metrics exposed through the OpenTelemetry exporter. You may have multiple of these fields |           |
-| compress            | Set payload compression mechanism. Option available is 'gzip' |           |
-| logs_observed_timestamp_metadata_key | Specify an ObservedTimestamp key to look up in the metadata. | $ObservedKey |
-| logs_timestamp_metadata_key |Specify a Timestamp key to look up in the metadata. | $Timestamp |
-| logs_severity_key_metadata_key |Specify a SeverityText key to look up in the metadata.| $SeverityText |
-| logs_severity_number_metadata_key | Specify a SeverityNumber key to look up in the metadata.| $SeverityNumber |
-| logs_trace_flags_metadata_key |Specify a Flags key to look up in the metadata.| $Flags |
-| logs_span_id_metadata_key |Specify a SpanId key to look up in the metadata.| $SpanId |
-| logs_trace_id_metadata_key |Specify a TraceId key to look up in the metadata.| $TraceId |
-| logs_attributes_metadata_key |Specify an Attributes key to look up in the metadata.| $Attributes |
-
-## Getting Started
+The OpenTelemetry plugin lets you take logs, metrics, and traces from Fluent Bit and submit them to an OpenTelemetry HTTP endpoint.
+
+Only HTTP endpoints are supported.
+
+| Key | Description | Default |
+|-----|-------------|---------|
+| `host`| IP address or hostname of the target HTTP server. | `127.0.0.1` |
+| `http_user` | Basic Auth username. | _none_ |
+| `http_passwd` | Basic Auth password. Requires `HTTP_user` to be set. | _none_ |
+| `port` | TCP port of the target HTTP server. | `80` |
+| `proxy` | Specify an HTTP Proxy. The expected format value is `http://HOST:PORT`. HTTPS isn't supported. It's recommended to configure the [HTTP proxy environment variables](https://docs.fluentbit.io/manual/administration/http-proxy) instead as they support both HTTP and HTTPS. | _none_ |
+| `http2` | Defines whether HTTP/2 protocol is enabled. This setting also supports the `force` option, which forces HTTP/2 over a plain text connection. | `On` |
+| `grpc` | Enables gRPC over an HTTP/2 connection. This setting applies to HTTP/2 only. | `off` |
+| `metrics_uri` | Specify an optional HTTP URI for the target web server listening for metrics. For example, `/v1/metrics`. | `/` |
+| `logs_uri` | Specify an optional HTTP URI for the target web server listening for logs, For example, `/v1/logs`. | `/` |
+| `traces_uri` | Specify an optional HTTP URI for the target web server listening for traces, For example, `/v1/traces`. | `/` |
+| `header` | Add a HTTP header key/value pair. Multiple headers can be set. | _none_ |
+| `log_response_payload` | Log the response payload within the Fluent Bit log. | `false` |
+| `logs_body_key` | The log body key to look up in the log events body/message. Sets the `Body` field of the OpenTelemetry logs data model. | `message` |
+| `logs_trace_id_message_key` | The trace id key to look up in the log events body/message. Sets the `TraceId` field of the OpenTelemetry logs data model. | `traceId` |
+| `logs_span_id_message_key` | The span id key to look up in the log events body/message. Sets the `SpanId` field of the OpenTelemetry logs data model. | `spanId` |
+| `logs_severity_text_message_key` | The severity text id key to look up in the log events body/message. Sets the `SeverityText` field of the OpenTelemetry logs data model. | `severityText` |
+| `logs_severity_number_message_key` | The severity number id key to look up in the log events body/message. Sets the `SeverityNumber` field of the OpenTelemetry logs data model. | `severityNumber` |
+| `add_label` | Lets you add custom labels to all metrics exposed through the OpenTelemetry exporter. You can have multiple of these fields. | _none_ |
+| `compress` | Set payload compression mechanism. Allowed value: 'gzip'. | _none_ |
+| `logs_observed_timestamp_metadata_key` | Specify an `ObservedTimestamp` key to look up in the metadata. | `$ObservedKey` |
+| `logs_timestamp_metadata_key` | Specify a `Timestamp` key to look up in the metadata.        | `$Timestamp`      |
+| `logs_severity_key_metadata_key`       | Specify a `SeverityText` key to look up in the metadata.     | `$SeverityText`   |
+| `logs_severity_number_metadata_key`    | Specify a `SeverityNumber` key to look up in the metadata.   | `$SeverityNumber` |
+| `logs_trace_flags_metadata_key`        | Specify a `Flags` key to look up in the metadata.            | `$Flags`          |
+| `logs_span_id_metadata_key`            | Specify a `SpanId` key` to look up in the metadata.           | `$SpanId`         |
+| `logs_trace_id_metadata_key`           | Specify a `TraceId` key to look up in the metadata.          | `$TraceId`        |
+| `logs_attributes_metadata_key`         | Specify an `Attributes` key to look up in the metadata.      | `$Attributes`     |
+| `workers`  | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
+
+## Get started
 
 The OpenTelemetry plugin works with logs and only the metrics collected from one of the metric input plugins. In the following example, log records generated by the dummy plugin and the host metrics collected by the node exporter metrics plugin are exported by the OpenTelemetry output plugin.
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+# Dummy Logs and traces with Node Exporter Metrics export using OpenTelemetry output plugin
+# -------------------------------------------
+# The following example collects host metrics on Linux and dummy logs and traces and delivers
+# them through the OpenTelemetry plugin to a local collector :
+#
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: node_exporter_metrics
+      tag: node_metrics
+      scrape_interval: 2
+
+    - name: dummy
+      tag: dummy.log
+      rate: 3
+
+    - name: event_type
+      type: traces
+
+  outputs:
+    - name: opentelemetry
+      match: '*'
+      host: localhost
+      port: 443
+      metrics_uri: /v1/metrics
+      logs_uri: /v1/logs
+      traces_uri: /v1/traces
+      log_response_payload: true
+      tls: on
+      tls.verify: off
+      logs_body_key: $message
+      logs_span_id_message_key: span_id
+      logs_trace_id_message_key: trace_id
+      logs_severity_text_message_key: loglevel
+      logs_severity_number_message_key: lognum
+      # add user-defined labels
+      add_label:
+        - app fluent-bit
+        - color blue
 ```
-# Dummy Logs & traces with Node Exporter Metrics export using OpenTelemetry output plugin
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+# Dummy Logs and traces with Node Exporter Metrics export using OpenTelemetry output plugin
 # -------------------------------------------
-# The following example collects host metrics on Linux and dummy logs & traces and delivers
+# The following example collects host metrics on Linux and dummy logs and traces and delivers
 # them through the OpenTelemetry plugin to a local collector :
 #
 [SERVICE]
@@ -84,3 +138,6 @@ The OpenTelemetry plugin works with logs and only the metrics collected from one
     add_label            app fluent-bit
     add_label            color blue
 ```
+
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/outputs/postgresql.md b/pipeline/outputs/postgresql.md
index 6bb581ed8..e9f2759ea 100644
--- a/pipeline/outputs/postgresql.md
+++ b/pipeline/outputs/postgresql.md
@@ -1,30 +1,34 @@
 # PostgreSQL
 
-[PostgreSQL](https://www.postgresql.org) is a very popular and versatile open source database management system that supports the SQL language and that is capable of storing both structured and unstructured data, such as JSON objects.
+[PostgreSQL](https://www.postgresql.org) is an open source database management system that supports the SQL language and is capable of storing both structured and unstructured data, such as JSON objects.
 
-Given that Fluent Bit is designed to work with JSON objects, the `pgsql` output plugin allows users to send their data to a PostgreSQL database and store it using the `JSONB` type.
+Fluent Bit is designed to work with JSON objects, and the `pgsql` output plugin allows users to send their data to a PostgreSQL database and store it using the `JSONB` type.
 
 PostgreSQL 9.4 or higher is required.
 
 ## Preliminary steps
 
-According to the parameters you have set in the configuration file, the plugin will create the table defined by the `table` option in the database defined by the `database` option hosted on the server defined by the `host` option. It will use the PostgreSQL user defined by the `user` option, which needs to have the right privileges to create such a table in that database.
+According to the parameters set in the configuration file, the plugin creates the table defined by the `table` option in the database defined by the `database` option hosted on the server defined by the `host` option. It will use the PostgreSQL user defined by the `user` option, which must have the correct privileges to create such a table in that database.
 
-> **NOTE:** If you are not familiar with how PostgreSQL's users and grants system works, you might find useful reading the recommended links in the "References" section at the bottom.
+{% hint style="info" %}
 
-A typical installation normally consists of a self-contained database for Fluent Bit in which you can store the output of one or more pipelines. Ultimately, it is your choice to to store them in the same table, or in separate tables, or even in separate databases based on several factors, including workload, scalability, data protection and security.
+If you're not familiar with how PostgreSQL's users and grants system works, the links in the [References](#references) section might be helpful.
 
-In this example, for the sake of simplicity, we use a single table called `fluentbit` in a database called `fluentbit` that is owned by the user `fluentbit`. Feel free to use different names. Preferably, for security reasons, do not use the `postgres` user \(which has `SUPERUSER` privileges\).
+{% endhint %}
+
+A typical installation consists of a self-contained database for Fluent Bit in which you can store the output of one or more pipelines. You can store them in the same table, or in separate tables, or even in separate databases based on several factors, including workload, scalability, data protection, and security.
+
+This example uses a single table called `fluentbit` in a database called `fluentbit`, owned by the user `fluentbit`.  In your environment, use names appropriate to your needs. For security reasons, don't use the `postgres` user which has `SUPERUSER` privileges.
 
 ### Create the `fluentbit` user
 
-Generate a robust random password \(e.g. `pwgen 20 1`\) and store it safely. Then, as `postgres` system user on the server where PostgreSQL is installed, execute:
+Generate a robust random password (for example, `pwgen 20 1`) and store it safely. Then, as the `postgres` system user on the server where PostgreSQL is installed, execute:
 
-```bash
+```shell
 createuser -P fluentbit
 ```
 
-At the prompt, please provide the password that you previously generated.
+At the prompt, provide the password that you previously generated.
 
 As a result, the user `fluentbit` without superuser privileges will be created.
 
@@ -32,101 +36,128 @@ If you prefer, instead of the `createuser` application, you can directly use the
 
 ### Create the `fluentbit` database
 
-As `postgres` system user, please run:
+As `postgres` system user, run:
 
-```bash
+```shell
 createdb -O fluentbit fluentbit
 ```
 
-This will create a database called `fluentbit` owned by the `fluentbit` user. As a result, the `fluentbit` user will be able to safely create the data table.
+This creates a database called `fluentbit` owned by the `fluentbit` user. As a result, the `fluentbit` user will be able to safely create the data table.
 
 Alternatively, you can use the SQL command [`CREATE DATABASE`](https://www.postgresql.org/docs/current/sql-createdatabase.html).
 
 ### Connection
 
-Make sure that the `fluentbit` user can connect to the `fluentbit` database on the specified target host. This might require you to properly configure the [`pg_hba.conf`](https://www.postgresql.org/docs/current/auth-pg-hba-conf.html) file.
+Ensure that the `fluentbit` user can connect to the `fluentbit` database on the specified target host. This might require you to properly configure the [`pg_hba.conf`](https://www.postgresql.org/docs/current/auth-pg-hba-conf.html) file.
 
-## Configuration Parameters
+## Configuration parameters
+
+This plugin supports the following parameters:
 
 | Key | Description | Default |
-| :--- | :--- | :--- |
-| `Host` | Hostname/IP address of the PostgreSQL instance | - \(127.0.0.1\) |
-| `Port` | PostgreSQL port | - \(5432\) |
-| `User` | PostgreSQL username | - \(current user\) |
-| `Password` | Password of PostgreSQL username | - |
-| `Database` | Database name to connect to | - \(current user\) |
-| `Table` | Table name where to store data | - |
-| `Connection_Options` | Specifies any valid [PostgreSQL connection options](https://www.postgresql.org/docs/devel/libpq-connect.html#LIBPQ-CONNECT-OPTIONS) | - |
-| `Timestamp_Key` | Key in the JSON object containing the record timestamp | date |
-| `Async` | Define if we will use async or sync connections | false |
-| `min_pool_size` | Minimum number of connection in async mode | 1 |
-| `max_pool_size` | Maximum amount of connections in async mode | 4 |
-| `cockroachdb` | Set to `true` if you will connect the plugin with a CockroachDB | false |
+|:----|:------------|:-------|
+| `Host` | Hostname/IP address of the PostgreSQL instance. | `- (127.0.0.1)`|
+| `Port` | PostgreSQL port. | `- (5432)` |
+| `User` | PostgreSQL username. | `- (current user)` |
+| `Password` | Password of PostgreSQL username. | `-` |
+| `Database` | Database name to connect to. | `- (current user)` |
+| `Table` | Table name where to store data. | `-` |
+| `Connection_Options` | Specifies any valid [PostgreSQL connection options](https://www.postgresql.org/docs/devel/libpq-connect.html#LIBPQ-CONNECT-OPTIONS). | `-` |
+| `Timestamp_Key` | Key in the JSON object containing the record timestamp. | `date` |
+| `Async` | Define if the plugin will use asynchronous or synchronous connections. | `false` |
+| `max_pool_size` | Maximum amount of connections in asynchronous mode. | `4`|
+| `min_pool_size` | Minimum number of connection in asynchronous mode. | `1` |
+| `cockroachdb` | Set to `true` if you will connect the plugin with a CockroachDB. | `false` |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
 ### Libpq
 
-Fluent Bit relies on [libpq](https://www.postgresql.org/docs/current/libpq.html), the PostgreSQL native client API, written in C language. For this reason, default values might be affected by [environment variables](https://www.postgresql.org/docs/current/libpq-envars.html) and compilation settings. The above table, in brackets, list the most common default values for each connection option.
+Fluent Bit relies on [libpq](https://www.postgresql.org/docs/current/libpq.html), the PostgreSQL native client API. For this reason, default values might be affected by [environment variables](https://www.postgresql.org/docs/current/libpq-envars.html) and compilation settings. The previous table lists the most common default values for each connection option.
 
-For security reasons, it is advised to follow the directives included in the [password file](https://www.postgresql.org/docs/current/libpq-pgpass.html) section.
+For security reasons, you're advised to follow the directives included in the [password file](https://www.postgresql.org/docs/current/libpq-pgpass.html) section.
 
-## Configuration Example
+## Configuration example
 
 In your main configuration file add the following section:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: pgsql
+      match: '*'
+      host: 172.17.0.2
+      port: 5432
+      user: fluentbit
+      password: YourCrazySecurePassword
+      database: fluentbit
+      table: fluentbit
+      connection_options: '-c statement_timeout=0'
+      timestamp_key: ts
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
 ```text
 [OUTPUT]
-    Name                pgsql
-    Match               *
-    Host                172.17.0.2
-    Port                5432
-    User                fluentbit
-    Password            YourCrazySecurePassword
-    Database            fluentbit
-    Table               fluentbit
-    Connection_Options  -c statement_timeout=0
-    Timestamp_Key       ts
+  Name                pgsql
+  Match               *
+  Host                172.17.0.2
+  Port                5432
+  User                fluentbit
+  Password            YourCrazySecurePassword
+  Database            fluentbit
+  Table               fluentbit
+  Connection_Options  -c statement_timeout=0
+  Timestamp_Key       ts
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ## The output table
 
 The output plugin automatically creates a table with the name specified by the `table` configuration option and made up of the following fields:
 
-* `tag TEXT`
-* `time TIMESTAMP WITHOUT TIMEZONE`
-* `data JSONB`
+- `tag TEXT`
+- `time TIMESTAMP WITHOUT TIMEZONE`
+- `data JSONB`
 
-As you can see, the timestamp does not contain any information about the time zone and it is therefore referred to the time zone used by the connection to PostgreSQL \(`timezone` setting\).
+The timestamp doesn't contain any information about the time zone, and it's therefore referred to the time zone used by the connection to PostgreSQL (`timezone` setting).
 
-For more information on the `JSONB` data type in PostgreSQL, please refer to the [JSON types](https://www.postgresql.org/docs/current/datatype-json.html) page in the official documentation, where you can find instructions on how to index or query the objects \(including `jsonpath` introduced in PostgreSQL 12\).
+For more information about the `JSONB` data type in PostgreSQL, refer to the [JSON types](https://www.postgresql.org/docs/current/datatype-json.html) page in the official documentation. You can find instructions on how to index or query the objects (including `jsonpath` introduced in PostgreSQL 12).
 
 ## Scalability
 
-PostgreSQL 10 introduces support for declarative partitioning. In order to improve vertical scalability of the database, you can decide to partition your tables on _time ranges_ \(for example on a monthly basis\). PostgreSQL supports also subpartitions, allowing you to even partition by _hash_ your records \(version 11+\), and default partitions \(version 11+\).
+PostgreSQL includes support for declarative partitioning. To improve vertical scalability of the database, you can partition your tables on time ranges, such as on a monthly basis. PostgreSQL supports also sub-partitions, which let you partition your records by hash and default partitions.
 
-For more information on horizontal partitioning in PostgreSQL, please refer to the [Table partitioning](https://www.postgresql.org/docs/current/ddl-partitioning.html) page in the official documentation.
+For more information on horizontal partitioning in PostgreSQL, refer to the [Table partitioning](https://www.postgresql.org/docs/current/ddl-partitioning.html) page in the official documentation.
 
-If you are starting now, our recommendation at the moment is to choose the latest major version of PostgreSQL.
+Choose the latest major version of PostgreSQL if you're starting now.
 
-## There's more ...
+## Additional information
 
-PostgreSQL is a really powerful and extensible database engine. More expert users can indeed take advantage of `BEFORE INSERT` triggers on the main table and re-route records on normalised tables, depending on tags and content of the actual JSON objects.
+PostgreSQL is a powerful and extensible database engine. More expert users can take advantage of `BEFORE INSERT` triggers on the main table and reroute records on normalised tables, depending on tags and content of the actual JSON objects.
 
-For example, you can use Fluent Bit to send HTTP log records to the _landing_ table defined in the configuration file. This table contains a `BEFORE INSERT` trigger \(a function in `plpgsql` language\) that _normalises_ the content of the JSON object and that inserts the record in another table \(with its own structure and partitioning model\). This kind of triggers allow you to _discard_ the record from the landing table by returning `NULL`.
+For example, you can use Fluent Bit to send HTTP log records to the `landing` table defined in the configuration file. This table contains a `BEFORE INSERT` trigger (a function in `plpgsql` language) that normalizes the content of the JSON object and that inserts the record in another table (with its own structure and partitioning model). This kind of trigger lets you discard the record from the landing table by returning `NULL`.
 
 ## References
 
-Here follows a list of useful resources from the PostgreSQL documentation:
-
-* [Database Roles](https://www.postgresql.org/docs/current/user-manag.html)
-* [`GRANT`](https://www.postgresql.org/docs/current/sql-grant.html)
-* [`CREATE USER`](https://www.postgresql.org/docs/current/sql-createuser.html)
-* [`CREATE DATABASE`](https://www.postgresql.org/docs/current/sql-createdatabase.html)
-* [The `pg_hba.conf` file](https://www.postgresql.org/docs/current/auth-pg-hba-conf.html)
-* [JSON types](https://www.postgresql.org/docs/current/datatype-json.html)
-* [Date/Time functions and operators](https://www.postgresql.org/docs/current/functions-datetime.html)
-* [Table partitioning](https://www.postgresql.org/docs/current/ddl-partitioning.html)
-* [libpq - C API for PostgreSQL](https://www.postgresql.org/docs/current/libpq.html)
-* [libpq - Environment variables](https://www.postgresql.org/docs/current/libpq-envars.html)
-* [libpq - password file](https://www.postgresql.org/docs/current/libpq-pgpass.html)
-* [Trigger functions](https://www.postgresql.org/docs/current/plpgsql-trigger.html)
-
+Refer to the following a list of resources from the PostgreSQL documentation:
+
+- [Database Roles](https://www.postgresql.org/docs/current/user-manag.html)
+- [`GRANT`](https://www.postgresql.org/docs/current/sql-grant.html)
+- [`CREATE USER`](https://www.postgresql.org/docs/current/sql-createuser.html)
+- [`CREATE DATABASE`](https://www.postgresql.org/docs/current/sql-createdatabase.html)
+- [The `pg_hba.conf` file](https://www.postgresql.org/docs/current/auth-pg-hba-conf.html)
+- [JSON types](https://www.postgresql.org/docs/current/datatype-json.html)
+- [Date/Time functions and operators](https://www.postgresql.org/docs/current/functions-datetime.html)
+- [Table partitioning](https://www.postgresql.org/docs/current/ddl-partitioning.html)
+- [libpq - C API for PostgreSQL](https://www.postgresql.org/docs/current/libpq.html)
+- [libpq - Environment variables](https://www.postgresql.org/docs/current/libpq-envars.html)
+- [libpq - password file](https://www.postgresql.org/docs/current/libpq-pgpass.html)
+- [Trigger functions](https://www.postgresql.org/docs/current/plpgsql-trigger.html)
diff --git a/pipeline/outputs/prometheus-exporter.md b/pipeline/outputs/prometheus-exporter.md
index 7db7c6d2d..e66a39b6a 100644
--- a/pipeline/outputs/prometheus-exporter.md
+++ b/pipeline/outputs/prometheus-exporter.md
@@ -2,25 +2,32 @@
 description: An output plugin to expose Prometheus Metrics
 ---
 
-# Prometheus Exporter
+# Prometheus exporter
 
-The prometheus exporter allows you to take metrics from Fluent Bit and expose them such that a Prometheus instance can scrape them. 
+The _Prometheus exporter_ lets you take metrics from Fluent Bit and expose them so a Prometheus instance can scrape them.
 
-Important Note: The prometheus exporter only works with metric  plugins, such as Node Exporter Metrics
+The Prometheus exporter works only with metric plugins such as Node Exporter Metrics.
+
+
+## Configuration parameters
+
+This plugin supports the following parameters:
 
 | Key | Description | Default |
-| :--- | :--- | :--- |
-| host | This is address Fluent Bit will bind to when hosting prometheus metrics. Note: `listen` parameter is deprecated from v1.9.0. | 0.0.0.0 |
-| port | This is the port Fluent Bit will bind to when hosting prometheus metrics | 2021 |
-| add\_label | This allows you to add custom labels to all metrics exposed through the prometheus exporter. You may have multiple of these fields |  |
+|:----|:------------|:--------|
+| `host` | This is address Fluent Bit will bind to when hosting Prometheus metrics. The `listen` parameter is deprecated in 1.9.0 and later. | `0.0.0.0` |
+| `port` | This is the port Fluent Bit will bind to when hosting Prometheus metrics. | `2021` |
+| `add_label` | This lets you add custom labels to all metrics exposed through the Prometheus exporter. You can have multiple of these fields. | _none_ |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `1` |
 
-## Getting Started
+## Get started
 
-The Prometheus exporter only works with metrics captured from metric plugins. In the following example, host metrics are captured by the node exporter metrics plugin and then are routed to prometheus exporter. Within the output plugin two labels are added `app="fluent-bit"`and `color="blue"`
+The Prometheus exporter works only with metrics captured from metric plugins. In the following example, host metrics are captured by the node exporter metrics plugin and then are routed to Prometheus exporter. In the output plugin, the labels `app="fluent-bit"`and `color="blue"` are added.
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```text
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
 # Node Exporter Metrics + Prometheus Exporter
 # -------------------------------------------
 # The following example collect host metrics on Linux and expose
@@ -30,28 +37,31 @@ The Prometheus exporter only works with metrics captured from metric plugins. In
 #
 # $ curl http://127.0.0.1:2021/metrics
 #
-[SERVICE]
-    flush           1
-    log_level       info
+service:
+  flush: 1
+  log_level: info
 
-[INPUT]
-    name            node_exporter_metrics
-    tag             node_metrics
-    scrape_interval 2
+pipeline:
+  inputs:
+    - name: node_exporter_metrics
+      tag:  node_metrics
+      scrape_interval: 2
 
-[OUTPUT]
-    name            prometheus_exporter
-    match           node_metrics
-    host            0.0.0.0
-    port            2021
-    # add user-defined labels
-    add_label       app fluent-bit
-    add_label       color blue
+  outputs:
+    - name: prometheus_exporter
+      match: node_metrics
+      host: 0.0.0.0
+      port: 2021
+      # add user-defined labels
+      add_label:
+        - app fluent-bit
+        - color blue
 ```
+
 {% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-{% tab title="fluent-bit.yaml" %}
-```yaml
+```text
 # Node Exporter Metrics + Prometheus Exporter
 # -------------------------------------------
 # The following example collect host metrics on Linux and expose
@@ -61,23 +71,24 @@ The Prometheus exporter only works with metrics captured from metric plugins. In
 #
 # $ curl http://127.0.0.1:2021/metrics
 #
-service:
-    flush: 1
-    log_level: info
-pipeline:
-    inputs:
-        - name: node_exporter_metrics
-          tag:  node_metrics
-          scrape_interval: 2
-    outputs:
-        - name: prometheus_exporter
-          match: node_metrics
-          host: 0.0.0.0
-          port: 2021
-          # add user-defined labels
-          add_label:
-            - app fluent-bit
-            - color blue
+[SERVICE]
+  flush           1
+  log_level       info
+
+[INPUT]
+  name            node_exporter_metrics
+  tag             node_metrics
+  scrape_interval 2
+
+[OUTPUT]
+  name            prometheus_exporter
+  match           node_metrics
+  host            0.0.0.0
+  port            2021
+  # add user-defined labels
+  add_label       app fluent-bit
+  add_label       color blue
 ```
+
 {% endtab %}
 {% endtabs %}
diff --git a/pipeline/outputs/prometheus-remote-write.md b/pipeline/outputs/prometheus-remote-write.md
index 0d430457e..ceba7ab04 100644
--- a/pipeline/outputs/prometheus-remote-write.md
+++ b/pipeline/outputs/prometheus-remote-write.md
@@ -2,134 +2,324 @@
 description: An output plugin to submit Prometheus Metrics using the remote write protocol
 ---
 
-# Prometheus Remote Write
-
-The prometheus remote write plugin allows you to take metrics from Fluent Bit and submit them to a Prometheus server through the remote write mechanism.
-
-Important Note: The prometheus exporter only works with metric plugins, such as Node Exporter Metrics
-
-| Key                  | Description                                                                                                                                                                                                                                                            | Default   |
-| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
-| host                 | IP address or hostname of the target HTTP Server                                                                                                                                                                                                                       | 127.0.0.1 |
-| http_user            | Basic Auth Username                                                                                                                                                                                                                                                    |           |
-| http_passwd          | Basic Auth Password. Requires HTTP_user to be set                                                                                                                                                                                                                      |           |
-| AWS\_Auth                  | Enable AWS SigV4 authentication                                                                                                                                                                                                                                                                                                    | false     |
-| AWS\_Service               | For Amazon Managed Service for Prometheus, the service name is aps                                                                                                                   | aps          |
-| AWS\_Region                | Region of your Amazon Managed Service for Prometheus workspace                                                                                                                                                                                                                                                               |           |
-| AWS\_STS\_Endpoint         | Specify the custom sts endpoint to be used with STS API, used with the AWS_Role_ARN option, used by SigV4 authentication                                                                                                                                                                                                           |           |
-| AWS\_Role\_ARN             | AWS IAM Role to assume, used by SigV4 authentication                                                                                                                                                                                                                                                                               |           |
-| AWS\_External\_ID          | External ID for the AWS IAM Role specified with `aws_role_arn`, used by SigV4 authentication                                                                                                                                                                                                                                       |           |
-| port                 | TCP port of the target HTTP Server                                                                                                                                                                                                                                     | 80        |
-| proxy                | Specify an HTTP Proxy. The expected format of this value is `http://HOST:PORT`. Note that HTTPS is **not** currently supported. It is recommended not to set this and to configure the [HTTP proxy environment variables](https://docs.fluentbit.io/manual/administration/http-proxy) instead as they support both HTTP and HTTPS. |           |
-| uri                  | Specify an optional HTTP URI for the target web server, e.g: /something                                                                                                                                                                                                | /         |
-| header               | Add a HTTP header key/value pair. Multiple headers can be set.                                                                                                                                                                                                         |           |
-| log_response_payload | Log the response payload within the Fluent Bit log                                                                                                                                                                                                                     | false     |
-| add_label            | This allows you to add custom labels to all metrics exposed through the prometheus exporter. You may have multiple of these fields                                                                                                                                     |           |
-| Workers | Enables dedicated thread(s) for this output. Default value is set since version 1.8.13. For previous versions is 0. | 2 |
-
-## Getting Started
-
-The Prometheus remote write plugin only works with metrics collected by one of the from metric input plugins. In the following example, host metrics are collected by the node exporter metrics plugin and then delivered by the prometheus remote write output plugin.
+# Prometheus remote write
 
+The _Prometheus remote write_ plugin lets you take metrics from Fluent Bit and submit them to a Prometheus server through the remote write mechanism.
+
+The Prometheus exporter works only with metric plugins, such as Node Exporter Metrics.
+
+## Configuration parameters
+
+This plugin supports the following parameters:
+
+| Key | Description | Default |
+|-----|-------------|---------|
+| `host` | IP address or hostname of the target HTTP server. | `127.0.0.1` |
+| `http_user` | Basic Auth username. | _none_ |
+| `http_passwd` | Basic Auth Password. Requires `HTTP_user` to be set. | _none_ |
+| `AWS_Auth` | Enable AWS SigV4 authentication. | `false` |
+| `AWS_Service` | For Amazon Managed Service for Prometheus, the service name is `aps`. | `aps` |
+| `AWS_Region` | Region of your Amazon Managed Service for Prometheus workspace. | _none_ |
+| `AWS_STS_Endpoint` | Specify the custom STS endpoint to be used with STS API, used with the `AWS_Role_ARN` option, used by SigV4 authentication. | _none_ |
+| `AWS_Role_ARN` | AWS IAM Role to assume, used by SigV4 authentication. | _none_ |
+| `AWS_External_ID` | External ID for the AWS IAM Role specified with `aws_role_arn`, used by SigV4 authentication. | _none_ |
+| `port` | TCP port of the target HTTP server. | `80` |
+| `proxy` | Specify an HTTP proxy. The expected format of this value is `http://HOST:PORT`. HTTPS isn't supported. Configure the [HTTP proxy environment variables](https://docs.fluentbit.io/manual/administration/http-proxy) instead as they support both HTTP and HTTPS. | _none_ |
+| `uri` | Specify an optional HTTP URI for the target web server. For example: `/someuri` | `/` |
+| `header` | Add a HTTP header key/value pair. Multiple headers can be set. | _none_ |
+| `log_response_payload` | Log the response payload within the Fluent Bit log. | `false` |
+| `add_label` | This lets you add custom labels to all metrics exposed through the Prometheus exporter. You can have multiple of these fields. | _none_ |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `2` |
+
+## Get started
+
+The Prometheus remote write plugin works only with metrics collected by one of the metric input plugins. In the following example, host metrics are collected by the node exporter metrics plugin and then delivered by the Prometheus remote write output plugin.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+# Node Exporter Metrics + Prometheus remote write output plugin
+# -------------------------------------------
+# The following example collects host metrics on Linux and delivers
+# them through the Prometheus remote write plugin to new relic :
+#
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: node_exporter_metrics
+      tag: node_metrics
+      scrape_interval: 2
+
+  outputs:
+    - name: prometheus_remote_write
+      match: node_metrics
+      host: metric-api.newrelic.com
+      port: 443
+      uri: /prometheus/v1/write?prometheus_server=YOUR_DATA_SOURCE_NAME
+      header: 'Authorization Bearer YOUR_LICENSE_KEY'
+      log_response_payload: true
+      tls: on
+      tls.verify: on
+      # add user-defined labels
+      add_label:
+        - app fluent-bit
+        - color blue
+# Note : it would be necessary to replace both YOUR_DATA_SOURCE_NAME and YOUR_LICENSE_KEY
+# with real values for this example to work.
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 # Node Exporter Metrics + Prometheus remote write output plugin
 # -------------------------------------------
 # The following example collects host metrics on Linux and delivers
 # them through the Prometheus remote write plugin to new relic :
 #
 [SERVICE]
-    Flush                1
-    Log_level            info
+  Flush                1
+  Log_level            info
 
 [INPUT]
-    Name                 node_exporter_metrics
-    Tag                  node_metrics
-    Scrape_interval      2
+  Name                 node_exporter_metrics
+  Tag                  node_metrics
+  Scrape_interval      2
 
 [OUTPUT]
-    Name                 prometheus_remote_write
-    Match                node_metrics
-    Host                 metric-api.newrelic.com
-    Port                 443
-    Uri                  /prometheus/v1/write?prometheus_server=YOUR_DATA_SOURCE_NAME
-    Header               Authorization Bearer YOUR_LICENSE_KEY
-    Log_response_payload True
-    Tls                  On
-    Tls.verify           On
-    # add user-defined labels
-    add_label            app fluent-bit
-    add_label            color blue
+  Name                 prometheus_remote_write
+  Match                node_metrics
+  Host                 metric-api.newrelic.com
+  Port                 443
+  Uri                  /prometheus/v1/write?prometheus_server=YOUR_DATA_SOURCE_NAME
+  Header               Authorization Bearer YOUR_LICENSE_KEY
+  Log_response_payload True
+  Tls                  On
+  Tls.verify           On
+  # add user-defined labels
+  add_label            app fluent-bit
+  add_label            color blue
 
 # Note : it would be necessary to replace both YOUR_DATA_SOURCE_NAME and YOUR_LICENSE_KEY
 # with real values for this example to work.
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ## Examples
 
-The following are examples of using Prometheus remote write with hosted services below
+The following are examples of using Prometheus remote write with hosted services:
 
 ### Grafana Cloud
 
-With [Grafana Cloud](https://grafana.com/products/cloud/) hosted metrics you will need to use the specific host that is mentioned as well as specify the HTTP username and password given within the Grafana Cloud page.
+With [Grafana Cloud](https://grafana.com/products/cloud/) hosted metrics you will need to use the specific host mentioned and specify the HTTP username and password given within the Grafana Cloud page.
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: prometheus_remote_write
+      match: '*'
+      host: prometheus-us-central1.grafana.net
+      uri: /api/prom/push
+      port: 443
+      tls: on
+      tls.verify: on
+      http_user: <GRAFANA Username>
+      http_passwd: <GRAFANA Password>
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-    name prometheus_remote_write
-    host prometheus-us-central1.grafana.net
-    match *
-    uri /api/prom/push
-    port 443
-    tls on
-    tls.verify on
-    http_user <GRAFANA Username>
-    http_passwd <GRAFANA Password>
+  name        prometheus_remote_write
+  match       *
+  host        prometheus-us-central1.grafana.net
+  uri         /api/prom/push
+  port        443
+  tls         on
+  tls.verify  on
+  http_user   <GRAFANA Username>
+  http_passwd <GRAFANA Password>
 ```
 
-### Logz.io Infrastructure Monitoring
+{% endtab %}
+{% endtabs %}
+
+### Logz.io infrastructure monitoring
+
+With Logz.io [hosted Prometheus](https://logz.io/solutions/infrastructure-monitoring/) you will need to make use of the header option and add the Authorization Bearer with the proper key. The host and port can also differ within your specific hosted instance.
 
-With Logz.io [hosted prometheus](https://logz.io/solutions/infrastructure-monitoring/) you will need to make use of the header option and add the Authorization Bearer with the proper key. The host and port may also differ within your specific hosted instance.
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
+```yaml
+pipeline:
+
+  outputs:
+    - name: prometheus_remote_write
+      match: '*'
+      host: listener.logz.io
+      port: 8053
+      tls: on
+      tls.verify: on
+      log_response_payload: true
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-    name prometheus_remote_write
-    host listener.logz.io
-    port 8053 
-    match *
-    header Authorization Bearer <LOGZIO Key>
-    tls on
-    tls.verify on
-    log_response_payload true
+  name                  prometheus_remote_write
+  match                 *
+  host                  listener.logz.io
+  port                  8053
+  header                Authorization Bearer <LOGZIO Key>
+  tls                   on
+  tls.verify            on
+  log_response_payload true
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ### Coralogix
 
-With [Coralogix Metrics](https://coralogix.com/platform/metrics/) you may need to customize the URI. Additionally, you will make use of the header key with Coralogix private key.
+With [Coralogix Metrics](https://coralogix.com/platform/) you might need to customize the URI. Additionally, you will make use of the header key with Coralogix private key.
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: prometheus_remote_write
+      match: '*'
+      host: metrics-api.coralogix.com
+      uri: prometheus/api/v1/write?appLabelName=path&subSystemLabelName=path&severityLabelName=severity
+      port: 443
+      header: 'Authorization Bearer <CORALOGIX Key>'
+      tls: on
+      tls.verify: on
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-    name prometheus_remote_write
-    host metrics-api.coralogix.com
-    uri prometheus/api/v1/write?appLabelName=path&subSystemLabelName=path&severityLabelName=severity 
-    match *
-    port 443
-    tls on
-    tls.verify on
-    header Authorization Bearer <CORALOGIX Key>
+  name                  prometheus_remote_write
+  match                 *
+  host                  metrics-api.coralogix.com
+  uri                   prometheus/api/v1/write?appLabelName=path&subSystemLabelName=path&severityLabelName=severity
+  port                  443
+  header                Authorization Bearer <CORALOGIX Key>
+  tls                   on
+  tls.verify            on
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ### Levitate
 
 With [Levitate](https://last9.io/levitate-tsdb), you must use the Levitate cluster-specific write URL and specify the HTTP username and password for the token created for your Levitate cluster.
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: prometheus_remote_write
+      match: '*'
+      host: app-tsdb.last9.io
+      uri: /v1/metrics/82xxxx/sender/org-slug/write
+      port: 443
+      tls: on
+      tls.verify: on
+      http_user: <Levitate Cluster Username>
+      http_passwd: <Levitate Cluster Password>
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[OUTPUT]
+  name        prometheus_remote_write
+  match       *
+  host        app-tsdb.last9.io
+  uri         /v1/metrics/82xxxx/sender/org-slug/write
+  port        443
+  tls         on
+  tls.verify  on
+  http_user   <Levitate Cluster Username>
+  http_passwd <Levitate Cluster Password>
 ```
+
+{% endtab %}
+{% endtabs %}
+
+### Add Prometheus-like labels
+
+Ordinary Prometheus clients add some of the following labels:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: prometheus_remote_write
+      match: your.metric
+      host: xxxxxxx.yyyyy.zzzz
+      port: 443
+      uri: /api/v1/write
+      header: 'Authorization Bearer YOUR_LICENSE_KEY'
+      log_response_payload: true
+      tls: on
+      tls.verify: on
+      # add user-defined labels
+      add_label:
+        - instance ${HOSTNAME}
+        - job fluent-bit
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-    name prometheus_remote_write
-    host app-tsdb.last9.io
-    match *
-    uri /v1/metrics/82xxxx/sender/org-slug/write
-    port 443
-    tls on
-    tls.verify on
-    http_user <Levitate Cluster Username>
-    http_passwd <Levitate Cluster Password>
+  Name                 prometheus_remote_write
+  Match                your.metric
+  Host                 xxxxxxx.yyyyy.zzzz
+  Port                 443
+  Uri                  /api/v1/write
+  Header               Authorization Bearer YOUR_LICENSE_KEY
+  Log_response_payload True
+  Tls                  On
+  Tls.verify           On
+  # add user-defined labels
+  add_label instance ${HOSTNAME}
+  add_label job fluent-bit
 ```
+
+{% endtab %}
+{% endtabs %}
+
+The `instance` label can be emulated with `add_label instance ${HOSTNAME}`. And other labels can be added with `add_label <key> <value>` setting.
diff --git a/pipeline/outputs/s3.md b/pipeline/outputs/s3.md
index 469123d87..b4d8ec4dd 100644
--- a/pipeline/outputs/s3.md
+++ b/pipeline/outputs/s3.md
@@ -1,331 +1,530 @@
 ---
-description: Send logs, data, metrics to Amazon S3
+description: Send logs, data, and metrics to Amazon S3
 ---
 
 # Amazon S3
 
-![](<../../.gitbook/assets/image (9).png>)
+![AWS logo](<../../.gitbook/assets/image (9).png>)
 
-The Amazon S3 output plugin allows you to ingest your records into the [S3](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) cloud object store.
+The _Amazon S3_ output plugin lets you ingest records into the [S3](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) cloud object store.
 
-The plugin can upload data to S3 using the [multipart upload API](https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html) or using S3 [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API\_PutObject.html). Multipart is the default and is recommended; Fluent Bit will stream data in a series of 'parts'. This limits the amount of data it has to buffer on disk at any point in time. By default, every time 5 MiB of data have been received, a new 'part' will be uploaded. The plugin can create files up to gigabytes in size from many small chunks/parts using the multipart API. All aspects of the upload process are configurable using the configuration options.
+The plugin can upload data to S3 using the [multipart upload API](https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html) or [`PutObject`](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html). Multipart is the default and is recommended. Fluent Bit will stream data in a series of _parts_. This limits the amount of data buffered on disk at any point in time. By default, every time 5&nbsp;MiB of data have been received, a new part will be uploaded. The plugin can create files up to gigabytes in size from many small chunks or parts using the multipart API. All aspects of the upload process are configurable.
 
-The plugin allows you to specify a maximum file size, and a timeout for uploads. A file will be created in S3 when the max size is reached, or the timeout is reached- whichever comes first.
+The plugin lets you specify a maximum file size, and a timeout for uploads. A file will be created in S3 when the maximum size or the timeout is reached, whichever comes first.
 
 Records are stored in files in S3 as newline delimited JSON.
 
-See [here](https://github.com/fluent/fluent-bit-docs/tree/43c4fe134611da471e706b0edb2f9acd7cdfdbc3/administration/aws-credentials.md) for details on how AWS credentials are fetched.
-
-**NOTE**: _The_ [_Prometheus success/retry/error metrics values_](administration/monitoring.md) _outputted by Fluent Bit's built-in http server are meaningless for the S3 output_. This is because S3 has its own buffering and retry mechanisms. The Fluent Bit AWS S3 maintainers apologize for this feature gap; you can [track our progress fixing it on GitHub](https://github.com/fluent/fluent-bit/issues/6141).
-
-## Configuration Parameters
-
-| Key                              | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | Default                                 |
-|----------------------------------| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- |
-| region                           | The AWS region of your S3 bucket                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | us-east-1                               |
-| bucket                           | S3 Bucket name                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | None                                    |
-| json\_date\_key                  | Specify the name of the time key in the output record. To disable the time key just set the value to `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | date                                    |
-| json\_date\_format               | Specify the format of the date. Supported formats are _double_, _epoch_, _iso8601_ (eg: _2018-05-30T09:39:52.000681Z_) and _java\_sql\_timestamp_ (eg: _2018-05-30 09:39:52.000681_)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | iso8601                                 |
-| total\_file\_size                | Specifies the size of files in S3. Minimum size is 1M. With `use_put_object On` the maximum size is 1G. With multipart upload mode, the maximum size is 50G.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | 100M                                    |
-| upload\_chunk\_size              | The size of each 'part' for multipart uploads. Max: 50M                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | 5,242,880 bytes                         |
-| upload\_timeout                  | Whenever this amount of time has elapsed, Fluent Bit will complete an upload and create a new file in S3. For example, set this value to 60m and you will get a new file every hour.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | 10m                                     |
-| store\_dir                       | Directory to locally buffer data before sending. When multipart uploads are used, data will only be buffered until the `upload_chunk_size` is reached. S3 will also store metadata about in progress multipart uploads in this directory; this allows pending uploads to be completed even if Fluent Bit stops and restarts. It will also store the current $INDEX value if enabled in the S3 key format so that the $INDEX can keep incrementing from its previous value after Fluent Bit restarts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | /tmp/fluent-bit/s3                      |
-| store\_dir\_limit\_size          | The size of the limitation for disk usage in S3. Limit the amount of s3 buffers in the `store_dir` to limit disk usage. Note: Use `store_dir_limit_size` instead of `storage.total_limit_size` which can be used to other plugins, because S3 has its own buffering system.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | 0, which means unlimited                |
-| s3\_key\_format                  | Format string for keys in S3. This option supports a UUID, strftime time formatters, a syntax for selecting parts of the Fluent log tag using a syntax inspired by the rewrite\_tag filter. Add $UUID in the format string to insert a random string. Add $INDEX in the format string to insert an integer that increments each upload. The $INDEX value will be saved in the store\_dir so that if Fluent Bit restarts the value will keep incrementing from the previous run. Add $TAG in the format string to insert the full log tag; add $TAG\[0] to insert the first part of the tag in the s3 key. The tag is split into “parts” using the characters specified with the `s3_key_format_tag_delimiters` option. Add extension directly after the last piece of the format string to insert a key suffix. If you want to specify a key suffix and you are in `use_put_object` mode, you must specify $UUID as well. More explanations can be found in the S3 Key Format explainer section further down in this document. See the in depth examples and tutorial in the documentation. Time in s3\_key is the timestamp of the first record in the S3 file. | /fluent-bit-logs/$TAG/%Y/%m/%d/%H/%M/%S |
-| s3\_key\_format\_tag\_delimiters | A series of characters which will be used to split the tag into 'parts' for use with the s3\_key\_format option. See the in depth examples and tutorial in the documentation.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | .                                       |
-| static\_file\_path               | Disables behavior where UUID string is automatically appended to end of S3 key name when $UUID is not provided in s3\_key\_format. $UUID, time formatters, $TAG, and other dynamic key formatters all work as expected while this feature is set to true.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | false                                   |
-| use\_put\_object                 | Use the S3 PutObject API, instead of the multipart upload API. When this option is on, key extension is only available when $UUID is specified in `s3_key_format`. If $UUID is not included, a random string will be appended at the end of the format string and the key extension cannot be customized in this case.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | false                                   |
-| role\_arn                        | ARN of an IAM role to assume (ex. for cross account access).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | None                                    |
-| endpoint                         | Custom endpoint for the S3 API. An endpoint can contain scheme and port.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | None                                    |
-| sts\_endpoint                    | Custom endpoint for the STS API.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | None                                    |
-| profile                          | Option to specify an AWS Profile for credentials.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | default                                 |
-| canned\_acl                      | [Predefined Canned ACL policy](https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl) for S3 objects.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | None                                    |
-| compression                      | Compression type for S3 objects. 'gzip' is currently the only supported value by default. If Apache Arrow support was enabled at compile time, you can also use 'arrow'. For gzip compression, the Content-Encoding HTTP Header will be set to 'gzip'. Gzip compression can be enabled when `use_put_object` is 'on' or 'off' (PutObject and Multipart). Arrow compression can only be enabled with `use_put_object On`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | None                                    |
-| content\_type                    | A standard MIME type for the S3 object; this will be set as the Content-Type HTTP header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | None                                    |
-| send\_content\_md5               | Send the Content-MD5 header with PutObject and UploadPart requests, as is required when Object Lock is enabled.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | false                                   |
-| auto\_retry\_requests            | Immediately retry failed requests to AWS services once. This option does not affect the normal Fluent Bit retry mechanism with backoff. Instead, it enables an immediate retry with no delay for networking errors, which may help improve throughput when there are transient/random networking issues.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | true                                    |
-| log\_key                         | By default, the whole log record will be sent to S3. If you specify a key name with this option, then only the value of that key will be sent to S3. For example, if you are using Docker, you can specify log\_key log and only the log message will be sent to S3.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | None                                    |
-| preserve\_data\_ordering         | Normally, when an upload request fails, there is a high chance for the last received chunk to be swapped with a later chunk, resulting in data shuffling. This feature prevents this shuffling by using a queue logic for uploads.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | true                                    |
-| storage\_class                   | Specify the [storage class](https://docs.aws.amazon.com/AmazonS3/latest/API/API\_PutObject.html#AmazonS3-PutObject-request-header-StorageClass) for S3 objects. If this option is not specified, objects will be stored with the default 'STANDARD' storage class.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | None                                    |
-| retry\_limit                     | Integer value to set the maximum number of retries allowed. Note: this configuration is released since version 1.9.10 and 2.0.1. For previous version, the number of retries is 5 and is not configurable.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 1                                       |
-| external\_id                     | Specify an external ID for the STS API, can be used with the role\_arn parameter if your role requires an external ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | None                                    |
+See [AWS Credentials](https://github.com/fluent/fluent-bit-docs/tree/43c4fe134611da471e706b0edb2f9acd7cdfdbc3/administration/aws-credentials.md)
+for details about fetching AWS credentials.
+
+{% hint style="warning" %}
+
+The [Prometheus success/retry/error metrics values](../../administration/monitoring.md) output by the built-in HTTP server in Fluent Bit are meaningless for S3 output. S3 has its own buffering and retry mechanisms. The Fluent Bit AWS S3 maintainers acknowledge this feature gap, and you can [track issue progress on GitHub](https://github.com/fluent/fluent-bit/issues/6141).
+
+{% endhint %}
+
+## Configuration parameters
+
+| Key                | Description                       | Default     |
+|--------------------| --------------------------------- | ----------- |
+| `region`           | The AWS region of your S3 bucket. | `us-east-1` |
+| `bucket`           | S3 Bucket name                    | _none_ |
+| `json_date_key`    | Specify the time key name in the output record. To disable the time key, set the value to `false`. | `date` |
+| `json_date_format` | Specify the format of the date. Accepted values: `double`, `epoch`, `iso8601` (2018-05-30T09:39:52.000681Z), `_java_sql_timestamp_` (2018-05-30 09:39:52.000681). | `iso8601` |
+| `total_file_size`  | Specify file size in S3. Minimum size is `1M`. With `use_put_object On` the maximum size is `1G`. With multipart uploads, the maximum size is `50G`. | `100M` |
+| `upload_chunk_size` | The size of each part for multipart uploads. Max: 50M | 5,242,880 bytes  |
+| `upload_timeout`   | When this amount of time elapses, Fluent Bit uploads and creates a new file in S3. Set to `60m` to upload a new file every hour. | `10m`|
+| `store_dir`        | Directory to locally buffer data before sending. When  using multipart uploads, data buffers until reaching the `upload_chunk_size`. S3 stores metadata about in progress multipart uploads in this directory, allowing pending uploads to be completed if Fluent Bit stops and restarts. It stores the current `$INDEX` value if enabled in the S3 key format so the `$INDEX` keeps incrementing from its previous value after Fluent Bit restarts. | `/tmp/fluent-bit/s3` |
+| `store_dir_limit_size` | Size limit for disk usage in S3. Limit theS3 buffers in the `store_dir` to limit disk usage. Use `store_dir_limit_size` instead of `storage.total_limit_size` which can be used for other plugins | `0` (unlimited) |
+| `s3_key_format`   | Format string for keys in S3. This option supports a UUID, strftime time formatters, a syntax for selecting parts of the Fluent log tag using a syntax inspired by the `rewrite_tag` filter. Add `$UUID` in the format string to insert a random string. Add `$INDEX` in the format string to insert an integer that increments each upload. The `$INDEX` value saves in the `store_dir`. Add `$TAG` in the format string to insert the full log tag. Add `$TAG[0]` to insert the first part of the tag in theS3 key. The tag is split into parts using the characters specified with the `s3_key_format_tag_delimiters` option. Add the extension directly after the last piece of the format string to insert a key suffix. To specify a key suffix in `use_put_object` mode, you must specify `$UUID`. See [S3 Key Format](#s3-key-format-and-tag-delimiters). Time in `s3_key` is the timestamp of the first record in the S3 file. | `/fluent-bit-logs/$TAG/%Y/%m/%d/%H/%M/%S` |
+| `s3_key_format_tag_delimiters` | A series of characters used to split the tag into parts for use with `s3_key_format`. option. | `.` |
+| `static_file_path` | Disables behavior where UUID string appends to the end of the S3 key name when `$UUID` isn't provided in `s3_key_format`. `$UUID`, time formatters, `$TAG`, and other dynamic key formatters all work as expected while this feature is set to true. | `false` |
+| `use_put_object`   | Use the S3 `PutObject` API instead of the multipart upload API. When enabled, the key extension is only available when `$UUID` is specified in `s3_key_format`. If `$UUID` isn't included, a random string appends format string and the key extension can't be customized. | `false` |
+| `role_arn` | ARN of an IAM role to assume (for example, for cross account access.) | _none_ |
+| `endpoint`  | Custom endpoint for the S3 API. Endpoints can contain scheme and port. | _none_ |
+| `sts_endpoint` | Custom endpoint for the STS API. | _none_ |
+| `profile`   | Option to specify an AWS Profile for credentials.   | `default` |
+| `canned_acl` | [Predefined Canned ACL policy](https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl) for S3 objects. | _none_ |
+| `compression` | Compression type for S3 objects. `gzip` is currently the only supported value by default. If Apache Arrow support was enabled at compile time, you can use `arrow`. For gzip compression, the Content-Encoding HTTP Header will be set to `gzip`. Gzip compression can be enabled when `use_put_object` is `on` or `off` (`PutObject` and Multipart). Arrow compression can only be enabled with `use_put_object On`. | _none_ |
+| `content_type` | A standard MIME type for the S3 object, set as the Content-Type HTTP header. | _none_ |
+| `send_content_md5` | Send the Content-MD5 header with `PutObject` and UploadPart requests, as is required when Object Lock is enabled. | `false` |
+| `auto_retry_requests` | Immediately retry failed requests to AWS services once. This option doesn't affect the normal Fluent Bit retry mechanism with backoff. Instead, it enables an immediate retry with no delay for networking errors, which can help improve throughput during transient network issues. | `true` |
+| `log_key` | By default, the whole log record will be sent to S3. When specifying a key name with this option, only the value of that key sends to S3. For example, when using Docker you can specify `log_key log` and only the log message sends to S3. | _none_ |
+| `preserve_data_ordering` | When an upload request fails, the last received chunk might swap with a later chunk, resulting in data shuffling. This feature prevents shuffling by using a queue logic for uploads. | `true` |
+| `storage_class` | Specify the [storage class](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html#AmazonS3-PutObject-request-header-StorageClass) for S3 objects. If this option isn't specified, objects store with the default `STANDARD` storage class. | _none_ |
+| `retry_limit` | Integer value to set the maximum number of retries allowed. Requires versions 1.9.10 and 2.0.1 or later. For previous version, the number of retries is `5` and isn't configurable. | `1` |
+| `external_id` | Specify an external ID for the STS API. Can be used with the `role_arn` parameter if your role requires an external ID. | _none_ |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `1` |
 
 ## TLS / SSL
 
-To skip TLS verification, set `tls.verify` as `false`. For more details about the properties available and general configuration, please refer to the [TLS/SSL](../../administration/transport-security.md) section.
+To skip TLS verification, set `tls.verify` as `false`. For more details about the properties available and general configuration, refer to [TLS/SSL](../../administration/transport-security.md).
 
 ## Permissions
 
 The plugin requires the following AWS IAM permissions:
 
-```
+```json
 {
-	"Version": "2012-10-17",
-	"Statement": [{
-		"Effect": "Allow",
-		"Action": [
-			"s3:PutObject"
-		],
-		"Resource": "*"
-	}]
+  "Version": "2012-10-17",
+  "Statement": [{
+    "Effect": "Allow",
+    "Action": [
+      "s3:PutObject"
+    ],
+    "Resource": "*"
+  }]
 }
 ```
 
 ## Differences between S3 and other Fluent Bit outputs
 
-The s3 output plugin is special because its use case is to upload files of non-trivial size to an Amazon S3 bucket. This is in contrast to most other outputs which send many requests to upload data in batches of a few Megabytes or less.
+The S3 output plugin is used to upload large files to an Amazon S3 bucket, while most other outputs which send many requests to upload data in batches of a few megabytes or less.
+
+When Fluent Bit receives logs, it stores them in chunks, either in memory or the filesystem depending on your settings. Chunks are usually around 2&nbsp;MB in size. Fluent Bit sends chunks, in order, to each output that matches their tag. Most outputs then send the chunk immediately to their destination. A chunk is sent to the output's `flush` callback function, which must return one of `FLB_OK`, `FLB_RETRY`, or `FLB_ERROR`. Fluent Bit keeps count of the return values from each output's `flush` callback function. These counters are the data source for Fluent Bit error, retry, and success metrics available in Prometheus format through its monitoring interface.
+
+The S3 output plugin conforms to the Fluent Bit output plugin specification. Because S3's use case is to upload large files (over 2&nbsp;MB), its behavior is different. S3's `flush` callback function buffers the incoming chunk to the filesystem, and returns an `FLB_OK`. This means Prometheus metrics available from the Fluent Bit HTTP server are meaningless for S3. In addition, the `storage.total_limit_size` parameter isn't meaningful for S3 since it has its own buffering system in the `store_dir`. Instead, use `store_dir_limit_size`. S3 requires a writeable filesystem. Running Fluent Bit on a read-only filesystem won't work with the S3 output.
+
+S3 uploads primarily initiate using the S3 [`timer`](https://docs.aws.amazon.com/iotevents/latest/apireference/API_iotevents-data_Timer.html) callback function, which runs separately from its `flush`.
 
-When Fluent Bit recieves logs, it stores them in chunks, either in memory or the filesystem depending on your settings. A chunk is usually around 2 MB in size. Fluent Bit sends the chunks in order to each output that matches their tag. Most outputs then send the chunk immediately to their destination. A chunk is sent to the output's "flush callback function", which must return one of `FLB_OK`, `FLB_RETRY`, or `FLB_ERROR`. Fluent Bit keeps count of the return values from each outputs "flush callback function"; these counters are the data source for Fluent Bit's error, retry, and success metrics available in prometheus format via its monitoring interface.
+S3 has its own buffering system and its own callback to upload data, so the normal sequential data ordering of chunks provided by the Fluent Bit engine can be compromised. S3 has the `presevere_data_ordering` option which ensures data is uploaded in the original order it was collected by Fluent Bit.
 
-The S3 output plugin is a Fluent Bit output plugin and thus it conforms to the Fluent Bit output plugin specification. However, since the S3 use case is to upload large files, generally much larger than 2 MB, its behavior is different. The S3 "flush callback function" simply buffers the incoming chunk to the filesystem, and returns an `FLB_OK`. _Consequently, the prometheus metrics available via the Fluent Bit http server are meaningless for S3._ In addition, the `storage.total_limit_size` parameter is not meaningful for S3 since it has its own buffering system in the `store_dir`. Instead, use `store_dir_limit_size`. Finally, *S3 always requires a write-able filesystem*; running Fluent Bit on a read-only filesystem will not work with the S3 output.
+### Summary: uniqueness in the Amazon S3 plugin
 
-S3 uploads are primarily initiated via the S3 "timer callback function", which runs separately from its "flush callback function". Because S3 has its own system of buffering and its own callback to upload data, the normal sequential data ordering of chunks provided by the Fluent Bit engine may be compromised. Consequently, S3 has the `presevere_data_ordering` option which will ensure data is uploaded in the original order it was collected by Fluent Bit.
+- The HTTP Monitoring interface output metrics aren't meaningful for S3. AWS understands that this is non-ideal. See the [open issue and design](https://github.com/fluent/fluent-bit/issues/6141) to allow S3 to manage its own output metrics.
+- You must use `store_dir_limit_size` to limit the space on disk used by S3 buffer files.
+- The original ordering of data inputted to Fluent Bit might not be preserved unless you enable `preserve_data_ordering On`.
 
-### Summary: Uniqueness in S3 Plugin
+## S3 key format and tag delimiters
 
-1. _The HTTP Monitoring interface output metrics are not meaningful for S3_: AWS understands that this is non-ideal; we have [opened an issue with a design](https://github.com/fluent/fluent-bit/issues/6141) that will allow S3 to manage its own output metrics.
-2. _You must use `store_dir_limit_size` to limit the space on disk used by S3 buffer files_.
-3. _The original ordering of data inputted to Fluent Bit may not be preserved unless you enable `preserve_data_ordering On`_.
+In Fluent Bit, all logs have an associated tag. The `s3_key_format` option lets you inject the tag into the S3 key using the following syntax:
 
-## S3 Key Format and Tag Delimiters
+- `$TAG`: The full tag.
+- `$TAG[n]`: The nth part of the tag (index starting at zero). This syntax is copied from the rewrite tag filter. By default, tag parts are separated with dots, but you can change this with `s3_key_format_tag_delimiters`.
 
-In Fluent Bit, all logs have an associated tag. The `s3_key_format` option lets you inject the tag into the s3 key using the following syntax:
+In the following example, assume the date is `January 1st, 2020 00:00:00` and the tag associated with the logs in question is `my_app_name-logs.prod`:
 
-* `$TAG` => the full tag
-* `$TAG[n]` => the nth part of the tag (index starting at zero). This syntax is copied from the rewrite tag filter. By default, “parts” of the tag are separated with dots, but you can change this with `s3_key_format_tag_delimiters`.
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-In the example below, assume the date is January 1st, 2020 00:00:00 and the tag associated with the logs in question is `my_app_name-logs.prod`.
+```yaml
+pipeline:
 
+  outputs:
+    - name: s3
+      match: '*'
+      bucket: my-bucket
+      region: us-west-2
+      total_file_size: 250M
+      s3_key_format: '/$TAG[2]/$TAG[0]/%Y/%m/%d/%H/%M/%S/$UUID.gz'
+      s3_key_format_tag_delimiters: '.-'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-    Name                         s3
-    Match                        *
-    bucket                       my-bucket
-    region                       us-west-2
-    total_file_size              250M
-    s3_key_format                /$TAG[2]/$TAG[0]/%Y/%m/%d/%H/%M/%S/$UUID.gz
-    s3_key_format_tag_delimiters .-
+  Name                         s3
+  Match                        *
+  bucket                       my-bucket
+  region                       us-west-2
+  total_file_size              250M
+  s3_key_format                /$TAG[2]/$TAG[0]/%Y/%m/%d/%H/%M/%S/$UUID.gz
+  s3_key_format_tag_delimiters .-
 ```
 
-With the delimiters as . and -, the tag will be split into parts as follows:
+{% endtab %}
+{% endtabs %}
 
-* `$TAG[0]` = my\_app\_name
-* `$TAG[1]` = logs
-* `$TAG[2]` = prod
+With the delimiters as `.` and `-`, the tag splits into parts as follows:
 
-So the key in S3 will be `/prod/my_app_name/2020/01/01/00/00/00/bgdHN1NM.gz`.
+- `$TAG[0]` = `my_app_name`
+- `$TAG[1]` = `logs`
+- `$TAG[2]` = `prod`
 
-### Allowing a file extension in the S3 Key Format with $UUID
+The key in S3 will be `/prod/my_app_name/2020/01/01/00/00/00/bgdHN1NM.gz`.
 
-The Fluent Bit S3 output was designed to ensure that previous uploads will never be over-written by a subsequent upload. Consequently, the `s3_key_format` supports time formatters, `$UUID`, and `$INDEX`. `$INDEX` is special because it is saved in the `store_dir`; if you restart Fluent Bit with the same disk, then it can continue incrementing the index from its last value in the previous run.
+### Allowing a file extension in the Amazon S3 key format with `$UUID`
 
-For files uploaded with the PutObject API, the S3 output requires that a unique random string be present in the S3 key. This is because many of the use cases for PutObject uploads involve a short time period between uploads such that a timestamp in the S3 key may not be unique enough between uploads. For example, if you only specify minute granularity timestamps in the S3 key, with a small upload size, it is possible to have two uploads that have timestamps set in the same minute. This "requirement" can be disabled with `static_file_path On`.
+The Fluent Bit S3 output was designed to ensure that previous uploads will never be overwritten by a subsequent upload. The `s3_key_format` supports time formatters, `$UUID`, and `$INDEX`. `$INDEX` is special because it's saved in the `store_dir`. If you restart Fluent Bit with the same disk, it can continue incrementing the index from its last value in the previous run.
 
-There are three cases where the PutObject API is used:
+For files uploaded with the `PutObject` API, the S3 output requires that a unique random string be present in the S3 key. Many of the use cases for `PutObject` uploads involve a short time period between uploads, so a timestamp in the S3 key might not be unique enough between uploads. For example, if you only specify minute granularity timestamps in the S3 key, with a small upload size, it's possible to have two uploads that have timestamps set in the same minute. This requirement can be disabled with `static_file_path On`.
 
-1. When you explicitly set `use_put_object On`
-2. On startup when the S3 output finds old buffer files in the `store_dir` from a previous run and attempts to send all of them at once.
-3. On shutdown, when to prevent data loss the S3 output attempts to send all currently buffered data at once.
+The `PutObject` API is used in these cases:
 
-Consequently, you should always specify `$UUID` somewhere in your S3 key format. Otherwise, if the PutObject API is used, S3 will append a random 8 character UUID to the end of your S3 key. This means that a file extension set at the end of an S3 key will have the random UUID appended to it. This behavior can be disabled with `static_file_path On`.
+- When you explicitly set `use_put_object On`.
+- On startup when the S3 output finds old buffer files in the `store_dir` from a previous run and attempts to send all of them at once.
+- On shutdown. To prevent data loss the S3 output attempts to send all currently buffered data at once.
 
-Let's walk through this via an example. First case, we attempt to set a `.gz` extension without specifying `$UUID`.
+You should always specify `$UUID` somewhere in your S3 key format. Otherwise, if the `PutObject` API is used, S3 appends a random eight-character UUID to the end of your S3 key. This means that a file extension set at the end of an S3 key will have the random UUID appended to it. Disable this with `static_file_path On`.
 
-```
-[OUTPUT]
-    Name                         s3
-    Match                        *
-    bucket                       my-bucket
-    region                       us-west-2
-    total_file_size              50M
-    use_put_object               Off
-    compression                  gzip
-    s3_key_format                /$TAG/%Y/%m/%d/%H_%M_%S.gz
-```
+This example attempts to set a `.gz` extension without specifying `$UUID`:
 
-In the case where pending data is uploaded on shutdown, if the tag was `app`, the S3 key in the S3 bucket might be:
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-```
-/app/2022/12/25/00_00_00.gz-apwgylqg
-```
+```yaml
+pipeline:
 
-The S3 output appended a random string to the "extension", since this upload on shutdown used the PutObject API.
+  outputs:
+    - name: s3
+      match: '*'
+      bucket: my-bucket
+      region: us-west-2
+      total_file_size: 50M
+      use_put_object: off
+      compression: gzip
+      s3_key_format: '/$TAG/%Y/%m/%d/%H_%M_%S.gz'
+```
 
-There are two ways of disabling this behavior. Option 1, use `static_file_path`:
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-```
+```text
 [OUTPUT]
-    Name                         s3
-    Match                        *
-    bucket                       my-bucket
-    region                       us-west-2
-    total_file_size              50M
-    use_put_object               Off
-    compression                  gzip
-    s3_key_format                /$TAG/%Y/%m/%d/%H_%M_%S.gz
-    static_file_path             On
+  Name              s3
+  Match             *
+  bucket            my-bucket
+  region            us-west-2
+  total_file_size   50M
+  use_put_object    Off
+  compression       gzip
+  s3_key_format     /$TAG/%Y/%m/%d/%H_%M_%S.gz
 ```
 
-Option 2, explicitly define where the random UUID will go in the S3 key format:
+{% endtab %}
+{% endtabs %}
 
-```
-[OUTPUT]
-    Name                         s3
-    Match                        *
-    bucket                       my-bucket
-    region                       us-west-2
-    total_file_size              50M
-    use_put_object               Off
-    compression                  gzip
-    s3_key_format                /$TAG/%Y/%m/%d/%H_%M_%S/$UUID.gz
+In the case where pending data is uploaded on shutdown, if the tag was `app`, the S3 key in the S3 bucket might be:
+
+```text
+/app/2022/12/25/00_00_00.gz-apwgylqg
 ```
 
+The S3 output appended a random string to the file extension, since this upload on shutdown used the `PutObject` API.
+
+To disable this behavior, use one of the following methods:
+
+- Use `static_file_path`:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+  ```yaml
+  pipeline:
+
+    outputs:
+      - name: s3
+        match: '*'
+        bucket: my-bucket
+        region: us-west-2
+        total_file_size: 50M
+        use_put_object: off
+        compression: gzip
+        s3_key_format: '/$TAG/%Y/%m/%d/%H_%M_%S.gz'
+        static_file_path: on
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+  ```text
+  [OUTPUT]
+    Name               s3
+    Match              *
+    bucket             my-bucket
+    region             us-west-2
+    total_file_size    50M
+    use_put_object     Off
+    compression        gzip
+    s3_key_format      /$TAG/%Y/%m/%d/%H_%M_%S.gz
+    static_file_path   On
+  ```
+
+{% endtab %}
+{% endtabs %}
+
+- Explicitly define where the random UUID will go in the S3 key format:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+  ```yaml
+  pipeline:
+
+    outputs:
+      - name: s3
+        match: '*'
+        bucket: my-bucket
+        region: us-west-2
+        total_file_size: 50M
+        use_put_object: off
+        compression: gzip
+        s3_key_format: '/$TAG/%Y/%m/%d/%H_%M_%S/$UUID.gz'
+  ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+  ```text
+  [OUTPUT]
+    Name                 s3
+    Match                *
+    bucket               my-bucket
+    region               us-west-2
+    total_file_size      50M
+    use_put_object       Off
+    compression          gzip
+    s3_key_format        /$TAG/%Y/%m/%d/%H_%M_%S/$UUID.gz
+  ```
+
+{% endtab %}
+{% endtabs %}
+
 ## Reliability
 
-The `store_dir` is used to temporarily store data before it is uploaded. If Fluent Bit is stopped suddenly it will try to send all data and complete all uploads before it shuts down. If it can not send some data, on restart it will look in the `store_dir` for existing data and will try to send it.
+The `store_dir` is used to temporarily store data before upload. If Fluent Bit stops suddenly, it will try to send all data and complete all uploads before it shuts down. If it can not send some data, on restart it will look in the `store_dir` for existing data and try to send it.
 
-Multipart uploads are ideal for most use cases because they allow the plugin to upload data in small chunks over time. For example, 1 GB file can be created from 200 5MB chunks. While the file size in S3 will be 1 GB, only 5 MB will be buffered on disk at any one point in time.
+Multipart uploads are ideal for most use cases because they allow the plugin to upload data in small chunks over time. For example, 1&nbsp;GB file can be created from 200 5&nbsp;MB chunks. Although the file size in S3 will be 1&nbsp;GB, only 5&nbsp;MB will be buffered on disk at any one point in time.
 
-There is one minor drawback to multipart uploads- the file and data will not be visible in S3 until the upload is completed with a [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API\_CompleteMultipartUpload.html) call. The plugin will attempt to make this call whenever Fluent Bit is shut down to ensure your data is available in s3. It will also store metadata about each upload in the `store_dir`, ensuring that uploads can be completed when Fluent Bit restarts (assuming it has access to persistent disk and the `store_dir` files will still be present on restart).
+One drawback to multipart uploads is that the file and data aren't visible in S3 until the upload is completed with a [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) call. The plugin attempts to make this call whenever Fluent Bit is shut down to ensure your data is available in S3. It also stores metadata about each upload in the `store_dir`, ensuring that uploads can be completed when Fluent Bit restarts (assuming it has access to persistent disk and the `store_dir` files will still be present on restart).
 
 ### Using S3 without persisted disk
 
-If you run Fluent Bit in an environment without persistent disk, or without the ability to restart Fluent Bit and give it access to the data stored in the `store_dir` from previous executions- some considerations apply. This might occur if you run Fluent Bit on [AWS Fargate](https://aws.amazon.com/fargate/).
+If you run Fluent Bit in an environment without persistent disk, or without the ability to restart Fluent Bit and give it access to the data stored in the `store_dir` from previous executions, some considerations apply. This might occur if you run Fluent Bit on [AWS Fargate](https://aws.amazon.com/fargate/).
+
+In these situations, Fluent Bits recommend using the `PutObject` API and sending data frequently, to avoid local buffering as much as possible. This will limit data loss in the event Fluent Bit is killed unexpectedly. The following settings are recommended for this use case:
 
-In these situations, we recommend using the PutObject API, and sending data frequently, to avoid local buffering as much as possible. This will limit data loss in the event Fluent Bit is killed unexpectedly.
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-The following settings are recommended for this use case:
+```yaml
+pipeline:
 
+  outputs:
+    - name: s3
+      match: '*'
+      bucket: your-bucket
+      region: us-east-1
+      total_file_size: 1M
+      upload_timeout: 1m
+      use_put_object: on
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-     Name s3
-     Match *
-     bucket your-bucket
-     region us-east-1
-     total_file_size 1M
-     upload_timeout 1m
-     use_put_object On
+  Name               s3
+  Match              *
+  bucket             your-bucket
+  region             us-east-1
+  total_file_size    1M
+  upload_timeout     1m
+  use_put_object     On
 ```
 
-## S3 Multipart Uploads
+{% endtab %}
+{% endtabs %}
 
-With `use_put_object Off` (default), S3 will attempt to send files using multipart uploads. For each file, S3 first calls [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html), then a series of calls to [UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html) for each fragment (targeted to be `upload_chunk_size` bytes), and finally [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) to create the final file in S3. 
+## S3 multipart uploads
 
-### Fallback to PutObject
+With `use_put_object Off` (default), S3 will attempt to send files using multipart uploads. For each file, S3 first calls [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html), then a series of calls to [UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html) for each fragment (targeted to be `upload_chunk_size` bytes), and finally [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) to create the final file in S3.
 
-S3 [requires](https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html) each [UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html) fragment to be at least 5,242,880 bytes, otherwise the upload is rejected. 
+### Fallback to `PutObject`
 
-Consequently, the S3 output must sometimes fallback to the [PutObject API](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html). 
+S3 [requires](https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html) each [UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html) fragment to be at least 5,242,880 bytes, otherwise the upload is rejected.
 
-Uploads are triggered by three settings:
-1. `total_file_size` and `upload_chunk_size`: When S3 has buffered data in the `store_dir` that meets the desired `total_file_size` (for `use_put_object On`) or the `upload_chunk_size` (for Multipart), it will trigger an upload operation. 
-2. `upload_timeout`: Whenever locally buffered data has been present on the filesystem in the `store_dir` longer than the configured `upload_timeout`, it will be sent. This happens regardless of whether or not the desired byte size has been reached. Consequently, if you configure a small `upload_timeout`, your files may be smaller than the `total_file_size`. The timeout is evaluated against the time at which S3 started buffering data for each unqiue tag (that is, the time when new data was buffered for the unique tag after the last upload). The timeout is also evaluated against the [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) time, so a multipart upload will be completed after `upload_timeout` has elapsed, even if the desired size has not yet been reached. 
+The S3 output must sometimes fallback to the [`PutObject` API](https://docs.aws.amazon.com/AmazonS3/latest/API/API_`PutObject`.html).
 
-If your `upload_timeout` triggers an upload before the pending buffered data reaches the `upload_chunk_size`, it may be too small for a multipart upload. S3 will consequently fallback to use the [PutObject API](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html).
+Uploads are triggered by these settings:
 
-When you enable compression, S3 applies the compression algorithm at send time. The size settings noted above trigger uploads based on the size of buffered data, not the final compressed size. Consequently, it is possible that after compression, buffered data no longer meets the required minimum S3 [UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html) size. If this occurs, you will see a log message like:
+- `total_file_size` and `upload_chunk_size`: When S3 has buffered data in the `store_dir` that meets the desired `total_file_size` (for `use_put_object On`) or the `upload_chunk_size` (for Multipart), it will trigger an upload operation.
+- `upload_timeout`: Whenever locally buffered data has been present on the filesystem in the `store_dir` longer than the configured `upload_timeout`, it will be sent even when the desired byte size hasn't been reached. If you configure a small `upload_timeout`, your files can be smaller than the `total_file_size`. The timeout is evaluated against the time at which S3 started buffering data for each unique tag (the time when new data was buffered for the unique tag after the last upload). The timeout is also evaluated against the [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) time, so a multipart upload will be completed after `upload_timeout` has elapsed, even if the desired size hasn't yet been reached.
 
+If your `upload_timeout` triggers an upload before the pending buffered data reaches the `upload_chunk_size`, it might be too small for a multipart upload. S3 will fallback to use the [`PutObject` API](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html).
 
-```
+When you enable compression, S3 applies the compression algorithm at send time. The size settings trigger uploads based on the size of buffered data, not the final compressed size. It's possible that after compression, buffered data no longer meets the required minimum S3 [UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html) size. If this occurs, you will see a log message like:
+
+```text
 [ info] [output:s3:s3.0] Pre-compression upload_chunk_size= 5630650, After compression, chunk is only 1063320 bytes, the chunk was too small, using PutObject to upload
 ```
 
-If you encounter this frequently, use the numbers in the messages to guess your compression factor. For example, in this case, the buffered data was reduced from 5,630,650 bytes to 1,063,320 bytes. The compressed size is 1/5 the actual data size, so configuring `upload_chunk_size 30M` should ensure each part is large enough after compression to be over the min required part size of 5,242,880 bytes.
+If you encounter this frequently, use the numbers in the messages to guess your compression factor. In this example, the buffered data was reduced from 5,630,650 bytes to 1,063,320 bytes. The compressed size is one-fifth the actual data size. Configuring `upload_chunk_size 30M` should ensure each part is large enough after compression to be over the minimum required part size of 5,242,880 bytes.
 
-The S3 API allows the last part in an upload to be less than the 5,242,880 byte minimum. Therefore, if a part is too small for an existing upload, the S3 output will upload that part and then complete the upload. 
+The S3 API allows the last part in an upload to be less than the 5,242,880 byte minimum. If a part is too small for an existing upload, the S3 output will upload that part and then complete the upload.
 
-### upload_timeout constrains total multipart upload time for a single file
+### `upload_timeout` constrains total multipart upload time for a single file
 
-The `upload_timeout` is evaluated against the [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) time. So a multipart upload will be completed after `upload_timeout` has elapsed, even if the desired size has not yet been reached. 
+The `upload_timeout` evaluated against the [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) time. A multipart upload will be completed after `upload_timeout` elapses, even if the desired size hasn't yet been reached.
 
 ### Completing uploads
 
-When [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) is called, an `UploadID` is returned. S3 stores these IDs for active uploads in the `store_dir`. Until [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) is called, the uploaded data will not be visible in S3. 
+When [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) is called, an `UploadID` is returned. S3 stores these IDs for active uploads in the `store_dir`. Until [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) is called, the uploaded data isn't visible in S3.
 
-On shutdown, S3 output will attempt to complete all pending uploads. If it fails to complete an upload, the ID will remain buffered in the `store_dir` in a directory called `multipart_upload_metadata`. If you restart the S3 output with the same `store_dir` it will discover the old UploadIDs and complete the pending uploads. The [S3 documentation](https://aws.amazon.com/blogs/aws-cloud-financial-management/discovering-and-deleting-incomplete-multipart-uploads-to-lower-amazon-s3-costs/) also has suggestions on discovering and deleting/completing dangling uploads in your buckets.  
+On shutdown, S3 output attempts to complete all pending uploads. If an upload fails to complete, the ID remains buffered in the `store_dir` in a directory called `multipart_upload_metadata`. If you restart the S3 output with the same `store_dir` it will discover the old UploadIDs and complete the pending uploads. The [S3 documentation](https://aws.amazon.com/blogs/aws-cloud-financial-management/discovering-and-deleting-incomplete-multipart-uploads-to-lower-amazon-s3-costs/) has suggestions on discovering and deleting or completing dangling uploads in your buckets.
+
+## Usage with MinIO
 
-## Worker support
+[MinIO](https://min.io/) is a high-performance, S3 compatible object storage and you can build your app with S3 capability without S3.
 
-Fluent Bit 1.7 adds a new feature called `workers` which enables outputs to have dedicated threads. This `s3` plugin has partial support for workers. **The plugin can only support a single worker; enabling multiple workers will lead to errors/indeterminate behavior.**
+The following example runs a MinIO server at `localhost:9000`, and creates a bucket of `your-bucket`.
 
 Example:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: s3
+      match: '*'
+      bucket: your-bucket
+      endpoint: http://localhost:9000
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-     Name s3
-     Match *
-     bucket your-bucket
-     region us-east-1
-     total_file_size 1M
-     upload_timeout 1m
-     use_put_object On
-     workers 1
+  Name     s3
+  Match    *
+  bucket   your-bucket
+  endpoint http://localhost:9000
 ```
 
-If you enable a single worker, you are enabling a dedicated thread for your S3 output. We recommend starting without workers, evaluating the performance, and then enabling a worker if needed. For most users, the plugin can provide sufficient throughput without workers.
+{% endtab %}
+{% endtabs %}
 
-## Usage with MinIO
+The records store in the MinIO server.
 
-[MinIO](https://min.io/) is a high-performance, S3 compatible object storage and you can build your app with S3 functionality without S3.
+## Usage with Google Cloud
 
-Assume you run [a MinIO server](https://docs.min.io/docs/minio-quickstart-guide.html) at localhost:9000, and create a bucket of `your-bucket` by referring [the client docs](https://docs.min.io/docs/minio-client-quickstart-guide).
+You can send your S3 output to Google. You must generate HMAC keys on GCS and use those keys for `access-key` and `access-secret`.
 
 Example:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: s3
+      match: '*'
+      bucket: your-bucket
+      endpoint: https://storage.googleapis.com
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-     Name s3
-     Match *
-     bucket your-bucket
-     endpoint http://localhost:9000
+  Name     s3
+  Match    *
+  bucket   your-bucket
+  endpoint https://storage.googleapis.com
 ```
 
-Then, the records will be stored into the MinIO server.
+{% endtab %}
+{% endtabs %}
 
-## Getting Started
+## Get started
 
-In order to send records into Amazon S3, you can run the plugin from the command line or through the configuration file.
+To send records into Amazon S3, run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-The **s3** plugin, can read the parameters from the command line through the **-p** argument (property), e.g:
+The S3 plugin reads parameters from the command line through the `-p` argument:
 
+```shell
+fluent-bit -i cpu -o s3 -p bucket=my-bucket -p region=us-west-2 -p -m '*' -f 1
 ```
-$ fluent-bit -i cpu -o s3 -p bucket=my-bucket -p region=us-west-2 -p -m '*' -f 1
-```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file append the following section:
 
-In your main configuration file append the following _Output_ section:
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
+```yaml
+pipeline:
+
+  outputs:
+    - name: s3
+      match: '*'
+      bucket: your-bucket
+      region: us-east-1
+      store_dir: /home/ec2-user/buffer
+      total_file_size: 50M
+      upload_timeout: 10m
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-     Name s3
-     Match *
-     bucket your-bucket
-     region us-east-1
-     store_dir /home/ec2-user/buffer
-     total_file_size 50M
-     upload_timeout 10m
+  Name            s3
+  Match           *
+  bucket          your-bucket
+  region          us-east-1
+  store_dir       /home/ec2-user/buffer
+  total_file_size 50M
+  upload_timeout  10m
 ```
 
-An example that using PutObject instead of multipart:
+{% endtab %}
+{% endtabs %}
+
+An example using `PutObject` instead of multipart:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: s3
+      match: '*'
+      bucket: your-bucket
+      region: us-east-1
+      store_dir: /home/ec2-user/buffer
+      use_put_object: on
+      total_file_size: 10M
+      upload_timeout: 10m
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-     Name s3
-     Match *
-     bucket your-bucket
-     region us-east-1
-     store_dir /home/ec2-user/buffer
-     use_put_object On
-     total_file_size 10M
-     upload_timeout 10m
+  Name            s3
+  Match           *
+  bucket          your-bucket
+  region          us-east-1
+  store_dir       /home/ec2-user/buffer
+  use_put_object  On
+  total_file_size 10M
+  upload_timeout  10m
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ## AWS for Fluent Bit
 
-Amazon distributes a container image with Fluent Bit and this plugins.
+Amazon distributes a container image with Fluent Bit and plugins.
 
 ### GitHub
 
@@ -333,59 +532,87 @@ Amazon distributes a container image with Fluent Bit and this plugins.
 
 ### Amazon ECR Public Gallery
 
-[aws-for-fluent-bit](https://gallery.ecr.aws/aws-observability/aws-for-fluent-bit)
+Images are available in the Amazon ECR Public Gallery as
+[aws-for-fluent-bit](https://gallery.ecr.aws/aws-observability/aws-for-fluent-bit).
 
-Our images are available in Amazon ECR Public Gallery. You can download images with different tags by following command:
+You can download images with different tags using the following command:
 
-```
+```shell
 docker pull public.ecr.aws/aws-observability/aws-for-fluent-bit:<tag>
 ```
 
-For example, you can pull the image with latest version by:
+For example, you can pull the image with latest version with:
 
-```
+```shell
 docker pull public.ecr.aws/aws-observability/aws-for-fluent-bit:latest
 ```
 
-If you see errors for image pull limits, try log into public ECR with your AWS credentials:
+If you see errors for image pull limits, try signing in to public ECR with your
+AWS credentials:
 
-```
+```shell
 aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
 ```
 
-You can check the [Amazon ECR Public official doc](https://docs.aws.amazon.com/AmazonECR/latest/public/get-set-up-for-amazon-ecr.html) for more details.
+See the
+[Amazon ECR Public official documentation](https://docs.aws.amazon.com/AmazonECR/latest/public/get-set-up-for-amazon-ecr.html)
+for more details.
 
 ### Docker Hub
 
 [amazon/aws-for-fluent-bit](https://hub.docker.com/r/amazon/aws-for-fluent-bit/tags)
+is also available from the Docker Hub.
 
 ### Amazon ECR
 
-You can use our SSM Public Parameters to find the Amazon ECR image URI in your region:
+Use Fluent Bit SSM Public Parameters to find the Amazon ECR image URI in your region:
 
-```
+```shell
 aws ssm get-parameters-by-path --path /aws/service/aws-for-fluent-bit/
 ```
 
-For more see [the AWS for Fluent Bit github repo](https://github.com/aws/aws-for-fluent-bit#public-images).
+For more information, see the
+[AWS for Fluent Bit GitHub repository](https://github.com/aws/aws-for-fluent-bit#public-images).
 
 ## Advanced usage
 
 ### Use Apache Arrow for in-memory data processing
 
-Starting from Fluent Bit v1.8, the Amazon S3 plugin includes the support for [Apache Arrow](https://arrow.apache.org/). The support is currently not enabled by default, as it depends on a shared version of `libarrow` as the prerequisite.
+With Fluent Bit v1.8 or later, the Amazon S3 plugin includes the support for [Apache Arrow](https://arrow.apache.org/). Support isn't enabled by default, and has a dependency on a shared version of `libarrow`.
 
-To use this feature, `FLB_ARROW` must be turned on at compile time:
+To use this feature, `FLB_ARROW` must be turned on at compile time. Use the following commands:
 
+```shell
+cd build/
+cmake -DFLB_ARROW=On ..
+cmake --build .
 ```
-$ cd build/
-$ cmake -DFLB_ARROW=On ..
-$ cmake --build .
-```
 
-Once compiled, Fluent Bit can upload incoming data to S3 in Apache Arrow format. For example:
+After being compiled, Fluent Bit can upload incoming data to S3 in Apache Arrow format.
+
+For example:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+
+  outputs:
+    - name: s3
+      bucket: your-bucket-name
+      total_file_size: 1M
+      use_put_object: on
+      upload_timeout: 60s
+      compression: arrow
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
   Name cpu
 
@@ -398,11 +625,16 @@ Once compiled, Fluent Bit can upload incoming data to S3 in Apache Arrow format.
   Compression arrow
 ```
 
-As shown in this example, setting `Compression` to `arrow` makes Fluent Bit to convert payload into Apache Arrow format.
+{% endtab %}
+{% endtabs %}
 
-The stored data is very easy to load, analyze and process using popular data processing tools (such as Python pandas, Apache Spark and Tensorflow). The following code uses `pyarrow` to analyze the uploaded data:
+Setting `Compression` to `arrow` makes Fluent Bit convert payload into Apache Arrow format.
 
-```
+Load, analyze, and process stored data using popular data processing tools such as Python pandas, Apache Spark and Tensorflow.
+
+The following example uses `pyarrow` to analyze the uploaded data:
+
+```text
 >>> import pyarrow.feather as feather
 >>> import pyarrow.fs as fs
 >>>
@@ -410,7 +642,7 @@ The stored data is very easy to load, analyze and process using popular data pro
 >>> file = s3.open_input_file("my-bucket/fluent-bit-logs/cpu.0/2021/04/27/09/36/15-object969o67ZF")
 >>> df = feather.read_feather(file)
 >>> print(df.head())
-                          date  cpu_p  user_p  system_p  cpu0.p_cpu  cpu0.p_user  cpu0.p_system
+   date  cpu_p  user_p  system_p  cpu0.p_cpu  cpu0.p_user  cpu0.p_system
 0  2021-04-27T09:33:53.539346Z    1.0     1.0       0.0         1.0          1.0            0.0
 1  2021-04-27T09:33:54.539330Z    0.0     0.0       0.0         0.0          0.0            0.0
 2  2021-04-27T09:33:55.539305Z    1.0     0.0       1.0         1.0          0.0            1.0
diff --git a/pipeline/outputs/skywalking.md b/pipeline/outputs/skywalking.md
index 9919567a5..c87237ae9 100644
--- a/pipeline/outputs/skywalking.md
+++ b/pipeline/outputs/skywalking.md
@@ -1,54 +1,77 @@
 # Apache SkyWalking
 
-The **Apache SkyWalking** output plugin, allows to flush your records to a [Apache SkyWalking](https://skywalking.apache.org/) OAP. The following instructions assumes that you have a fully operational Apache SkyWalking OAP in place.
+The _Apache SkyWalking_ output plugin lets you flush your records to an [Apache SkyWalking](https://skywalking.apache.org/) OAP. The following instructions assume that you have an operational Apache SkyWalking OAP in place.
 
-## Configuration Parameters
+## Configuration parameters
 
-| parameter | description | default |
-| :--- | :--- | :--- |
-| host | Hostname of Apache SkyWalking OAP | 127.0.0.1 |
-| port | TCP port of the Apache SkyWalking OAP | 12800 |
-| auth_token | Authentication token if needed for Apache SkyWalking OAP | None |
-| svc_name | Service name that fluent-bit belongs to | sw-service |
-| svc_inst_name | Service instance name of fluent-bit | fluent-bit |
+This plugin supports the following parameters:
+
+| Parameter | Description | Default    |
+|:--------- |:----------- |:-----------|
+| `host` | Hostname of Apache SkyWalking OAP. |` 127.0.0.1` |
+| `port` | TCP port of the Apache SkyWalking OAP. | `12800` |
+| `auth_token` | Authentication token if needed for Apache SkyWalking OAP. | _none_ |
+| `svc_name` | Service name that Fluent Bit belongs to. | `sw-service` |
+| `svc_inst_name` | Service instance name of Fluent Bit. | `fluent-bit` |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
 ### TLS / SSL
 
-Apache SkyWalking output plugin supports TLS/SSL, for more details about the properties available and general configuration, please refer to the [TLS/SSL](../../administration/transport-security.md) section.
+The Apache SkyWalking output plugin supports TLS/SSL. For more details about the properties available and general configuration, see [TLS/SSL](../../administration/transport-security.md).
+
+## Get started
+
+To start inserting records into an Apache SkyWalking service, you can run the plugin through the configuration file.
 
-## Getting Started
+### Configuration file
 
-In order to start inserting records into an Apache SkyWalking service, you can run the plugin through the configuration file:
+In your main configuration file append the following:
 
-### Configuration File
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+
+  outputs:
+    - name: skywalking
+      svc_name: dummy-service
+      svc_inst_name: dummy-service-fluentbit
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name cpu
+  Name cpu
 
 [OUTPUT]
-    Name skywalking
-    svc_name dummy-service
-    svc_inst_name dummy-service-fluentbit
+  Name          skywalking
+  svc_name      dummy-service
+  svc_inst_name dummy-service-fluentbit
 ```
 
-## Output Format
+{% endtab %}
+{% endtabs %}
+
+## Output format
 
 The format of the plugin output follows the [data collect protocol](https://github.com/apache/skywalking-data-collect-protocol/blob/743f33119dc5621ae98b596eb8b131dd443445c7/logging/Logging.proto).
 
-For example, if we get log as follows,
+For example, if the log is as follows:
 
-```text
+```json
 {
-   "log": "This is the original log message"
+  "log": "This is the original log message"
 }
 ```
 
-This message is packed into the following protocol format and written to the OAP via the REST API.
+This message is packed into the following protocol format and written to the OAP using the REST API.
 
-```text
+```json
 [{
   "timestamp": 123456789,
   "service": "dummy-service",
@@ -57,6 +80,6 @@ This message is packed into the following protocol format and written to the OAP
     "json": {
       "json": "{\"log\": \"This is the original log message\"}"
     }
-  } 
+  }
 }]
 ```
diff --git a/pipeline/outputs/slack.md b/pipeline/outputs/slack.md
index 0ef7d9d9d..cc7903a62 100644
--- a/pipeline/outputs/slack.md
+++ b/pipeline/outputs/slack.md
@@ -2,25 +2,41 @@
 
 The Slack output plugin delivers records or messages to your preferred Slack channel. It formats the outgoing content in JSON format for readability.
 
-This connector uses the Slack _Incoming Webhooks_ feature to post messages to Slack channels. Using this plugin in conjunction with the Stream Processor is a good combination for alerting.
+This connector uses Slack [incoming webhooks](https://docs.slack.dev/messaging/sending-messages-using-incoming-webhooks) to post messages to Slack channels. Using this plugin in conjunction with the Stream Processor is a good combination for alerting.
 
-## Slack Webhook
+## Slack webhook
 
-Before configuring this plugin, make sure to setup your Incoming Webhook. For detailed step-by-step instructions, review the following official documentation:
+Before configuring this plugin, set up your incoming webhook. For help, see the [Slack documentation](https://docs.slack.dev/messaging/sending-messages-using-incoming-webhooks).
 
-* [https://api.slack.com/messaging/webhooks\#getting\_started](https://api.slack.com/messaging/webhooks#getting_started)
+After you have obtained the Webhook address you can place it in the configuration.
 
-Once you have obtained the Webhook address you can place it in the configuration below.
+## Configuration parameters
 
-## Configuration Parameters
+This plugin supports the following parameters:
 
-| Key | Description | Default |
-| :--- | :--- | :--- |
-| webhook | Absolute address of the Webhook provided by Slack |  |
+| Key     | Description | Default |
+|:--------|:------------|:--------|
+| `webhook` | Absolute address of the webhook provided by Slack. | _none_ |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
-### Configuration File
+### Configuration file
 
-Get started quickly with this configuration file:
+Get started with this configuration file:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: slack
+      match: '*'
+      webhook: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [OUTPUT]
@@ -29,3 +45,5 @@ Get started quickly with this configuration file:
     webhook              https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
 ```
 
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/outputs/splunk.md b/pipeline/outputs/splunk.md
index f038909fc..f905392ad 100644
--- a/pipeline/outputs/splunk.md
+++ b/pipeline/outputs/splunk.md
@@ -4,84 +4,142 @@ description: Send logs to Splunk HTTP Event Collector
 
 # Splunk
 
-Splunk output plugin allows to ingest your records into a [Splunk Enterprise](https://www.splunk.com/en_us/products/splunk-enterprise.html) service through the HTTP Event Collector \(HEC\) interface.
-
-To get more details about how to setup the HEC in Splunk please refer to the following documentation: [Splunk / Use the HTTP Event Collector](http://docs.splunk.com/Documentation/Splunk/7.0.3/Data/UsetheHTTPEventCollector)
-
-## Configuration Parameters
-
-Connectivity, transport and authentication configuration properties:
-
-| Key | Description | default |
-| :--- | :--- | :--- |
-| host | IP address or hostname of the target Splunk service. | 127.0.0.1 |
-| port | TCP port of the target Splunk service. | 8088 |
-| splunk\_token | Specify the Authentication Token for the HTTP Event Collector interface. |  |
-| http\_user | Optional username for Basic Authentication on HEC |  |
-| http\_passwd | Password for user defined in HTTP\_User |  |
-| http\_buffer\_size | Buffer size used to receive Splunk HTTP responses | 2M |
-| compress | Set payload compression mechanism. The only available option is `gzip`. |  |
-| channel | Specify X-Splunk-Request-Channel Header for the HTTP Event Collector interface. |  |
-| http_debug_bad_request | If the HTTP server response code is 400 (bad request) and this flag is enabled, it will print the full HTTP request and response to the stdout interface. This feature is available for debugging purposes. | |
-| Workers | Enables dedicated thread(s) for this output. Default value is set since version 1.8.13. For previous versions is 0. | 2 |
-
-Content and Splunk metadata \(fields\) handling configuration properties:
-
-| Key | Description | default |
-| :--- | :--- | :--- |
-| splunk\_send\_raw | When enabled, the record keys and values are set in the top level of the map instead of under the event key. Refer to the _Sending Raw Events_ section from the docs for more details to make this option work properly. | off |
-| event\_key | Specify the key name that will be used to send a single value as part of the record. |  |
-| event\_host | Specify the key name that contains the host value. This option allows a record accessors pattern. |  |
-| event\_source | Set the source value to assign to the event data. |  |
-| event\_sourcetype | Set the sourcetype value to assign to the event data. |  |
-| event\_sourcetype\_key | Set a record key that will populate 'sourcetype'. If the key is found, it will have precedence over the value set in `event_sourcetype`. |  |
-| event\_index | The name of the index by which the event data is to be indexed. |  |
-| event\_index\_key | Set a record key that will populate the `index` field. If the key is found, it will have precedence over the value set in `event_index`. |  |
-| event\_field | Set event fields for the record. This option can be set multiple times and the format is `key_name record_accessor_pattern`. |  |
+The _Splunk_ output plugin lets you ingest your records into a [Splunk Enterprise](https://www.splunk.com/en_us/products/splunk-enterprise.html) service through the HTTP Event Collector (HEC) interface.
+
+To learn how to set up the HEC in Splunk, refer to [Splunk / Use the HTTP Event Collector](http://docs.splunk.com/Documentation/Splunk/7.0.3/Data/UsetheHTTPEventCollector).
+
+## Configuration parameters
+
+Connectivity, transport, and authentication configuration properties:
+
+| Key | Description | Default |
+|:----|:------------|:--------|
+| `host` | IP address or hostname of the target Splunk service. | `127.0.0.1` |
+| `port` | TCP port of the target Splunk service. | `8088` |
+| `splunk_token` | Specify the authentication token for the HTTP Event Collector interface.| _none_ |
+| `http_user` | Optional username for basic authentication on HEC. | _none_ |
+| `http_passwd` | Password for user defined in `http_user`. | _none_ |
+| `http_buffer_size` | Buffer size used to receive Splunk HTTP responses. | `2M` |
+| `compress` | Set payload compression mechanism. Allowed value: `gzip`. | _none_ |
+| `channel` | Specify `X-Splunk-Request-Channel` header for the HTTP Event Collector interface. | _none_ |
+| `http_debug_bad_request` | If the HTTP server response code is `400` (bad request) and this flag is enabled, it will print the full HTTP request and response to the stdout interface. This feature is available for debugging purposes. | _none_ |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `2` |
+
+Content and Splunk metadata (fields) handling configuration properties:
+
+| Key | Description | Default |
+|:--- |:----------- |:------- |
+| `splunk_send_raw` | When enabled, the record keys and values are set in the top level of the map instead of under the event key. See [Sending Raw Events](#sending-raw-events) to configure this option. | `off` |
+| `event_key` | Specify the key name that will be used to send a single value as part of the record. | _none_ |
+| `event_host` | Specify the key name that contains the host value. This option allows a record accessors pattern. | _none_ |
+| `event_source` | Set the source value to assign to the event data. | _none_ |
+| `event_sourcetype` | Set the `sourcetype` value to assign to the event data. | _none_ |
+| `event_sourcetype_key` | Set a record key that will populate `sourcetype`. If the key is found, it will have precedence over the value set in `event_sourcetype`. | _none_ |
+| `event_index` | The name of the index by which the event data is to be indexed. | _none_ |
+| `event_index_key` | Set a record key that will populate the `index` field. If the key is found, it will have precedence over the value set in `event_index`. | _none_ |
+| `event_field` | Set event fields for the record. This option can be set multiple times and the format is `key_name record_accessor_pattern`. | _none_ |
 
 ### TLS / SSL
 
-Splunk output plugin supports TLS/SSL, for more details about the properties available and general configuration, please refer to the [TLS/SSL](../../administration/transport-security.md) section.
+The Splunk output plugin supports TLS/SSL. For more details about the properties available and general configuration, see [TLS/SSL](../../administration/transport-security.md).
 
-## Getting Started
+## Get started
 
-In order to insert records into a Splunk service, you can run the plugin from the command line or through the configuration file:
+To insert records into a Splunk service, you can run the plugin from the command line or through the configuration file.
 
-### Command Line
+### Command line
 
-The **splunk** plugin, can read the parameters from the command line in two ways, through the **-p** argument \(property\), e.g:
+The Splunk plugin can read the parameters from the command line through the `-p` argument (property):
 
-```text
-$ fluent-bit -i cpu -t cpu -o splunk -p host=127.0.0.1 -p port=8088 \
+```shell
+fluent-bit -i cpu -t cpu -o splunk -p host=127.0.0.1 -p port=8088 \
   -p tls=on -p tls.verify=off -m '*'
 ```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file append the following sections:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-In your main configuration file append the following _Input_ & _Output_ sections:
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
+
+  outputs:
+    - name: splunk
+      match: '*'
+      host: 127.0.0.1
+      port: 8088
+      tls: on
+      tls.verify: off
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name  cpu
-    Tag   cpu
+  Name  cpu
+  Tag   cpu
 
 [OUTPUT]
-    Name        splunk
-    Match       *
-    Host        127.0.0.1
-    Port        8088
-    TLS         On
-    TLS.Verify  Off
+  Name        splunk
+  Match       *
+  Host        127.0.0.1
+  Port        8088
+  TLS         On
+  TLS.Verify  Off
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ### Data format
 
 By default, the Splunk output plugin nests the record under the `event` key in the payload sent to the HEC. It will also append the time of the record to a top level `time` key.
 
-If you would like to customize any of the Splunk event metadata, such as the host or target index, you can set `Splunk_Send_Raw On` in the plugin configuration, and add the metadata as keys/values in the record. _Note_: with `Splunk_Send_Raw` enabled, you are responsible for creating and populating the `event` section of the payload.
+To customize any of the Splunk event metadata, such as the host or target index, you can set `Splunk_Send_Raw On` in the plugin configuration, and add the metadata as keys/values in the record. With `Splunk_Send_Raw` enabled, you are responsible for creating and populating the `event` section of the payload.
 
 For example, to add a custom index and hostname:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
+
+  filters:
+    # nest the record under the 'event' key
+    - name: nest
+      match: '*'
+      operation: nest
+      wildcard: '*'
+      nest_under: event
+
+    - name: modify
+      match: '*'
+      add:
+        - index my-splunk-index
+        - host my-host
+
+  outputs:
+    - name: splunk
+      match: '*'
+      host: 127.0.0.1
+      splunk_token: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx'
+      splunk_send_raw: On
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
 ```text
 [INPUT]
     Name  cpu
@@ -110,108 +168,170 @@ For example, to add a custom index and hostname:
     Splunk_Send_Raw On
 ```
 
+{% endtab %}
+{% endtabs %}
+
 This will create a payload that looks like:
 
-```javascript
+```json
 {
-    "time": "1535995058.003385189",
-    "index": "my-splunk-index",
-    "host": "my-host",
-    "event": {
-        "cpu_p":0.000000,
-        "user_p":0.000000,
-        "system_p":0.000000
-    }
+  "time": "1535995058.003385189",
+  "index": "my-splunk-index",
+  "host": "my-host",
+  "event": {
+    "cpu_p":0.000000,
+    "user_p":0.000000,
+    "system_p":0.000000
+  }
 }
 ```
 
-For more information on the Splunk HEC payload format and all event metadata Splunk accepts, see here: [http://docs.splunk.com/Documentation/Splunk/latest/Data/AboutHEC](http://docs.splunk.com/Documentation/Splunk/latest/Data/AboutHEC)
+### Sending raw events
 
-### Sending Raw Events
+If the option `splunk_send_raw` has been enabled, the user must add all log details in the event field, and only specify fields known to Splunk in the top level event. If there is a mismatch, Splunk returns an HTTP `400 Bad Request` status code.
 
-If the option `splunk_send_raw` has been enabled, the user must take care to put all log details in the event field, and only specify fields known to Splunk in the top level event, if there is a mismatch, Splunk will return a HTTP error 400.
+Consider the following examples:
 
-Consider the following example:
+- `splunk_send_raw` off
 
-**splunk\_send\_raw off**
+  ```json
+  {"time": "SOMETIME", "event": {"k1": "foo", "k2": "bar", "index": "applogs"}}
+  ```
 
-```javascript
-{"time": ..., "event": {"k1": "foo", "k2": "bar", "index": "applogs"}}
-```
+- `splunk_send_raw` on
 
-**splunk\_send\_raw on**
+  ```json
+  {"time": "SOMETIME", "k1": "foo", "k2": "bar", "index": "applogs"}
+  ```
 
-```text
-{"time": .., "k1": "foo", "k2": "bar", "index": "applogs"}
-```
+For up-to-date information about the valid keys, see [Getting Data In](https://docs.splunk.com/Documentation/Splunk/7.1.10/Data/AboutHEC).
 
-For up to date information about the valid keys in the top level object, refer to the Splunk documentation:
+## Splunk metric index
 
-[http://docs.splunk.com/Documentation/Splunk/latest/Data/AboutHEC](http://docs.splunk.com/Documentation/Splunk/latest/Data/AboutHEC)
+With Splunk version 8.0 and later, you can use the Fluent Bit Splunk output plugin to send data to metric indices. This lets you perform visualizations, metric queries, and analysis with other metrics you might be collecting. This is based off of Splunk 8.0 support of multi metric support using single JSON payload, more details can be found in [Splunk metrics documentation](https://docs.splunk.com/Documentation/Splunk/9.4.2/Metrics/GetMetricsInOther#The_multiple-metric_JSON_format)
 
-## Splunk Metric Index
+Sending to a Splunk metric index requires the use of `Splunk_send_raw` option being enabled and formatting the message properly. This includes these specific operations:
 
-With Splunk version 8.0&gt; you can also use the Fluent Bit Splunk output plugin to send data to metric indices. This allows you to perform visualizations, metric queries, and analysis with other metrics you may be collecting. This is based off of Splunk 8.0 support of multi metric support via single JSON payload, more details can be found on [Splunk's documentation page](https://docs.splunk.com/Documentation/Splunk/8.1.2/Metrics/GetMetricsInOther#The_multiple-metric_JSON_format)
+- Nest metric events under a `fields` property
+- Add `metric_name:` to all metrics
+- Add `index`, `source`, `sourcetype` as fields in the message
 
-Sending to a Splunk Metric index requires the use of `Splunk_send_raw` option being enabled and formatting the message properly. This includes three specific operations
+### Example configuration
 
-* Nest metric events under a "fields" property
-* Add `metric_name:`  to all metrics
-* Add index, source, sourcetype as fields in the message
+The following configuration gathers CPU metrics, nests the appropriate field, adds the required identifiers and then sends to Splunk.
 
-### Example Configuration
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
+
+  filters:
+    # Move CPU metrics to be nested under "fields" and
+    # add the prefix "metric_name:" to all metrics
+    # NOTE: you can change Wildcard field to only select metric fields
+    - name: nest
+      match: cpu
+      wildcard: '*'
+      operation: nest
+      nest_under: fields
+      add_prefix: 'metric_name:'
+
+    # Add index, source, sourcetype
+    - name: modify
+      match: cpu
+      set:
+        - index cpu-metrics
+        - source fluent-bit
+        - sourcetype custom
+
+  outputs:
+    - name: splunk
+      match: '*'
+      host: <HOST>
+      port: 8088
+      splunk_token: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx'
+      tls: on
+      tls.verify: off
+```
 
-The following configuration gathers CPU metrics, nests the appropriate field, adds the required identifiers and then sends to Splunk.
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    name cpu
-    tag cpu
+  name cpu
+  tag cpu
 
-# Move CPU metrics to be nested under "fields" and 
+# Move CPU metrics to be nested under "fields" and
 # add the prefix "metric_name:" to all metrics
-# NOTE: you can change Wildcard field to only select metric fields    
+# NOTE: you can change Wildcard field to only select metric fields
 [FILTER]
-    Name nest
-    Match cpu
-    Wildcard *
-    Operation nest
-    Nest_under fields
-    Add_Prefix metric_name:
+  Name nest
+  Match cpu
+  Wildcard *
+  Operation nest
+  Nest_under fields
+  Add_Prefix metric_name:
 
 # Add index, source, sourcetype
 [FILTER]
-    Name    modify
-    Match   cpu
-    Set index cpu-metrics 
-    Set source fluent-bit
-    Set sourcetype custom
+  Name    modify
+  Match   cpu
+  Set index cpu-metrics
+  Set source fluent-bit
+  Set sourcetype custom
 
 # ensure splunk_send_raw is on
 [OUTPUT]
-    name splunk 
-    match *
-    host <HOST>
-    port 8088
-    splunk_send_raw on
-    splunk_token f9bd5bdb-c0b2-4a83-bcff-9625e5e908db 
-    tls on
-    tls.verify off
+  name splunk
+  match *
+  host <HOST>
+  port 8088
+  splunk_send_raw on
+  splunk_token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
+  tls on
+  tls.verify off
 ```
 
-## Send Metrics Events of Fluent Bit
+{% endtab %}
+{% endtabs %}
+
+## Send metrics events of Fluent Bit
 
-With Fluent Bit 2.0, you can also send Fluent Bit's metrics type of events into Splunk via Splunk HEC.
-This allows you to perform visualizations, metric queries, and analysis with directly sent Fluent Bit's metrics type of events.
-This is based off Splunk 8.0 support of multi metric support via single concatenated JSON payload.
+In Fluent Bit 2.0 or later, you can send Fluent Bit metrics the `events` type into Splunk using Splunk HEC. This lets you perform visualizations, metric queries, and analysis with directly sent using Fluent Bit metrics. This is based off Splunk 8.0 support of multi metric support using a single concatenated JSON payload.
+
+Sending Fluent Bit metrics into Splunk requires the use of collecting Fluent Bit metrics plugins, whether events type of logs or metrics can be distinguished automatically. You don't need to pay attentions about the type of events.
 
-Sending Fluent Bit's metrics into Splunk requires the use of collecting Fluent Bit's metrics plugins.
-Note that whether events type of logs or metrics can be distinguished automatically.
-You don't need to pay attentions about the type of events.
 This example includes two specific operations
 
-* Collect node or Fluent Bit's internal metrics
-* Send metrics as single concatenated JSON payload
+- Collect node or Fluent Bit internal metrics
+- Send metrics as single concatenated JSON payload
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: node_exporter_metrics
+      tag: node_exporter_metrics
+
+  outputs:
+    - name: splunk
+      match: '*'
+      host: <HOST>
+      port: 8088
+      splunk_token: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx'
+      tls: on
+      tls.verify: off
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
@@ -223,7 +343,10 @@ This example includes two specific operations
     match *
     host <HOST>
     port 8088
-    splunk_token ee7edc62-19ad-4d1e-b957-448d3b326fb6
+    splunk_token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
     tls on
     tls.verify off
 ```
+
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/outputs/stackdriver.md b/pipeline/outputs/stackdriver.md
index 759e629d8..34bd744b0 100644
--- a/pipeline/outputs/stackdriver.md
+++ b/pipeline/outputs/stackdriver.md
@@ -1,105 +1,158 @@
 # Stackdriver
 
-Stackdriver output plugin allows to ingest your records into [Google Cloud Stackdriver Logging](https://cloud.google.com/logging/) service.
-
-Before to get started with the plugin configuration, make sure to obtain the proper credentials to get access to the service. We strongly recommend to use a common JSON credentials file, reference link:
-
-* [Creating a Google Service Account for Stackdriver](https://cloud.google.com/logging/docs/agent/authorization#create-service-account)
-
-> Your goal is to obtain a credentials JSON file that will be used later by Fluent Bit Stackdriver output plugin.
-
-## Configuration Parameters
-
-| Key | Description | default |
-| :--- | :--- | :--- |
-| google\_service\_credentials | Absolute path to a Google Cloud credentials JSON file | Value of environment variable _$GOOGLE\_APPLICATION\_CREDENTIALS_ |
-| service\_account\_email | Account email associated to the service. Only available if **no credentials file** has been provided. | Value of environment variable _$SERVICE\_ACCOUNT\_EMAIL_ |
-| service\_account\_secret | Private key content associated with the service account. Only available if **no credentials file** has been provided. | Value of environment variable _$SERVICE\_ACCOUNT\_SECRET_ |
-| metadata\_server | Prefix for a metadata server. Can also set environment variable _$METADATA\_SERVER_. | [http://metadata.google.internal](http://metadata.google.internal) |
-| location | The GCP or AWS region in which to store data about the resource. If the resource type is one of the _generic\_node_ or _generic\_task_, then this field is required. |  |
-| namespace | A namespace identifier, such as a cluster name or environment. If the resource type is one of the _generic\_node_ or _generic\_task_, then this field is required. |  |
-| node\_id | A unique identifier for the node within the namespace, such as hostname or IP address. If the resource type is _generic\_node_, then this field is required. |  |
-| job | An identifier for a grouping of related task, such as the name of a microservice or distributed batch. If the resource type is _generic\_task_, then this field is required. |  |
-| task\_id | A unique identifier for the task within the namespace and job, such as a replica index identifying the task within the job. If the resource type is _generic\_task_, then this field is required. |  |
-| export\_to\_project\_id | The GCP project that should receive these logs. | Defaults to the project ID of the google\_service\_credentials file, or the project\_id from Google's metadata.google.internal server. |
-| resource | Set resource type of data. Supported resource types: _k8s\_container_, _k8s\_node_, _k8s\_pod_, _k8s\_cluster_, _global_, _generic\_node_, _generic\_task_, and _gce\_instance_. | global, gce\_instance |
-| k8s\_cluster\_name | The name of the cluster that the container \(node or pod based on the resource type\) is running in. If the resource type is one of the _k8s\_container_, _k8s\_node_ or _k8s\_pod_, then this field is required. |  |
-| k8s\_cluster\_location | The physical location of the cluster that contains \(node or pod based on the resource type\) the container. If the resource type is one of the _k8s\_container_, _k8s\_node_ or _k8s\_pod_, then this field is required. |  |
-| labels\_key | The value of this field is used by the Stackdriver output plugin to find the related labels from jsonPayload and then extract the value of it to set the LogEntry Labels. | `logging.googleapis.com/labels`. See [Stackdriver Special Fields][StackdriverSpecialFields] for more info. |
-| labels | Optional list of comma separated of strings specifying `key=value` pairs. The resulting `labels` will be combined with the elements in obtained from `labels_key` to set the LogEntry Labels. Elements from `labels` will override duplicate values from `labels_key`.|  |
-| log\_name\_key | The value of this field is used by the Stackdriver output plugin to extract logName from jsonPayload and set the logName field. | `logging.googleapis.com/logName`. See [Stackdriver Special Fields][StackdriverSpecialFields] for more info. |
-| tag\_prefix | Set the tag\_prefix used to validate the tag of logs with k8s resource type. Without this option, the tag of the log must be in format of k8s\_container\(pod/node\).\* in order to use the k8s\_container resource type. Now the tag prefix is configurable by this option \(note the ending dot\). | k8s\_container., k8s\_pod., k8s\_node. |
-| severity\_key | Specify the name of the key from the original record that contains the severity information. | `logging.googleapis.com/severity`. See [Stackdriver Special Fields][StackdriverSpecialFields] for more info. |
-| project_id_key | The value of this field is used by the Stackdriver output plugin to find the gcp project id from jsonPayload and then extract the value of it to set the PROJECT_ID within LogEntry logName, which controls the gcp project that should receive these logs. | `logging.googleapis.com/projectId`. See [Stackdriver Special Fields][StackdriverSpecialFields] for more info. |
-| autoformat\_stackdriver\_trace | Rewrite the _trace_ field to include the projectID and format it for use with Cloud Trace. When this flag is enabled, the user can get the correct result by printing only the traceID (usually 32 characters). | false |
-| Workers | Enables dedicated thread(s) for this output. | 1 |
-| custom\_k8s\_regex | Set a custom regex to extract field like pod\_name, namespace\_name, container\_name and docker\_id from the local\_resource\_id in logs. This is helpful if the value of pod or node name contains dots. | `(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$` |
-| resource_labels | An optional list of comma separated strings specifying resource labels plaintext assignments (`new=value`) and/or mappings from an original field in the log entry to a destination field (`destination=$original`). Nested fields and environment variables are also supported using the [record accessor syntax](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/record-accessor). If configured, *all* resource labels will be assigned using this API only, with the exception of `project_id`. See [Resource Labels](#resource-labels) for more details. | |
-| compress | Set payload compression mechanism. The only available option is `gzip`. Default = "", which means no compression.|  |
-
-### Configuration File
-
-If you are using a _Google Cloud Credentials File_, the following configuration is enough to get started:
-
+The _Stackdriver_ output plugin lets you ingest your records into the [Google Cloud Stackdriver Logging](https://cloud.google.com/logging/) service.
+
+Before getting started with the plugin configuration, be sure to obtain the [proper credentials](https://cloud.google.com/logging/docs/agent/logging/authorization#create-service-account) to get access to the service. For best results, use a common JSON credentials file that can be referenced by the Stackdriver plugin.
+
+## Configuration parameters
+
+This plugin uses the following configuration parameters. For more details about Stackdriver-specific parameters, see the [Google Cloud `LogEntry` API documentation](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry).
+
+| Key | Description | Default |
+| --- | ----------- | ------- |
+| `google_service_credentials` | Absolute path to a Google Cloud credentials JSON file. | Value of environment variable `$GOOGLE_APPLICATION_CREDENTIALS` |
+| `service_account_email` | Account email associated with the service. Only available if no credentials file has been provided. | Value of environment variable `$SERVICE_ACCOUNT_EMAIL` |
+| `service_account_secret` | Private key content associated with the service account. Only available if no credentials file has been provided. | Value of environment variable `$SERVICE_ACCOUNT_SECRET` |
+| `metadata_server` | Prefix for a metadata server. | Value of environment variable `$METADATA_SERVER`, or `http://metadata.google.internal` if unset. |
+| `location` | The GCP or AWS region in which to store data about the resource. If the resource type is either `generic_node` or `generic_task`, this field is required. | _none_ |
+| `namespace` | A namespace identifier, such as a cluster name or environment. If the resource type is either `generic_node` or `generic_task`, this field is required. | _none_ |
+| `node_id` | A unique identifier for the node within the namespace, such as a hostname or IP address. If the resource type is `generic_node`, this field is required. | _none_ |
+| `job` | An identifier for a grouping of related task, such as the name of a microservice or distributed batch. If the resource type is `generic_task`, this field is required. | _none_ |
+| `task_id` | A unique identifier for the task within the namespace and job, such as a replica index identifying the task within the job. If the resource type is `generic_task`, this field is required. | _none_ |
+| `export_to_project_id` | The GCP project that should receive these logs. | The `project_id` in the `google_service_credentials` file, or the `project_id` from Google's `metadata.google.internal` server. |
+| `resource` | Set resource type of data. Supported resource types: `k8s_container`, `k8s_node`, `k8s_pod`, `global`, `generic_node`, `generic_task`, and `gce_instance`. | `global`, `gce_instance` |
+| `k8s_cluster_name` | The name of the cluster that the container (node or pod based on the resource type) is running in. If the resource type is `k8s_container`, `k8s_node`, or `k8s_pod`, this field is required. | _none_ |
+| `k8s_cluster_location` | The physical location of the cluster that contains (node or pod based on the resource type) the container. If the resource type is `k8s_container`, `k8s_node`, or `k8s_pod`, this field is required. | _none_ |
+| `labels_key` | The name of the key from the original record that contains the LogEntry's `labels`. | `logging.googleapis.com/labels` |
+| `labels` | Optional list of comma-separated of strings specifying `key=value` pairs. The resulting labels will be combined with the elements obtained from `labels_key` to set the LogEntry Labels. Elements from `labels` will override duplicate values from `labels_key`. | _none_ |
+| `log_name_key` | The name of the key from the original record that contains the `logName` value. | `logging.googleapis.com/logName` |
+| `tag_prefix` | Set the `tag_prefix` used to validate the tag of logs with Kubernetes resource type. Without this option, the tag of the log must be in format of `k8s_container(pod/node).*` to use the `k8s_container` resource type. Now the tag prefix is configurable by this option (note the ending dot). | `k8s_container.`, `k8s_pod.`, `k8s_node.` |
+| `severity_key` | The name of the key from the original record that contains the severity. | `logging.googleapis.com/severity` |
+| `project_id_key` | The value of this field is used by the Stackdriver output plugin to find the GCP `projectID` from `jsonPayload` and then extract the value of it to set the `PROJECT_ID` within LogEntry `logName`, which controls the GCP project that should receive these logs. | `logging.googleapis.com/projectId`. See [Stackdriver Special Fields](https://github.com/fluent/fluent-bit-docs/blob/master/pipeline/outputs/stackdriver_special_fields.md#log-entry-fields) for more info. |
+| `autoformat_stackdriver_trace` | Rewrite the _trace_ field to include the `projectID` and format it for use with Cloud Trace. When this flag is enabled, the user can get the correct result by printing only the `traceID` (usually 32 characters). | `false` |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `1` |
+| `custom_k8s_regex` | Set a custom regular expression to extract field like `pod_name`, `namespace_name`, `container_name`, and `docker_id` from the `local_resource_id` in logs. This is helpful if the value of pod or node name contains dots. | `(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$` |
+| `resource_labels` | An optional list of comma-separated strings specifying resource label plain text assignments (`new=value`) and mappings from an original field in the log entry to a destination field (`destination=$original`). Nested fields and environment variables are also supported using the [record accessor syntax](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/record-accessor). If configured, all resource labels will be assigned using this API only, with the exception of `project_id`. See [Resource Labels](#resource-labels) for more details. | _none_ |
+| `http_request_key` | The name of the key from the original record that contains the LogEntry's `httpRequest`. Be aware that the default value erroneously uses an underscore; users will likely need to set this to `logging.googleapis.com/httpRequest`. | `logging.googleapis.com/http_request` |
+| `compress` | Set payload compression mechanism. The only available option is `gzip`. If no value is specified, no compression is applied. | _none_ |
+| `cloud_logging_base_url` | Set the base Cloud Logging API URL to use for the `/v2/entries:write` API request. | `https://logging.googleapis.com` |
+
+## Configuration file
+
+If you are using a Google Cloud Credentials File, the following configuration is enough to get started:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
+
+  outputs:
+    - name: stackdriver
+      match: '*'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name  cpu
-    Tag   cpu
+  Name  cpu
+  Tag   cpu
 
 [OUTPUT]
-    Name        stackdriver
-    Match       *
+  Name        stackdriver
+  Match       *
 ```
 
-Example configuration file for k8s resource type:
+{% endtab %}
+{% endtabs %}
+
+### Example configuration file for Kubernetes resource types
+
+The `local_resource_id` value is used by the Stackdriver output plugin to set the labels field for different Kubernetes resource types. Stackdriver plugin will try to find the `local_resource_id` field in the log entry. If there is no field `logging.googleapis.com/local_resource_id` in the log, the plugin will then construct it by using the tag value of the log.
 
-local_resource_id is used by stackdriver output plugin to set the labels field for different k8s resource types. Stackdriver plugin will try to find the local_resource_id field in the log entry. If there is no field logging.googleapis.com/local_resource_id in the log, the plugin will then construct it by using the tag value of the log.
+The `local_resource_id` should be in format:
 
-The local_resource_id should be in format:
+- `k8s_container.<namespace_name>.<pod_name>.<container_name>`
+- `k8s_node.<node_name>`
+- `k8s_pod.<namespace_name>.<pod_name>`
 
-* `k8s_container.<namespace_name>.<pod_name>.<container_name>`
-* `k8s_node.<node_name>`
-* `k8s_pod.<namespace_name>.<pod_name>`
+This implies that if there is no `local_resource_id` in the log entry then the tag of logs should match this format. Be aware that there is a `tag_prefix` option, so it's not mandatory to use `k8s_container(node/pod)` as the prefix for tag.
 
-This implies that if there is no local_resource_id in the log entry then the tag of logs should match this format. Note that we have an option tag_prefix so it is not mandatory to use k8s_container(node/pod) as the prefix for tag.
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
+```yaml
+pipeline:
+  inputs:
+    - name: tail
+      tag_regex: 'var.log.containers.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$'
+      tag: custom_tag.<namespace_name>.<pod_name>.<container_name>
+      path: /var/log/containers/*.log
+      parser: docker
+      db: /var/log/fluent-bit-k8s-container.db
+
+  outputs:
+    - name: stackdriver
+      match: 'custom_tag.*'
+      resource: k8s_container
+      k8s_cluster_name: test_cluster_name
+      k8s_cluster_location: test_cluster_location
+      tag_prefix: 'custom_tag.'
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name               tail
-    Tag_Regex          var.log.containers.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$
-    Tag                custom_tag.<namespace_name>.<pod_name>.<container_name>
-    Path               /var/log/containers/*.log
-    Parser             docker
-    DB                 /var/log/fluent-bit-k8s-container.db
+  Name               tail
+  Tag_Regex          var.log.containers.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$
+  Tag                custom_tag.<namespace_name>.<pod_name>.<container_name>
+  Path               /var/log/containers/*.log
+  Parser             docker
+  DB                 /var/log/fluent-bit-k8s-container.db
 
 [OUTPUT]
-    Name        stackdriver
-    Match       custom_tag.*
-    Resource    k8s_container
-    k8s_cluster_name test_cluster_name
-    k8s_cluster_location  test_cluster_location
-    tag_prefix  custom_tag.
+  Name                  stackdriver
+  Match                 custom_tag.*
+  Resource              k8s_container
+  k8s_cluster_name      test_cluster_name
+  k8s_cluster_location  test_cluster_location
+  tag_prefix            custom_tag.
 ```
 
-## Resource Labels
+{% endtab %}
+{% endtabs %}
 
-Currently, there are four ways which fluent-bit uses to assign fields into the resource/labels section.
+## Resource labels
+
+Fluent Bit uses the following methods to assign fields to the resource/labels section:
 
 1. Resource Labels API
 2. Monitored Resource API
-3. Local Resource Id
+3. Local Resource ID
 4. Credentials / Config Parameters
 
-If `resource_labels` is correctly configured, then fluent-bit will attempt to populate all resource/labels using the entries specified. Otherwise, fluent-bit will attempt to use the monitored resource API. Similarly, if the monitored resource API cannot be used, then fluent-bit will attempt to populate resource/labels using configuration parameters and/or credentials specific to the resource type. As mentioned in the [Configuration File](#configuration-file) section, fluent-bit will attempt to use or construct a local resource ID for a K8s resource type which does not use the resource labels or monitored resource API.
+If `resource_labels` is correctly configured, then Fluent Bit will attempt to populate all resource labels using the entries specified. Otherwise, Fluent Bit will attempt to use the monitored resource API. Similarly, if the monitored resource API can't be used, then Fluent Bit will attempt to populate resource/labels using configuration parameters and credentials specific to the resource type. As mentioned in the [configuration file](#configuration-file) section, Fluent Bit will attempt to use or construct a local resource ID for a Kubernetes resource type that doesn't use the resource labels or monitored resource API.
+
+{% hint style="info" %}
 
-Note that the `project_id` resource label will always be set from the service credentials or fetched from the metadata server and cannot be overridden.
+The `project_id` resource label will always be set from the service credentials or fetched from the metadata server. It can't be overridden.
 
-### Using the resource_labels parameter
+{% endhint %}
 
-The `resource_labels` configuration parameter offers an alternative API for assigning the resource labels. To use, input a list of comma separated strings specifying resource labels plaintext assignments (`new=value`), mappings from an original field in the log entry to a destination field (`destination=$original`) and/or environment variable assignments (`new=${var}`).
+### Use the `resource_labels` parameter
+
+The `resource_labels` configuration parameter offers an alternative API for assigning the resource labels. To use, input a list of comma-separated strings specifying resource labels plain text assignments (`new=value`), mappings from an original field in the log entry to a destination field (`destination=$original`) and environment variable assignments (`new=${var}`).
 
 For instance, consider the following log entry:
-```
+
+```json
 {
   "keyA": "valA",
   "toplevel": {
@@ -108,23 +161,43 @@ For instance, consider the following log entry:
 }
 ```
 
-Combined with the following Stackdriver configuration:
+Combined with the following Fluent Bit Stackdriver output plugin configuration:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: stackdriver
+      match: '*'
+      resource_labels: keyC=$keyA,keyD=$toplevel['keyB'],keyE=valC
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-    Name stackdriver
-    Match *
-    Resource_Labels  keyC=$keyA,keyD=$toplevel['keyB'],keyE=valC
+  Name             stackdriver
+  Match            *
+  Resource_Labels  keyC=$keyA,keyD=$toplevel['keyB'],keyE=valC
 ```
 
+{% endtab %}
+{% endtabs %}
+
 This will produce the following log:
-```
+
+```json
 {
   "resource": {
     "type": "global",
     "labels": {
       "project_id": "fluent-bit",
       "keyC": "valA",
-      "keyD": "valB"
+      "keyD": "valB",
       "keyE": "valC"
     }
   },
@@ -135,7 +208,7 @@ This will produce the following log:
         "toplevel": {
            "keyB": "valB"
         }
-      },
+      }
     }
   ]
 }
@@ -143,58 +216,80 @@ This will produce the following log:
 
 This makes the `resource_labels` API the recommended choice for supporting new or existing resource types that have all resource labels known before runtime or available on the payload during runtime.
 
-For instance, for a K8s resource type, `resource_labels` can be used in tandem with the [Kubernetes filter](https://docs.fluentbit.io/manual/pipeline/filters/kubernetes) to pack all six resource labels. Below is an example of what this could look like for a `k8s_container` resource:
+For instance, for a Kubernetes resource type, `resource_labels` can be used in tandem with the [Kubernetes filter](https://docs.fluentbit.io/manual/pipeline/filters/kubernetes) to pack all six resource labels. The following example shows what this could look like for a `k8s_container` resource:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
+```yaml
+pipeline:
 
+  outputs:
+    - name: stackdriver
+      match: '*'
+      resource: k8s_container
+      resource_labels: cluster_name=my-cluster,location=us-central1-c,container_name=$kubernetes['container_name'],namespace_name=$kubernetes['namespace_name'],pod_name=$kubernetes['pod_name']
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [OUTPUT]
-    Name            stackdriver
-    Match           *
-    Resource        k8s_container
-    Resource_Labels cluster_name=my-cluster,location=us-central1-c,container_name=$kubernetes['container_name'],namespace_name=$kubernetes['namespace_name'],pod_name=$kubernetes['pod_name']
+  Name            stackdriver
+  Match           *
+  Resource        k8s_container
+  Resource_Labels cluster_name=my-cluster,location=us-central1-c,container_name=$kubernetes['container_name'],namespace_name=$kubernetes['namespace_name'],pod_name=$kubernetes['pod_name']
 ```
 
-`resource_labels` also supports validation for required labels based on the input resource type. This allows fluent-bit to check if all specified labels are present for a given configuration before runtime. If validation is not currently supported for a resource type that you would like to use this API with, we encourage you to open a pull request for it. Adding validation for a new resource type is simple - all that is needed is to specify the resources associated with the type alongside the required labels [here](https://github.com/fluent/fluent-bit/blob/master/plugins/out_stackdriver/stackdriver_resource_types.c#L27).
-## Troubleshooting Notes
+{% endtab %}
+{% endtabs %}
 
-### Upstream connection error
+The `resource_labels` parameter also supports validation for required labels based on the input resource type. This allows Fluent Bit to check if all specified labels are present for a given configuration before runtime. If validation isn't supported for a resource type that you want to use this API with, open a pull request for it. Adding validation for a new resource type involves specifying the resources associated with the type alongside the [required labels](https://github.com/fluent/fluent-bit/blob/master/plugins/out_stackdriver/stackdriver_resource_types.c#L27).
 
-> Github reference: [#761](https://github.com/fluent/fluent-bit/issues/761)
+## Log names
 
-An upstream connection error means Fluent Bit was not able to reach Google services, the error looks like this:
+By default, the plugin will write to the following log name:
 
+```text
+/projects/<project ID>/logs/<log tag>
 ```
+
+You might be in a scenario where being more specific about the log name is important (for example, [integration with Log Router rules](https://cloud.google.com/logging/docs/routing/overview) or [controlling cardinality of log based metrics](https://cloud.google.com/logging/docs/logs-based-metrics/troubleshooting#too-many-time-series)). You can control the log name directly on a per-log basis by using the [`logging.googleapis.com/logName` special field](https://github.com/fluent/fluent-bit-docs/blob/master/pipeline/outputs/stackdriver_special_fields.md#log-entry-fields). You can configure a `log_name_key` if you'd like to use something different from `logging.googleapis.com/logName`. For example, if the `log_name_key` is set to `mylognamefield` will extract the log name from `mylognamefield` in the log.
+
+## Troubleshooting
+
+### Upstream connection error
+
+An upstream connection error means Fluent Bit wasn't able to reach Google services. In that case, the error message looks like this:
+
+```text
 [2019/01/07 23:24:09] [error] [oauth2] could not get an upstream connection
 ```
 
-This belongs to a network issue by the environment where Fluent Bit is running, make sure that from the Host, Container or Pod you can reach the following Google end-points:
+This is due to a network issue in the environment where Fluent Bit is running. Ensure that the Host, Container, or Pod can reach the Google API endpoints.
+
+{% hint style="warning" %}
 
-* [https://www.googleapis.com](https://www.googleapis.com)
-* [https://logging.googleapis.com](https://logging.googleapis.com)
+For more details, see GitHub reference: [#761](https://github.com/fluent/fluent-bit/issues/761)
 
-### Fail to process local_resource_id
+{% endhint %}
+
+### Fail to process `local_resource_id`
 
 The error looks like this:
 
-```
+```text
 [2020/08/04 14:43:03] [error] [output:stackdriver:stackdriver.0] fail to process local_resource_id from log entry for k8s_container
 ```
 
-Do following check:
+Check the following:
 
-* If the log entry does not contain the local_resource_id field, does the tag of the log match for format?
-*   If tag_prefix is configured, does the prefix of tag specified in the input plugin match the tag_prefix?
+- If the log entry doesn't contain the `local_resource_id` field, does the tag of the log match for format?
+- If `tag_prefix` is configured, does the prefix of tag specified in the input plugin match the `tag_prefix`?
 
-### Occasional Crashing with >1 `Workers`
-
-> Github reference: [#7552](https://github.com/fluent/fluent-bit/issues/7552)
-
-When the number of Workers is greater than 1, Fluent Bit may intermittently crash.
-
-## Other implementations
+## Other Implementations
 
 Stackdriver officially supports a [logging agent based on Fluentd](https://cloud.google.com/logging/docs/agent).
 
-We plan to support some [special fields in structured payloads](https://cloud.google.com/logging/docs/agent/configuration#special-fields). Use cases of special fields is [here](./stackdriver_special_fields.md).
-
-[StackdriverSpecialFields]: ./stackdriver_special_fields.md#log-entry-fields
+Fluent Bit plans to support some [special fields in structured payloads](https://cloud.google.com/logging/docs/agent/configuration#special-fields). For more information, see the documentation about [special fields](https://github.com/fluent/fluent-bit-docs/blob/master/pipeline/outputs/stackdriver_special_fields.md#log-entry-fields).
diff --git a/pipeline/outputs/stackdriver_special_fields.md b/pipeline/outputs/stackdriver_special_fields.md
index eff5d0ee4..8d2fdcb3d 100644
--- a/pipeline/outputs/stackdriver_special_fields.md
+++ b/pipeline/outputs/stackdriver_special_fields.md
@@ -1,426 +1,341 @@
-# Stackdriver Special fields
+# Stackdriver special fields
 
 When the [google-logging-agent](https://cloud.google.com/logging/docs/agent) receives a structured log record, it treats [some fields](https://cloud.google.com/logging/docs/agent/configuration#special-fields) specially, allowing users to set specific fields in the LogEntry object that get written to the Logging API.
 
-## Log Entry Fields
+## LogEntry fields
 
-Currently, we support some special fields in fluent-bit for setting fields on the LogEntry object:
-| JSON log field | [LogEntry](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry) field | Description |
-| :--- | :--- | :--- |
-| logging.googleapis.com/operation | operation | Additional information about a potentially long-running operation |
-| logging.googleapis.com/labels | labels | The value of this field should be a structured record |
-| logging.googleapis.com/insertId | insertId | A unique identifier for the log entry. It is used to order logEntries |
-| logging.googleapis.com/sourceLocation | sourceLocation | Additional information about the source code location that produced the log entry. |
-| logging.googleapis.com/http_request | httpRequest | A common proto for logging HTTP requests. |
-| logging.googleapis.com/trace | trace | Resource name of the trace associated with the log entry |
-| logging.googleapis.com/traceSampled | traceSampled | The sampling decision associated with this log entry. |
-| logging.googleapis.com/spanId | spanId | The ID of the trace span associated with this log entry. |
-| timestamp | timestamp | An object including the seconds and nanos fields that represents the time |
-| timestampSecond & timestampNanos | timestamp | The seconds and nanos that represents the time |
+Fluent Bit support some special fields for setting fields on the LogEntry object:
 
-## Other Special Fields
+| JSON log field | [LogEntry](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry) field | Type | Description |
+| :--- | :--- | :--- | :--- |
+| `logging.googleapis.com/logName` | `logName` | `string` | The log name to write this log to. |
+| `logging.googleapis.com/labels` | `labels` | `object<string, string>` | The labels for this log. |
+| `logging.googleapis.com/severity` | `severity` | [`LogSeverity` Enum](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity) | The severity of this log. |
+| `logging.googleapis.com/monitored_resource` | `resource` | [`MonitoredResource`](https://cloud.google.com/logging/docs/reference/v2/rest/v2/MonitoredResource) (without `type`) | Resource labels for this log. |
+| `logging.googleapis.com/operation` | `operation` | [`LogEntryOperation`](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogEntryOperation) | Additional information about a potentially long-running operation. |
+| `logging.googleapis.com/insertId` | `insertId` | `string` | A unique identifier for the log entry. It's used to order `logEntries`. |
+| `logging.googleapis.com/sourceLocation` | `sourceLocation` | [`LogEntrySourceLocation`](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogEntrySourceLocation) | Additional information about the source code location that produced the log entry. |
+| `logging.googleapis.com/http_request` | `httpRequest` | [`HttpRequest`](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#HttpRequest) | A common proto for logging HTTP requests. |
+| `logging.googleapis.com/trace` | `trace` | `string` | Resource name of the trace associated with the log entry. |
+| `logging.googleapis.com/traceSampled` | `traceSampled` | boolean | The sampling decision associated with this log entry. |
+| `logging.googleapis.com/spanId` | `spanId` | `string` | The ID of the trace span associated with this log entry. |
+| `timestamp` | `timestamp` | `object` ([protobuf `Timestamp` object format](https://protobuf.dev/reference/protobuf/google.protobuf/#timestamp)) | An object including the seconds and nanoseconds fields that represent the time. |
+| `timestampSecond` and `timestampNanos` | `timestamp` | `int` | The seconds and nanoseconds that represent the time. |
+
+## Other special fields
 
 | JSON log field | Description |
-| :--- | :--- |
-| logging.googleapis.com/projectId | Changes the project ID that this log will be written to. Ensure that you are authenticated to write logs to this project. |
+|:---------------|:------------|
+| `logging.googleapis.com/projectId` | Changes the project ID that this log will be written to. Ensure that you are authenticated to write logs to this project. |
+| `logging.googleapis.com/local_resource_id` | Overrides the [configured `local_resource_id`](./stackdriver.md#resource-labels).   |
 
-## Operation
-Operation field contains additional information about a potentially long-running operation with which a log entry is associated.
+## Use special fields
 
-The JSON representation is as followed:
-```text
-{
-  "id": string,
-  "producer": string,
-  "first": boolean,
-  "last": boolean
-}
-```
+To use a special field, you must add a field with the right name and value to your log. Given an example structured log (internally in MessagePack but shown in JSON for demonstration):
 
-For example, when the jsonPayload contains the subfield `logging.googleapis.com/operation`:
-```text
-jsonPayload {
-    "logging.googleapis.com/operation": {
-        "id": "test_id",
-        "producer": "test_producer",
-        "first": true,
-        "last": true
-    }
-    ...
-}
-```
-the stackdriver output plugin will extract the operation field and remove it from jsonPayload. LogEntry will be:
-```text
+```json
 {
-    "jsonPayload": {
-        ...
-    }
-    "operation": {
-        "id": "test_id",
-        "producer": "test_producer",
-        "first": true,
-        "last": true
-    }
-    ...
+  "log": "Hello world!"
 }
 ```
 
-### Use Cases
-**1. If the subfields are empty or in incorrect type, stackdriver output plugin will set these subfields empty.** For example:
-```text
-jsonPayload {
-    "logging.googleapis.com/operation": {
-        "id": 123, #incorrect type
-        # no producer here
-        "first": true,
-        "last": true
-    }
-    ...
-}
-```
-the logEntry will be:
-```text
+To use the `logging.googleapis.com/logName` special field, add it to your structured log as follows:
+
+```json
 {
-    "jsonPayload": {
-        ...
-    }
-    "operation": {
-        "first": true,
-        "last": true
-    }
-    ...
-}
-```
-**2. If the `logging.googleapis.com/operation` itself is not a map, stackdriver output plugin will leave this field untouched.** For example:
-```text
-jsonPayload {
-    "logging.googleapis.com/operation": "some string",
-    ...
+  "log": "Hello world!",
+  "logging.googleapis.com/logName": "my_log"
 }
 ```
-the logEntry will be:
-```text
+
+For the special fields that map to `LogEntry` prototypes, add them as objects with field names that match the proto. For example, to use the `logging.googleapis.com/operation`:
+
+```json
 {
-    "jsonPayload": {
-        "logging.googleapis.com/operation": "some string",
-        ...
-    }
-    ...
-}
-```
-**3. If there are extra subfields, stackdriver output plugin will add operation field to logEntry and preserve the extra subfields in jsonPayload.** For example:
-```text
-jsonPayload {
-    "logging.googleapis.com/operation": {
-        "id": "test_id",
-        "producer": "test_producer",
-        "first": true,
-        "last": true,
-
-        "extra1": "some string",
-        "extra2": 123,
-        "extra3": true
-    }
-    ...
+  "log": "Hello world!",
+  "logging.googleapis.com/operation": {
+    "id": "test_id",
+    "producer": "test_producer",
+    "first": true,
+    "last": true
+  }
 }
 ```
-the logEntry will be:
+
+Adding special fields to logs is best done through the [`modify` filter](https://docs.fluentbit.io/manual/pipeline/filters/modify) for basic fields, or [a Lua script using the `lua` filter](https://docs.fluentbit.io/manual/pipeline/filters/lua) for more complex fields.
+
+## Basic type special fields
+
+Special fields with basic types (except for the [`logging.googleapis.com/insertId` field](#insert-id)) will follow this pattern (demonstrated with the `logging.googleapis.com/logName` field):
+
+1. If the special field matches the type, it will be moved to the corresponding LogEntry field. For example:
+
+   ```text
+   {
+     ...
+     "logging.googleapis.com/logName": "my_log"
+     ...
+   }
+   ```
+
+   the `logEntry` will be:
+
+   ```text
+   {
+     "jsonPayload": {
+       ...
+     }
+     "logName": "my_log"
+     ...
+   }
+   ```
+
+1. If the field is non-empty but an invalid, it will be left in the `jsonPayload`. For example:
+
+   ```text
+   {
+     ...
+     "logging.googleapis.com/logName": 12345
+     ...
+   }
+   ```
+
+  the `logEntry` will be:
+
+   ```text
+   {
+     "jsonPayload": {
+       "logging.googleapis.com/logName": 12345
+       ...
+     }
+   }
+   ```
+
+### Exceptions [#exceptions-basic]
+
+#### Insert ID
+
+If the `logging.googleapis.com/insertId` field has an invalid type, the log will be rejected by the plugin and not sent to Cloud Logging.
+
+#### Trace sampled
+
+If the`autoformat_stackdriver_trace` is set to `true`, the value provided in the `trace` field will be formatted into the format that Cloud Logging expects along with the detected Project ID (from the Google Metadata server, configured in the plugin, or provided using a special field).
+
+For example, if `autoformat_stackdriver_trace` is enabled, this:
+
 ```text
 {
-    "jsonPayload": {
-        "logging.googleapis.com/operation": {
-            "extra1": "some string",
-            "extra2": 123,
-            "extra3": true
-        }
-        ...
-    }
-    "operation": {
-        "id": "test_id",
-        "producer": "test_producer",
-        "first": true,
-        "last": true
-    }
-    ...
+  ...
+  "logging.googleapis.com/projectId": "my-project-id",
+  "logging.googleapis.com/trace": "12345"
+  ...
 }
 ```
-## Labels
-labels field contains specific labels in a structured entry that will be added to LogEntry labels.
 
-For example, when the jsonPayload contains the subfield `logging.googleapis.com/labels`:
-```text
-jsonPayload {
-    "logging.googleapis.com/labels": {
-        "A": "valA",
-        "B": "valB",
-        "C": "valC"
-    }
-    ...
-}
-```
-the stackdriver output plugin will extract labels from the subfield `logging.googleapis.com/labels` and move it up from jsonPayload to LogEntry Labels. LogEntry will be:
+Will become this:
+
 ```text
 {
-    "jsonPayload": {
-        ...
-    }
-    "labels": {
-        "A": "valA",
-        "B": "valB",
-        "C": "valC"
-    }
+  "jsonPayload": {
     ...
+  },
+  "projectId": "my-project-id",
+  "trace": "/projects/my-project-id/traces/12345"
+  ...
 }
 ```
 
-## insertId
-InsertId is a unique identifier for the log entry. It is used to order logEntries.
+#### `timestampSecond` and `timestampNano`
 
-The JSON representation is as followed:
-```text
-"insertId": string
-```
+The `timestampSecond` and `timestampNano` fields don't map directly to the `timestamp` field in `LogEntry` so the parsing behaviour deviates from other special fields. Read more in the [Timestamp section](#timestamp).
+
+## Proto special fields
+
+For special fields that expect the format of a prototype from the `LogEntry` (except for the `logging.googleapis.com/monitored_resource` field) will follow this pattern (demonstrated with the `logging.googleapis.com/operation` field):
+
+If any sub-fields of the proto are empty or in incorrect type, the plugin will set these sub-fields empty. For example:
 
-### Use Cases
-**1. If the insertId is a non-empty string.** For example:
-```text
-jsonPayload {
-    "logging.googleapis.com/insertId": "test_id"
-    ...
-}
-```
-the logEntry will be:
 ```text
 {
-    "jsonPayload": {
-        ...
-    }
-    "insertId": "test_id"
-    ...
+  "logging.googleapis.com/operation": {
+    "id": 123, #incorrect type
+    # no producer here
+    "first": true,
+    "last": true
+  }
+  ...
 }
 ```
 
-**2. If the insertId is invalid (not non-empty string).** For example:
+the `logEntry` will be:
+
 ```text
-jsonPayload {
-    "logging.googleapis.com/insertId": 12345
+{
+  "jsonPayload": {
     ...
+  }
+  "operation": {
+    "first": true,
+    "last": true
+  }
+  ...
 }
 ```
-The logging agent will log an error and reject the entry.
 
-## SourceLocation
-SourceLocation field contains additional information about the source code location that produced the log entry. The format.
+If the field itself isn't a map, the plugin will leave this field untouched. For example:
 
-The JSON representation is as followed:
 ```text
 {
-  "file": string,
-  "line": string,
-  "function": string
+  ...
+  "logging.googleapis.com/operation": "some string",
+  ...
 }
 ```
 
-### Use Cases
-Set the input log as followed:
-```text
-jsonPayload {
-    "logging.googleapis.com/sourceLocation": {
-        "file": "my_file",
-        "line": 123,
-        "function": "foo()"
-    }
-    ...
-}
-```
-the logEntry will be:
+the `logEntry` will be:
+
 ```text
 {
-    "jsonPayload": {
-        ...
-    }
-    "sourceLocation": {
-        "file": "my_file",
-        "line": 123,
-        "function": "foo()"
-    }
+  "jsonPayload": {
+    "logging.googleapis.com/operation": "some string",
     ...
+  }
+  ...
 }
 ```
 
-## httpRequest
-HttpRequest field is a common proto for logging HTTP requests.
+If there are extra sub-fields, the plugin will add the recognized fields to the corresponding field in the LogEntry, and preserve the extra sub-fields in `jsonPayload`. For example:
 
-The JSON representation is as followed:
 ```text
 {
-  "requestMethod": string,
-  "requestUrl": string,
-  "requestSize": string,
-  "status": integer,
-  "responseSize": string,
-  "userAgent": string,
-  "remoteIp": string,
-  "serverIp": string,
-  "referer": string,
-  "latency": string,
-  "cacheLookup": boolean,
-  "cacheHit": boolean,
-  "cacheValidatedWithOriginServer": boolean,
-  "cacheFillBytes": string,
-  "protocol": string
+  ...
+  "logging.googleapis.com/operation": {
+    "id": "test_id",
+    "producer": "test_producer",
+    "first": true,
+    "last": true,
+    "extra1": "some string",
+    "extra2": 123,
+    "extra3": true
+  }
+  ...
 }
-
 ```
 
-### Use Cases
-Set the input log as followed:
-```text
-jsonPayload {
-    "logging.googleapis.com/http_request": {
-        "requestMethod":"GET",
-        "requestUrl":"logging.googleapis.com",
-        "requestSize":"12",
-        "status":200,
-        "responseSize":"12",
-        "userAgent":"Mozilla",
-        "remoteIp":"255.0.0.1",
-        "serverIp":"255.0.0.1",
-        "referer":"referer",
-        "latency":"1s",
-        "cacheLookup":true,
-        "cacheHit":true,
-        "cacheValidatedWithOriginServer":true,
-        "cacheFillBytes":"12",
-        "protocol":"HTTP/1.2"
-    }
-    ...
-}
-```
-the logEntry will be:
+the `logEntry will be:
+
 ```text
 {
-    "jsonPayload": {
-        ...
-    }
-    "httpRequest": {
-        "requestMethod":"GET",
-        "requestUrl":"logging.googleapis.com",
-        "requestSize":"12",
-        "status":200,
-        "responseSize":"12",
-        "userAgent":"Mozilla",
-        "remoteIp":"255.0.0.1",
-        "serverIp":"255.0.0.1",
-        "referer":"referer",
-        "latency":"1s",
-        "cacheLookup":true,
-        "cacheHit":true,
-        "cacheValidatedWithOriginServer":true,
-        "cacheFillBytes":"12",
-        "protocol":"HTTP/1.2"
+  "jsonPayload": {
+    "logging.googleapis.com/operation": {
+      "extra1": "some string",
+      "extra2": 123,
+      "extra3": true
     }
     ...
+  }
+  "operation": {
+    "id": "test_id",
+    "producer": "test_producer",
+    "first": true,
+    "last": true
+  }
+  ...
 }
 ```
 
-## Trace
+### Exceptions [#exceptions-proto]
 
-TraceId is resource name of the trace associated with the log entry.
-If enable autoformat_stackdriver_trace flag in config the entry will automatically get the projectID from the Google Metadata server and add it.
+#### `MonitoredResource` ID
 
-The JSON representation is as followed:
-```text
-"trace": string
-```
+The `logging.googleapis.com/monitored_resource` field is parsed in a special way, meaning it has some important exceptions:
 
-### Use Cases
-Set the input log as followed:
-```text
-jsonPayload {
-    "logging.googleapis.com/trace": "0123456789abcdef0123456789abcdef"
-    ...
-}
-```
-the logEntry will be:
-```text
-{
-    "jsonPayload": {
-        ...
-    }
-    "trace": "projects/your-project-name/traces/0123456789abcdef0123456789abcdef"
-    ...
-}
-```
+The `type` field from the `MonitoredResource` proto isn't parsed out of the special field. It's read from the [`resource` plugin configuration option](https://docs.fluentbit.io/manual/pipeline/outputs/stackdriver#configuration-parameters). If it's supplied in the `logging.googleapis.com/monitored_resource` special field, it won't be recognized.
+
+The `labels` field is expected to be an `object<string, string>`. If any fields have a value that's not a string, the value is ignored and not preserved. The plugin logs an error and drops the field.
+
+If no valid `labels` field is found, or if all entries in the `labels` object provided are invalid, the `logging.googleapis.com/monitored_resource` field is dropped in favour of automatically setting resource labels using other available information based on the configured `resource` type.
 
 ## Timestamp
 
-We support two formats of time-related fields:
+Fluent Bit supports the following formats of time-related fields:
 
-Format 1 - timestamp:
-JsonPayload contains a timestamp field that includes the seconds and nanos fields.
-```text
-{
-  "timestamp": {
-    "seconds": CURRENT_SECONDS,
-    "nanos": CURRENT_NANOS
+- `timestamp`
+
+  Log body contains a `timestamp` field that includes the seconds and nanoseconds fields.
+
+  ```text
+  {
+    "timestamp": {
+      "seconds": CURRENT_SECONDS,
+      "nanos": CURRENT_NANOS
+    }
   }
-}
-```
-Format 2 - timestampSeconds/timestampNanos:
-JsonPayload contains both the timestampSeconds and timestampNanos fields.
-```text
-{
-   "timestampSeconds": CURRENT_SECONDS,
-   "timestampNanos": CURRENT_NANOS
-}
+  ```
 
-```
+- `timestampSeconds`/`timestampNanos`
+
+  Log body contains both the `timestampSeconds` and `timestampNanos` fields.
+
+  ```text
+  {
+    "timestampSeconds": CURRENT_SECONDS,
+    "timestampNanos": CURRENT_NANOS
+  }
+  ```
 
-If one of the following JSON timestamp representations is present in a structured record, the Logging agent collapses them into a single representation in the timestamp field in the LogEntry object.
+If one of the following JSON timestamp representations is present in a structured record, the plugin collapses them into a single representation in the timestamp field in the `LogEntry` object.
 
-Without time-related fields, the logging agent will set the current time as timestamp. Supporting time-related fields enables users to get more information about the logEntry.
+Without time-related fields, the plugin will set the current time as timestamp.
 
+### Format 1
+
+Set the input log as follows:
 
-### Use Cases
-**Format 1**
-Set the input log as followed:
 ```text
-jsonPayload {
-    "timestamp": {
-        "seconds": 1596149787,
-        "nanos": 12345
-    }
-    ...
+{
+  "timestamp": {
+    "seconds": 1596149787,
+    "nanos": 12345
+  }
+  ...
 }
 ```
-the logEntry will be:
+
+the `logEntry` will be:
+
 ```text
 {
-    "jsonPayload": {
-        ...
-    }
-    "timestamp": "2020-07-30T22:56:27.000012345Z"
+  "jsonPayload": {
     ...
+  }
+  "timestamp": "2020-07-30T22:56:27.000012345Z"
+  ...
 }
 ```
 
-**Format 2**
-Set the input log as followed:
+### Format 2
+
+Set the input log as follows:
+
 ```text
-jsonPayload {
-    "timestampSeconds":1596149787,
-    "timestampNanos": 12345
-    ...
+{
+  "timestampSeconds":1596149787,
+  "timestampNanos": 12345
+  ...
 }
 ```
-the logEntry will be:
+
+the `logEntry` will be:
+
 ```text
 {
-    "jsonPayload": {
-        ...
-    }
-    "timestamp": "2020-07-30T22:56:27.000012345Z"
+  "jsonPayload": {
     ...
+  }
+  "timestamp": "2020-07-30T22:56:27.000012345Z"
+  ...
 }
 ```
+
+If the `timestamp` object or the `timestampSeconds` and `timestampNanos` fields end up being invalid, they will remain in the `jsonPayload` untouched.
diff --git a/pipeline/outputs/standard-output.md b/pipeline/outputs/standard-output.md
index 44ddf0580..4b773ae2c 100644
--- a/pipeline/outputs/standard-output.md
+++ b/pipeline/outputs/standard-output.md
@@ -1,38 +1,31 @@
-# Standard Output
+# Standard output
 
-The **stdout** output plugin allows to print to the standard output the data received through the _input_ plugin. Their usage is very simple as follows:
+The _standard output_ plugin prints ingested data to standard output.
 
-## Configuration Parameters
+## Configuration parameters
 
-| Key | Description | default |
-| :--- | :--- | :--- |
-| Format | Specify the data format to be printed. Supported formats are _msgpack_, _json_, _json\_lines_ and _json\_stream_. | msgpack |
-| json\_date\_key | Specify the name of the time key in the output record. To disable the time key just set the value to `false`. | date |
-| json\_date\_format | Specify the format of the date. Supported formats are _double_, _epoch_, _iso8601_ (eg: _2018-05-30T09:39:52.000681Z_) and _java_sql_timestamp_ (eg: _2018-05-30 09:39:52.000681_) | double |
-| Workers | Enables dedicated thread(s) for this output. Default value is set since version 1.8.13. For previous versions is 0. | 1 |
+| Key | Description | Default |
+| --- | ----------- | ------- |
+| `Format` | Specify the data format to be printed. Supported formats are `msgpack`, `json`, `json_lines` and `json_stream`. | `msgpack` |
+| `json_date_key`| Specify the name of the time key in the output record. To disable the time key set the value to `false`. | `date` |
+| `json_date_format` | Specify the format of the date. Supported formats are `double`, `epoch`, `iso8601` (for example, `2018-05-30T09:39:52.000681Z`) and `java_sql_timestamp` (for example, `2018-05-30 09:39:52.000681`). | `double` |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `1` |
 
-### Command Line
+### Command line
 
-```bash
-$ bin/fluent-bit -i cpu -o stdout -v
+```shell
+fluent-bit -i cpu -o stdout -v
 ```
 
-We have specified to gather [CPU](https://github.com/fluent/fluent-bit-docs/tree/ddc1cf3d996966b9db39f8784596c8b7132b4d5b/pipeline/input/cpu.md) usage metrics and print them out to the standard output in a human readable way:
+This example directs the plugin to gather [CPU](../inputs/cpu-metrics.md) usage metrics and print them out to the standard output in a human-readable way:
 
-```bash
-$ bin/fluent-bit -i cpu -o stdout -p format=msgpack -v
-Fluent Bit v1.x.x
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+```shell
+fluent-bit -i cpu -o stdout -p format=msgpack -v
 
-[2016/10/07 21:52:01] [ info] [engine] started
+...
 [0] cpu.0: [1475898721, {"cpu_p"=>0.500000, "user_p"=>0.250000, "system_p"=>0.250000, "cpu0.p_cpu"=>0.000000, "cpu0.p_user"=>0.000000, "cpu0.p_system"=>0.000000, "cpu1.p_cpu"=>0.000000, "cpu1.p_user"=>0.000000, "cpu1.p_system"=>0.000000, "cpu2.p_cpu"=>0.000000, "cpu2.p_user"=>0.000000, "cpu2.p_system"=>0.000000, "cpu3.p_cpu"=>1.000000, "cpu3.p_user"=>0.000000, "cpu3.p_system"=>1.000000}]
 [1] cpu.0: [1475898722, {"cpu_p"=>0.250000, "user_p"=>0.250000, "system_p"=>0.000000, "cpu0.p_cpu"=>0.000000, "cpu0.p_user"=>0.000000, "cpu0.p_system"=>0.000000, "cpu1.p_cpu"=>1.000000, "cpu1.p_user"=>1.000000, "cpu1.p_system"=>0.000000, "cpu2.p_cpu"=>0.000000, "cpu2.p_user"=>0.000000, "cpu2.p_system"=>0.000000, "cpu3.p_cpu"=>0.000000, "cpu3.p_user"=>0.000000, "cpu3.p_system"=>0.000000}]
 [2] cpu.0: [1475898723, {"cpu_p"=>0.750000, "user_p"=>0.250000, "system_p"=>0.500000, "cpu0.p_cpu"=>2.000000, "cpu0.p_user"=>1.000000, "cpu0.p_system"=>1.000000, "cpu1.p_cpu"=>0.000000, "cpu1.p_user"=>0.000000, "cpu1.p_system"=>0.000000, "cpu2.p_cpu"=>1.000000, "cpu2.p_user"=>0.000000, "cpu2.p_system"=>1.000000, "cpu3.p_cpu"=>0.000000, "cpu3.p_user"=>0.000000, "cpu3.p_system"=>0.000000}]
 [3] cpu.0: [1475898724, {"cpu_p"=>1.000000, "user_p"=>0.750000, "system_p"=>0.250000, "cpu0.p_cpu"=>1.000000, "cpu0.p_user"=>1.000000, "cpu0.p_system"=>0.000000, "cpu1.p_cpu"=>2.000000, "cpu1.p_user"=>1.000000, "cpu1.p_system"=>1.000000, "cpu2.p_cpu"=>1.000000, "cpu2.p_user"=>1.000000, "cpu2.p_system"=>0.000000, "cpu3.p_cpu"=>1.000000, "cpu3.p_user"=>1.000000, "cpu3.p_system"=>0.000000}]
+...
 ```
-
-No more, no less, it just works.
-
diff --git a/pipeline/outputs/syslog.md b/pipeline/outputs/syslog.md
index 8c5b56c91..3af36f1e1 100644
--- a/pipeline/outputs/syslog.md
+++ b/pipeline/outputs/syslog.md
@@ -1,92 +1,93 @@
 # Syslog
 
-The Syslog output plugin allows you to deliver messages to Syslog servers. It supports RFC3164 and RFC5424 formats through different transports such as UDP, TCP or TLS.
+The _Syslog_ output plugin lets you deliver messages to Syslog servers. It supports RFC3164 and RFC5424 formats through different transports such as UDP, TCP, or TLS.
 
-As of Fluent Bit v1.5.3 the configuration is very strict.
-You must be aware of the structure of your original record so you can configure the plugin to use specific keys to compose your outgoing Syslog message.
-
-> Future versions of Fluent Bit are expanding this plugin feature set to support better handling of keys and message composing.
-
-## Configuration Parameters
+## Configuration parameters
 
 | Key | Description | Default |
-| :--- | :--- | :--- |
-| host | Domain or IP address of the remote Syslog server. | 127.0.0.1 |
-| port | TCP or UDP port of the remote Syslog server. | 514 |
-| mode | Desired transport type. Available options are `tcp` and `udp`. | udp |
-| syslog\_format | The Syslog protocol format to use. Available options are `rfc3164` and `rfc5424`. | rfc5424 |
-| syslog\_maxsize | The maximum size allowed per message. The value must be an integer representing the number of bytes allowed. If no value is provided, the default size is set depending of the protocol version specified by `syslog_format`.<br><br>`rfc3164` sets max size to 1024 bytes.<br><br>`rfc5424` sets the size to 2048 bytes. |  |
-| syslog\_severity\_key | The key name from the original record that contains the Syslog severity number. This configuration is optional. |  |
-| syslog\_severity\_preset | The preset severity number. It will be overwritten if `syslog_severity_key` is set and a key of a record is matched. This configuration is optional. | 6 |
-| syslog\_facility\_key | The key name from the original record that contains the Syslog facility number. This configuration is optional. |  |
-| syslog\_facility\_preset | The preset facility number. It will be overwritten if `syslog_facility_key` is set and a key of a record is matched. This configuration is optional. | 1 |
-| syslog\_hostname\_key | The key name from the original record that contains the hostname that generated the message. This configuration is optional. |  |
-| syslog\_hostname\_preset | The preset hostname. It will be overwritten if `syslog_hostname_key` is set and a key of a record is matched. This configuration is optional. | |
-| syslog\_appname\_key | The key name from the original record that contains the application name that generated the message. This configuration is optional. |  |
-| syslog\_appname\_preset | The preset application name. It will be overwritten if `syslog_appname_key` is set and a key of a record is matched. This configuration is optional. | |
-| syslog\_procid\_key | The key name from the original record that contains the Process ID that generated the message. This configuration is optional. |  |
-| syslog\_procid\_preset | The preset process ID. It will be overwritten if `syslog_procid_key` is set and a key of a record is matched. This configuration is optional. | |
-| syslog\_msgid\_key | The key name from the original record that contains the Message ID associated to the message. This configuration is optional. |  |
-| syslog\_msgid\_preset | The preset message ID. It will be overwritten if `syslog_msgid_key` is set and a key of a record is matched. This configuration is optional. | |
-| syslog\_sd\_key | The key name from the original record that contains a map of key/value pairs to use as Structured Data \(SD\) content. The key name is included in the resulting SD field as shown in examples below. This configuration is optional. |  |
-| syslog\_message\_key | The key name from the original record that contains the message to deliver. Note that this property is **mandatory**, otherwise the message will be empty. |  |
-| allow\_longer\_sd\_id| If true, Fluent-bit allows SD-ID that is longer than 32 characters. Such long SD-ID violates RFC 5424.| false |
+| --- | ----------- | ------- |
+| `host` | Domain or IP address of the remote Syslog server. | `127.0.0.1` |
+| `port` | TCP or UDP port of the remote Syslog server. | `514` |
+| `mode` | Desired transport type. Available options are `tcp` and `udp`. | `udp` |
+| `syslog_format` | The Syslog protocol format to use. Available options are `rfc3164` and `rfc5424`. | `rfc5424` |
+| `syslog_maxsize` | The maximum size allowed per message. The value must be an integer representing the number of bytes allowed. If no value is provided, the default size is set depending of the protocol version specified by `syslog_format`. The value `rfc3164` sets max size to 1024 bytes, and `rfc5424` sets the size to 2048 bytes. | _none_ |
+| `syslog_severity_key` | Optional. The key name from the original record that contains the Syslog severity number. | _none_ |
+| `syslog_severity_preset` | Optional. The preset severity number. It will be overwritten if `syslog_severity_key` is set and a key of a record is matched. | `6` |
+| `syslog_facility_key` | Optional. The key name from the original record that contains the Syslog facility number. | _none_ |
+| `syslog_facility_preset` | Optional. The preset facility number. It will be overwritten if `syslog_facility_key` is set and a key of a record is matched. | `1` |
+| `syslog_hostname_key` | Optional. The key name from the original record that contains the hostname that generated the message. | _none_ |
+| `syslog_hostname_preset` | Optional. The preset hostname. It will be overwritten if `syslog_hostname_key` is set and a key of a record is matched. | _none_ |
+| `syslog_appname_key` | Optional. The key name from the original record that contains the application name that generated the message. | _none_ |
+| `syslog_appname_preset` | Optional. The preset application name. It will be overwritten if `syslog_appname_key` is set and a key of a record is matched. | _none_ |
+| `syslog_procid_key` | Optional. The key name from the original record that contains the Process ID that generated the message. | _none_ |
+| `syslog_procid_preset` | Optional. The preset process ID. It will be overwritten if `syslog_procid_key` is set and a key of a record is matched. | _none_ |
+| `syslog_msgid_key` | Optional. The key name from the original record that contains the Message ID associated to the message. | _none_ |
+| `syslog_msgid_preset` | Optional. The preset message ID. It will be overwritten if `syslog_msgid_key` is set and a key of a record is matched. | _none_ |
+| `syslog_sd_key` | Optional. The key name from the original record that contains a map of key/value pairs to use as Structured Data \(SD\) content. The key name is included in the resulting SD field as shown in the examples in this doc. | _none_ |
+| `syslog_message_key` | Required. The key name from the original record that contains the message to deliver. | _none_ |
+| `allow_longer_sd_id` | If `true`, Fluent Bit allows SD-ID values longer than 32 characters. SD-ID values that exceed 32 characters violate RFC5424 standards. | `false` |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
 ### TLS / SSL
 
-The Syslog output plugin supports TLS/SSL.
-For more details about the properties available and general configuration, please refer to the [TLS/SSL](../../administration/transport-security.md) section.
+The Syslog output plugin supports TLS/SSL. For more details about the properties available and general configuration, see [TLS/SSL](../../administration/transport-security.md).
 
 ## Examples
 
-### Configuration File
+### Configuration file
 
 Get started quickly with this configuration file:
 
 {% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+
+  outputs:
+    - name: syslog
+      match: "*"
+      host: syslog.yourserver.com
+      port: 514
+      mode: udp
+      syslog_format: rfc5424
+      syslog_maxsize: 2048
+      syslog_severity_key: severity
+      syslog_facility_key: facility
+      syslog_hostname_key: hostname
+      syslog_appname_key: appname
+      syslog_procid_key: procid
+      syslog_msgid_key: msgid
+      syslog_sd_key: sd
+      syslog_message_key: message
+```
+
+{% endtab %}
 {% tab title="fluent-bit.conf" %}
+
 ```text
 [OUTPUT]
-    name                 syslog
-    match                *
-    host                 syslog.yourserver.com
-    port                 514
-    mode                 udp
-    syslog_format        rfc5424
-    syslog_maxsize       2048
-    syslog_severity_key  severity
-    syslog_facility_key  facility
-    syslog_hostname_key  hostname
-    syslog_appname_key   appname
-    syslog_procid_key    procid
-    syslog_msgid_key     msgid
-    syslog_sd_key        sd
-    syslog_message_key   message
-```
-{% endtab %}
-{% tab title="fluent-bit.yaml" %}
-```yaml
-    outputs:
-        - name: syslog
-          match: "*"
-          host: syslog.yourserver.com
-          port: 514
-          mode: udp
-          syslog_format: rfc5424
-          syslog_maxsize: 2048
-          syslog_severity_key: severity
-          syslog_facility_key: facility
-          syslog_hostname_key: hostname
-          syslog_appname_key: appname
-          syslog_procid_key: procid
-          syslog_msgid_key: msgid
-          syslog_sd_key: sd
-          syslog_message_key: message
+  name                 syslog
+  match                *
+  host                 syslog.yourserver.com
+  port                 514
+  mode                 udp
+  syslog_format        rfc5424
+  syslog_maxsize       2048
+  syslog_severity_key  severity
+  syslog_facility_key  facility
+  syslog_hostname_key  hostname
+  syslog_appname_key   appname
+  syslog_procid_key    procid
+  syslog_msgid_key     msgid
+  syslog_sd_key        sd
+  syslog_message_key   message
 ```
+
 {% endtab %}
 {% endtabs %}
 
-### Structured Data
+### Structured data
 
 The following is an example of how to configure the `syslog_sd_key` to send Structured Data to the remote Syslog server.
 
@@ -94,42 +95,27 @@ Example log:
 
 ```json
 {
-    "hostname": "myhost",
-    "appname": "myapp",
-    "procid": "1234",
-    "msgid": "ID98",
-    "uls@0": {
-        "logtype": "access",
-        "clustername": "mycluster",
-        "namespace": "mynamespace"
-    },
-    "log": "Sample app log message."
+  "hostname": "myhost",
+  "appname": "myapp",
+  "procid": "1234",
+  "msgid": "ID98",
+  "uls@0": {
+    "logtype": "access",
+    "clustername": "mycluster",
+    "namespace": "mynamespace"
+  },
+  "log": "Sample app log message."
 }
 ```
 
 Example configuration file:
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```text
-[OUTPUT]
-    name                 syslog
-    match                *
-    host                 syslog.yourserver.com
-    port                 514
-    mode                 udp
-    syslog_format        rfc5424
-    syslog_maxsize       2048
-    syslog_hostname_key  hostname
-    syslog_appname_key   appname
-    syslog_procid_key    procid
-    syslog_msgid_key     msgid    
-    syslog_sd_key        uls@0
-    syslog_message_key   log
-```
-{% endtab %}
 {% tab title="fluent-bit.yaml" %}
+
 ```yaml
+pipeline:
+
   outputs:
     - name: syslog
       match: "*"
@@ -145,48 +131,50 @@ Example configuration file:
       syslog_sd_key: uls@0
       syslog_message_key: log
 ```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
+[OUTPUT]
+  name                 syslog
+  match                *
+  host                 syslog.yourserver.com
+  port                 514
+  mode                 udp
+  syslog_format        rfc5424
+  syslog_maxsize       2048
+  syslog_hostname_key  hostname
+  syslog_appname_key   appname
+  syslog_procid_key    procid
+  syslog_msgid_key     msgid
+  syslog_sd_key        uls@0
+  syslog_message_key   log
+```
+
 {% endtab %}
 {% endtabs %}
 
 Example output:
 
-```bash
+```text
+...
 <14>1 2021-07-12T14:37:35.569848Z myhost myapp 1234 ID98 [uls@0 logtype="access" clustername="mycluster" namespace="mynamespace"] Sample app log message.
+...
 ```
 
-### Adding Structured Data Authentication Token
+### Add structured data authentication token
+
+Some services use the structured data field to pass authentication tokens (for example, `[<token>@41018]`), which would need to be added to each log message dynamically. However, this requires setting the token as a key rather than as a value.
 
-Some services use the structured data field to pass authentication tokens (e.g. `[<token>@41018]`), which would need to be added to each log message dynamically. 
-However, this requires setting the token as a key rather than as a value. 
 Here's an example of how that might be achieved, using `AUTH_TOKEN` as a [variable](../../administration/configuring-fluent-bit/classic-mode/variables.md):
 
 {% tabs %}
-{% tab title="fluent-bit.conf" %}
-```text
-[FILTER] 
-    name  lua
-    match *
-    call  append_token
-    code  function append_token(tag, timestamp, record) record["${AUTH_TOKEN}"] = {} return 2, timestamp, record end
-    
-[OUTPUT]
-    name                    syslog
-    match                   *
-    host                    syslog.yourserver.com
-    port                    514
-    mode                    tcp
-    syslog_format           rfc5424
-    syslog_hostname_preset  my-hostname
-    syslog_appname_preset   my-appname
-    syslog_message_key      log
-    allow_longer_sd_id      true
-    syslog_sd_key           ${AUTH_TOKEN}
-    tls                     on
-    tls.crt_file            /path/to/my.crt
-```
-{% endtab %}
 {% tab title="fluent-bit.yaml" %}
+
 ```yaml
+pipeline:
+
   filters:
     - name:  lua
       match: "*"
@@ -212,5 +200,32 @@ Here's an example of how that might be achieved, using `AUTH_TOKEN` as a [variab
       tls: on
       tls.crt_file: /path/to/my.crt
 ```
+
 {% endtab %}
-{% endtabs %}
\ No newline at end of file
+{% tab title="fluent-bit.conf" %}
+
+```text
+[FILTER]
+  name  lua
+  match *
+  call  append_token
+  code  function append_token(tag, timestamp, record) record["${AUTH_TOKEN}"] = {} return 2, timestamp, record end
+
+[OUTPUT]
+  name                    syslog
+  match                   *
+  host                    syslog.yourserver.com
+  port                    514
+  mode                    tcp
+  syslog_format           rfc5424
+  syslog_hostname_preset  my-hostname
+  syslog_appname_preset   my-appname
+  syslog_message_key      log
+  allow_longer_sd_id      true
+  syslog_sd_key           ${AUTH_TOKEN}
+  tls                     on
+  tls.crt_file            /path/to/my.crt
+```
+
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/outputs/tcp-and-tls.md b/pipeline/outputs/tcp-and-tls.md
index 545063593..2e13036a5 100644
--- a/pipeline/outputs/tcp-and-tls.md
+++ b/pipeline/outputs/tcp-and-tls.md
@@ -1,62 +1,70 @@
-# TCP & TLS
+# TCP and TLS
 
-The **tcp** output plugin allows to send records to a remote TCP server. The payload can be formatted in different ways as required.
+The _TCP and TLS_ output plugin lets you send records to a remote TCP server. The payload can be formatted in different ways as required.
 
-## Configuration Parameters
+## Configuration parameters
 
-| Key | Description | default |
-| :--- | :--- | :--- |
-| Host | Target host where Fluent-Bit or Fluentd are listening for Forward messages. | 127.0.0.1 |
-| Port | TCP Port of the target service. | 5170 |
-| Format | Specify the data format to be printed. Supported formats are _msgpack_ _json_, _json\_lines_ and _json\_stream_. | msgpack |
-| json\_date\_key | Specify the name of the time key in the output record. To disable the time key just set the value to `false`. | date |
-| json\_date\_format | Specify the format of the date. Supported formats are _double_, _epoch_, _iso8601_ (eg: _2018-05-30T09:39:52.000681Z_) and _java_sql_timestamp_ (eg: _2018-05-30 09:39:52.000681_) | double |
-| Workers | Enables dedicated thread(s) for this output. Default value is set since version 1.8.13. For previous versions is 0. | 2 |
+This plugin supports the following parameters:
 
-## TLS Configuration Parameters
+| Key | Description | Default |
+|:--- |:----------- |:------- |
+| `Host` | Target host where Fluent Bit or Fluentd are listening for Forward messages. | `127.0.0.1` |
+| `Port` | TCP Port of the target service. | `5170` |
+| `Format` | Specify the data format to be printed. Supported formats: `msgpack`, `json`, `json_lines`, `json_stream`. | `msgpack` |
+| `json_date_key`| Specify the name of the time key in the output record. To disable the time key, set the value to `false`. | `date` |
+| `json_date_format` | Specify the format of the date. Supported formats: `double`, `epoch`, `iso8601`, `java_sql_timestamp`. | `double` |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `2` |
+
+## TLS configuration parameters
 
 The following parameters are available to configure a secure channel connection through TLS:
 
 | Key | Description | Default |
-| :--- | :--- | :--- |
-| tls | Enable or disable TLS support | Off |
-| tls.verify | Force certificate validation | On |
-| tls.debug | Set TLS debug verbosity level. It accept the following values: 0 \(No debug\), 1 \(Error\), 2 \(State change\), 3 \(Informational\) and 4 Verbose | 1 |
-| tls.ca\_file | Absolute path to CA certificate file |  |
-| tls.crt\_file | Absolute path to Certificate file. |  |
-| tls.key\_file | Absolute path to private Key file. |  |
-| tls.key\_passwd | Optional password for tls.key\_file file. |  |
+|:--- |:----------- |:------- |
+| `tls` | Enable or disable TLS support. | `Off` |
+| `tls.verify` | Force certificate validation. | `On` |
+| `tls.debug` | Set TLS debug verbosity level. Allowed values: `0` (No debug), `1` (Error), `2` (State change), `3` (Informational), `4` (Verbose) | `1` |
+| `tls.ca_file` | Absolute path to CA certificate file. | _none_ |
+| `tls.crt_file`   | Absolute path to Certificate file. | _none_ |
+| `tls.key_file`   | Absolute path to private Key file. | _none_ |
+| `tls.key_passwd` | Optional password for `tls.key_file` file. | _none_ |
 
-### Command Line
+### Command line
 
 #### JSON format
 
-```bash
-$ bin/fluent-bit -i cpu -o tcp://127.0.0.1:5170 -p format=json_lines -v
+This example specifies gathering [CPU](https://docs.fluentbit.io/manual/pipeline/inputs/cpu-metrics) usage metrics and send them in JSON lines mode to a remote endpoint using netcat service.
+
+```shell
+fluent-bit -i cpu -o tcp://127.0.0.1:5170 -p format=json_lines -v
 ```
 
-We have specified to gather [CPU](https://github.com/fluent/fluent-bit-docs/tree/16f30161dc4c79d407cd9c586a0c6839d0969d97/pipeline/input/cpu.md) usage metrics and send them in JSON lines mode to a remote end-point using netcat service.
 
-Run the following in a separate terminal, `netcat` will start listening for messages on TCP port 5170.
-Once it connects to Fluent Bit ou should see the output as above in JSON format:
+Run the following in a separate terminal, `netcat` will start listening for messages on TCP port `5170`. After it connects to Fluent Bit you should see the output in JSON format:
 
-```bash
-$ nc -l 5170
+```shell
+nc -l 5170
+```
+
+Which returns results similar to:
+
+```text
+...
 {"date":1644834856.905985,"cpu_p":1.1875,"user_p":0.5625,"system_p":0.625,"cpu0.p_cpu":0.0,"cpu0.p_user":0.0,"cpu0.p_system":0.0,"cpu1.p_cpu":1.0,"cpu1.p_user":1.0,"cpu1.p_system":0.0,"cpu2.p_cpu":4.0,"cpu2.p_user":2.0,"cpu2.p_system":2.0,"cpu3.p_cpu":1.0,"cpu3.p_user":0.0,"cpu3.p_system":1.0,"cpu4.p_cpu":1.0,"cpu4.p_user":0.0,"cpu4.p_system":1.0,"cpu5.p_cpu":1.0,"cpu5.p_user":1.0,"cpu5.p_system":0.0,"cpu6.p_cpu":0.0,"cpu6.p_user":0.0,"cpu6.p_system":0.0,"cpu7.p_cpu":3.0,"cpu7.p_user":1.0,"cpu7.p_system":2.0,"cpu8.p_cpu":0.0,"cpu8.p_user":0.0,"cpu8.p_system":0.0,"cpu9.p_cpu":1.0,"cpu9.p_user":0.0,"cpu9.p_system":1.0,"cpu10.p_cpu":1.0,"cpu10.p_user":0.0,"cpu10.p_system":1.0,"cpu11.p_cpu":0.0,"cpu11.p_user":0.0,"cpu11.p_system":0.0,"cpu12.p_cpu":0.0,"cpu12.p_user":0.0,"cpu12.p_system":0.0,"cpu13.p_cpu":3.0,"cpu13.p_user":2.0,"cpu13.p_system":1.0,"cpu14.p_cpu":1.0,"cpu14.p_user":1.0,"cpu14.p_system":0.0,"cpu15.p_cpu":0.0,"cpu15.p_user":0.0,"cpu15.p_system":0.0}
+...
 ```
 
-#### Msgpack format
+#### `msgpack` format
 
 Repeat the JSON approach but using the `msgpack` output format.
 
-```bash
-$ bin/fluent-bit -i cpu -o tcp://127.0.0.1:5170 -p format=msgpack -v
-
+```shell
+fluent-bit -i cpu -o tcp://127.0.0.1:5170 -p format=msgpack -v
 ```
 
-We could send this to stdout but as it is a serialized format you would end up with strange output.
-This should really be handled by a msgpack receiver to unpack as per the details in the developer documentation [here](../../development/msgpack-format.md).
-As an example we use the [Python msgpack library](https://msgpack.org/#languages) to deal with it:
+You could send this to stdout but as it's a serialized format you would end up with strange output.
+
+This should be handled by a [`msgpack`](../../development/msgpack-format.md) receiver to unpack. The following example uses the [Python `msgpack` library](https://msgpack.org/#languages) handle it:
 
 ```python
 #Python3
@@ -79,9 +87,17 @@ while True:
         print(unpacked)
 ```
 
-```bash
-$ pip install msgpack
-$ python3 test.py
-(ExtType(code=0, data=b'b\n5\xc65\x05\x14\xac'), {'cpu_p': 0.1875, 'user_p': 0.125, 'system_p': 0.0625, 'cpu0.p_cpu': 0.0, 'cpu0.p_user': 0.0, 'cpu0.p_system': 0.0, 'cpu1.p_cpu': 0.0, 'cpu1.p_user': 0.0, 'cpu1.p_system': 0.0, 'cpu2.p_cpu': 1.0, 'cpu2.p_user': 0.0, 'cpu2.p_system': 1.0, 'cpu3.p_cpu': 0.0, 'cpu3.p_user': 0.0, 'cpu3.p_system': 0.0, 'cpu4.p_cpu': 0.0, 'cpu4.p_user': 0.0, 'cpu4.p_system': 0.0, 'cpu5.p_cpu': 0.0, 'cpu5.p_user': 0.0, 'cpu5.p_system': 0.0, 'cpu6.p_cpu': 0.0, 'cpu6.p_user': 0.0, 'cpu6.p_system': 0.0, 'cpu7.p_cpu': 0.0, 'cpu7.p_user': 0.0, 'cpu7.p_system': 0.0, 'cpu8.p_cpu': 0.0, 'cpu8.p_user': 0.0, 'cpu8.p_system': 0.0, 'cpu9.p_cpu': 1.0, 'cpu9.p_user': 1.0, 'cpu9.p_system': 0.0, 'cpu10.p_cpu': 0.0, 'cpu10.p_user': 0.0, 'cpu10.p_system': 0.0, 'cpu11.p_cpu': 0.0, 'cpu11.p_user': 0.0, 'cpu11.p_system': 0.0, 'cpu12.p_cpu': 0.0, 'cpu12.p_user': 0.0, 'cpu12.p_system': 0.0, 'cpu13.p_cpu': 0.0, 'cpu13.p_user': 0.0, 'cpu13.p_system': 0.0, 'cpu14.p_cpu': 0.0, 'cpu14.p_user': 0.0, 'cpu14.p_system': 0.0, 'cpu15.p_cpu': 0.0, 'cpu15.p_user': 0.0, 'cpu15.p_system': 0.0})
+Run the following commands:
+
+```shell
+ pip install msgpack
+ python3 test.py
+```
+
+Which return results like:
 
+```text
+...
+(ExtType(code=0, data=b'b\n5\xc65\x05\x14\xac'), {'cpu_p': 0.1875, 'user_p': 0.125, 'system_p': 0.0625, 'cpu0.p_cpu': 0.0, 'cpu0.p_user': 0.0, 'cpu0.p_system': 0.0, 'cpu1.p_cpu': 0.0, 'cpu1.p_user': 0.0, 'cpu1.p_system': 0.0, 'cpu2.p_cpu': 1.0, 'cpu2.p_user': 0.0, 'cpu2.p_system': 1.0, 'cpu3.p_cpu': 0.0, 'cpu3.p_user': 0.0, 'cpu3.p_system': 0.0, 'cpu4.p_cpu': 0.0, 'cpu4.p_user': 0.0, 'cpu4.p_system': 0.0, 'cpu5.p_cpu': 0.0, 'cpu5.p_user': 0.0, 'cpu5.p_system': 0.0, 'cpu6.p_cpu': 0.0, 'cpu6.p_user': 0.0, 'cpu6.p_system': 0.0, 'cpu7.p_cpu': 0.0, 'cpu7.p_user': 0.0, 'cpu7.p_system': 0.0, 'cpu8.p_cpu': 0.0, 'cpu8.p_user': 0.0, 'cpu8.p_system': 0.0, 'cpu9.p_cpu': 1.0, 'cpu9.p_user': 1.0, 'cpu9.p_system': 0.0, 'cpu10.p_cpu': 0.0, 'cpu10.p_user': 0.0, 'cpu10.p_system': 0.0, 'cpu11.p_cpu': 0.0, 'cpu11.p_user': 0.0, 'cpu11.p_system': 0.0, 'cpu12.p_cpu': 0.0, 'cpu12.p_user': 0.0, 'cpu12.p_system': 0.0, 'cpu13.p_cpu': 0.0, 'cpu13.p_user': 0.0, 'cpu13.p_system': 0.0, 'cpu14.p_cpu': 0.0, 'cpu14.p_user': 0.0, 'cpu14.p_system': 0.0, 'cpu15.p_cpu': 0.0, 'cpu15.p_user': 0.0, 'cpu15.p_system': 0.0})
+...
 ```
diff --git a/pipeline/outputs/treasure-data.md b/pipeline/outputs/treasure-data.md
index ff2a070bf..8799fbf12 100644
--- a/pipeline/outputs/treasure-data.md
+++ b/pipeline/outputs/treasure-data.md
@@ -1,44 +1,68 @@
 # Treasure Data
 
-The **td** output plugin, allows to flush your records into the [Treasure Data](http://treasuredata.com) cloud service.
+The _Treasure Data_ (TD) output plugin lets you flush your records into the [Treasure Data](http://treasuredata.com) cloud service.
 
-## Configuration Parameters
+## Configuration parameters
 
 The plugin supports the following configuration parameters:
 
 | Key | Description | Default |
-| :--- | :--- | :--- |
-| API | The [Treasure Data](http://treasuredata.com) API key. To obtain it please log into the [Console](https://console.treasuredata.com) and in the API keys box, copy the API key hash. |  |
-| Database | Specify the name of your target database. |  |
-| Table | Specify the name of your target table where the records will be stored. |  |
-| Region | Set the service region, available values: US and JP | US |
+|:--- |:----------- |:--------|
+| `API` | The Treasure Data API key. To obtain it, log into the [Console](https://console.treasuredata.com) and in the API keys box, copy the API key hash. | _none_ |
+| `Database` | Specify the name of your target database. | _none_ |
+| `Table` | Specify the name of your target table where the records will be stored. | _none_ |
+| `Region` | Set the service region. Allowed values: `US`, `JP`. | `US` |
+| `Workers`  | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
-## Getting Started
+## Get started
 
-In order to start inserting records into [Treasure Data](https://www.treasuredata.com), you can run the plugin from the command line or through the configuration file:
+To start inserting records into Treasure Data, run the plugin from the command line or through the configuration file.
 
-### Command Line:
+### Command line
 
-```bash
-$ fluent-bit -i cpu -o td -p API="abc" -p Database="fluentbit" -p Table="cpu_samples"
+You can run the plugin from the command line, but it exposes your API key. Using a configuration file is recommended.
+
+```shell
+fluent-bit -i cpu -o td -p API="abc" -p Database="fluentbit" -p Table="cpu_samples"
 ```
 
-Ideally you don't want to expose your API key from the command line, using a configuration file is highly desired.
+### Configuration file
+
+In your main configuration file append the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: my_cpu
+
+  outputs:
+    - name: td
+      match: '*'
+      api: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
+      database: fluentbit
+      table: cpu_samples
+```
 
-### Configuration File
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
-In your main configuration file append the following _Input_ & _Output_ sections:
 
-```python
+```text
 [INPUT]
-    Name cpu
-    Tag  my_cpu
+  Name cpu
+  Tag  my_cpu
 
 [OUTPUT]
-    Name     td
-    Match    *
-    API      5713/e75be23caee19f8041dfa635ddfbd0dcd8c8d981
-    Database fluentbit
-    Table    cpu_samples
+  Name     td
+  Match    *
+  API      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+  Database fluentbit
+  Table    cpu_samples
 ```
 
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/outputs/vivo-exporter.md b/pipeline/outputs/vivo-exporter.md
index 69c00dfcb..dbaa14d57 100644
--- a/pipeline/outputs/vivo-exporter.md
+++ b/pipeline/outputs/vivo-exporter.md
@@ -2,75 +2,122 @@
 
 Vivo Exporter is an output plugin that exposes logs, metrics, and traces through an HTTP endpoint. This plugin aims to be used in conjunction with [Vivo project](https://github.com/calyptia/vivo) .
 
-### Configuration Parameters
+## Configuration parameters
 
-| Key                      | Description                                                                                                                            | Default |
-| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| `empty_stream_on_read`   | If enabled, when an HTTP client consumes the data from a stream, the stream content will be removed.                                   | Off     |
-| `stream_queue_size`      | Specify the maximum queue size per stream. Each specific stream for logs, metrics and traces can hold up to `stream_queue_size` bytes. | 20M     |
-| `http_cors_allow_origin` | Specify the value for the HTTP Access-Control-Allow-Origin header (CORS).                                                              |         |
+This plugin supports the following configuration parameters:
 
-### Getting Started
+| Key | Description | Default |
+| --- | ----------- | ---------|
+| `empty_stream_on_read` | If enabled, when an HTTP client consumes the data from a stream, the stream content will be removed. | `Off` |
+| `stream_queue_size`| Specify the maximum queue size per stream. Each specific stream for logs, metrics, and traces can hold up to `stream_queue_size` bytes. | `20M` |
+| `http_cors_allow_origin` | Specify the value for the HTTP `Access-Control-Allow-Origin` header (CORS). | _none_ |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `1` |
 
-Here is a simple configuration of Vivo Exporter, note that this example is not based on defaults.
+### Get started
 
-```python
+The following is an example configuration of Vivo Exporter. This example isn't based on defaults.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      tag: events
+      rate: 2
+
+  outputs:
+    - name: vivo_exporter
+      match: '*'
+      empty_stream_on_read: off
+      stream_queue_size: 20M
+      http_cors_allow_origin: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    name  dummy
-    tag   events
-    rate  2
+  name  dummy
+  tag   events
+  rate  2
 
 [OUTPUT]
-    name                   vivo_exporter
-    match                  *
-    empty_stream_on_read   off
-    stream_queue_size      20M
-     http_cors_allow_origin *
+  name                   vivo_exporter
+  match                  *
+  empty_stream_on_read   off
+  stream_queue_size      20M
+  http_cors_allow_origin *
 ```
 
+{% endtab %}
+{% endtabs %}
+
 ### How it works
 
-Vivo Exporter provides buffers that serve as streams for each telemetry data type, in this case, `logs`, `metrics`, and `traces`. Each buffer contains a fixed capacity in terms of size (20M by default). When the data arrives at a stream, it’s appended to the end. If the buffer is full, it removes the older entries to make room for new data.
+Vivo Exporter provides buffers that serve as streams for each telemetry data type, in this case, `logs`, `metrics`, and `traces`. Each buffer contains a fixed capacity in terms of size (`20M` by default). When the data arrives at a stream, it's appended to the end. If the buffer is full, it removes the older entries to make room for new data.
 
-The `data` that arrives is a `chunk`. A chunk is a group of events that belongs to the same type (logs, metrics or traces) and contains the same `tag`. Every chunk placed in a stream is assigned with an auto-incremented `id`.
+The `data` that arrives is a `chunk`. A chunk is a group of events that belongs to the same type (logs, metrics, or traces) and contains the same `tag`. Every chunk placed in a stream is assigned with an auto-incremented `id`.
 
 #### Requesting data from the streams
 
-By using a simple HTTP request, you can retrieve the data from the streams. The following are the endpoints available:
+By using an HTTP request, you can retrieve the data from the streams. The following are the endpoints available:
 
 | endpoint   | Description                                                                                                                   |
-| ---------- | ----------------------------------------------------------------------------------------------------------------------------- |
+|------------|-------------------------------------------------------------------------------------------------------------------------------|
 | `/logs`    | Exposes log events in JSON format. Each event contains a timestamp, metadata and the event content.                           |
 | `/metrics` | Exposes metrics events in JSON format. Each metric contains name, metadata, metric type and labels (dimensions).              |
-| `/traces`  | Exposes traces events in JSON format. Each trace contains a name, resource spans, spans, attributes, events information, etc. |
+| `/traces`  | Exposes trace events in JSON format. Each trace contains a name, resource spans, spans, attributes, events information, and so on. |
 
-The example below will generate dummy log events which will be consuming by using `curl` HTTP command line client:
+The following example generates dummy log events for consumption by using `curl` HTTP command line client:
 
-**Configure and start Fluent Bit**
+1. Configure and start Fluent Bit.
 
-```python
-[INPUT]
-    name  dummy
-    tag   events
-    rate  2
+   {% tabs %}
+   {% tab title="fluent-bit.yaml" %}
 
-[OUTPUT]
-    name   vivo_exporter
-    match  *
+   ```yaml
+   pipeline:
+     inputs:
+       - name: dummy
+         tag: events
+         rate: 2
 
-```
+     outputs:
+       - name: vivo_exporter
+         match: '*'
+   ```
 
-**Retrieve the data**
+   {% endtab %}
+   {% tab title="fluent-bit.conf" %}
 
-```bash
-curl -i http://127.0.0.1:2025/logs
-```
+   ```text
+   [INPUT]
+     name  dummy
+     tag   events
+     rate  2
+
+   [OUTPUT]
+     name   vivo_exporter
+     match  *
+   ```
 
-> We are using the `-i` curl option to print also the HTTP response headers.
+   {% endtab %}
+   {% endtabs %}
+
+1. Retrieve the data.
+
+   ```shell
+   curl -i http://127.0.0.1:2025/logs
+   ```
+
+   The `-i` curl option prints the HTTP response headers.
 
 Curl output would look like this:
 
-```bash
+```shell
 HTTP/1.1 200 OK
 Server: Monkey/1.7.0
 Date: Tue, 21 Mar 2023 16:42:28 GMT
@@ -86,35 +133,38 @@ Vivo-Stream-End-ID: 3
 [[1679416947459806000,{"_tag":"events"}],{"message":"dummy"}]
 [[1679416947958777000,{"_tag":"events"}],{"message":"dummy"}]
 [[1679416948459391000,{"_tag":"events"}],{"message":"dummy"}]
+...
 ```
 
 ### Streams and IDs
 
-As mentioned above, on each stream we buffer a `chunk` that contains N events, each chunk contains it own ID which is unique inside the stream.
+As mentioned previously, each stream buffers a `chunk` that contains `N` events, with each chunk containing its own ID that's unique inside the stream.
 
-When we receive the HTTP response, Vivo Exporter also reports the range of chunk IDs that were served in the response via the HTTP headers `Vivo-Stream-Start-ID` and `Vivo-Stream-End-ID`.
+After receiving the HTTP response, Vivo Exporter also reports the range of chunk IDs that were served in the response using the HTTP headers `Vivo-Stream-Start-ID` and `Vivo-Stream-End-ID`.
 
 The values of these headers can be used by the client application to specify a range between IDs or set limits for the number of chunks to retrieve from the stream.
 
 ### Retrieve ranges and use limits
 
-A client might be interested into always retrieve the latest chunks available and skip previous one that already processed. In a first request without any given range, Vivo Exporter will provide all the content that exists in the buffer for the specific stream, on that response the client might want to keep the last ID (Vivo-Stream-End-ID) that was received.
+A client might be interested in always retrieving the latest chunks available and skip previous ones already processed. In a first request without any given range, Vivo Exporter will provide all the content that exists in the buffer for the specific stream. On that response, the client might want to keep the last ID (`Vivo-Stream-End-ID`) that was received.
 
-To query ranges or starting from specific chunks IDs, remember that they are incremental, you can use a mix of the following options:
+To query ranges or starting from specific chunks IDs, remember that they're incremental. You can use a mix of the following options:
 
-| Query string option | Description                                                                                                                                         |
-| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `from`              | Specify the first chunk ID that is desired to be retrieved. Note that if the `chunk` ID does not exists the next one in the queue will be provided. |
-| `to`                | The last chunk ID is desired. If not found, the whole stream will be provided (starting from `from` if was set).                                    |
-| `limit`             | Limit the output to a specific number of chunks. The default value is `0`, which means: send everything.                                            |
+| Query string option | Description |
+|---------------------|-------------|
+| `from` | Specify the first chunk ID to be retrieved. If the `chunk` ID doesn't exist, the next one in the queue will be provided. |
+| `to` | The last chunk ID to be retrieved. If not found, the whole stream will be provided (starting from `from` if was set). |
+| `limit` | Limit the output to a specific number of chunks. The default value is `0`, which sends everything. |
 
-The following example specifies the range from chunk ID 1 to chunk ID 3 and only 1 chunk:
+The following example specifies the range from chunk ID `1` to chunk ID `3` and only one chunk:
 
-`curl -i "http://127.0.0.1:2025/logs?from=1&to=3&limit=1"`&#x20;
+```shell
+curl -i "http://127.0.0.1:2025/logs?from=1&to=3&limit=1"`&#x20;
+```
 
 Output:
 
-```bash
+```shell
 HTTP/1.1 200 OK
 Server: Monkey/1.7.0
 Date: Tue, 21 Mar 2023 16:45:05 GMT
@@ -125,4 +175,5 @@ Vivo-Stream-End-ID: 1
 
 [[1679416945959398000,{"_tag":"events"}],{"message":"dummy"}]
 [[1679416946459271000,{"_tag":"events"}],{"message":"dummy"}]
+...
 ```
diff --git a/pipeline/outputs/websocket.md b/pipeline/outputs/websocket.md
index fc5d4ab08..195d1c3ab 100644
--- a/pipeline/outputs/websocket.md
+++ b/pipeline/outputs/websocket.md
@@ -1,26 +1,29 @@
 # WebSocket
 
-The **websocket** output plugin allows to flush your records into a WebSocket endpoint. For now the functionality is pretty basic and it issues a HTTP GET request to do the handshake, and then use TCP connections to send the data records in either JSON or [MessagePack](http://msgpack.org) \(or JSON\) format.
+The _WebSocket_ output plugin lets you flush your records into a WebSocket endpoint. It issues an HTTP `GET` request to do the handshake, and then uses TCP connections to send the data records in either JSON or [MessagePack](http://msgpack.org) format.
 
-## Configuration Parameters
+## Configuration parameters
 
-| Key | Description | default |
-| :--- | :--- | :--- |
-| Host | IP address or hostname of the target WebSocket Server | 127.0.0.1 |
-| Port | TCP port of the target WebSocket Server | 80 |
-| URI | Specify an optional HTTP URI for the target websocket server, e.g: /something | / |
-| Header | Add a HTTP header key/value pair. Multiple headers can be set. | |
-| Format | Specify the data format to be used in the HTTP request body, by default it uses _msgpack_. Other supported formats are _json_, _json\_stream_ and _json\_lines_ and _gelf_. | msgpack |
-| json\_date\_key | Specify the name of the date field in output | date |
-| json\_date\_format | Specify the format of the date. Supported formats are _double_, _epoch_, _iso8601_ (eg: _2018-05-30T09:39:52.000681Z_) and _java_sql_timestamp_ (eg: _2018-05-30 09:39:52.000681_) | double |
+This plugin supports the following parameters:
 
-## Getting Started
+| Key | Description | Default |
+|:--- |:------------|:----------|
+| `Host` | IP address or hostname of the target WebSocket Server. | `127.0.0.1` |
+| `Port` | TCP port of the target WebSocket Server. | `80` |
+| `URI` | Specify an optional HTTP URI for the target WebSocket server. For example, `/someuri`. | `/` |
+| `Header` | Add a HTTP header key/value pair. Multiple headers can be set.  | _none_ |
+| `Format` | Specify the data format to be used in the HTTP request body. Supported formats: `json`, `json_stream`, `json_lines`, `gelf`. | `msgpack` |
+| `json_date_key` | Specify the name of the date field in output. | `date` |
+| `json_date_format` | Specify the format of the date. Supported formats: `double`, `epoch`, `iso8601`, `java_sql_timestamp`. | `double` |
+| `workers` | The number of [workers](../../administration/multithreading.md#outputs) to perform flush operations for this output. | `0` |
 
-In order to insert records into a HTTP server, you can run the plugin from the command line or through the configuration file:
+## Get started
 
-### Command Line
+To insert records into an HTTP server, you can run the plugin from the command line or through the configuration file.
 
-The **websocket** plugin, can read the parameters from the command line in two ways, through the **-p** argument \(property\) or setting them directly through the service URI. The URI format is the following:
+### Command line
+
+The WebSocket plugin can read the parameters from the command line through the `-p` argument (property) or by setting them directly through the service URI. The URI format is the following:
 
 ```text
 http://host:port/something
@@ -28,73 +31,118 @@ http://host:port/something
 
 Using the format specified, you could start Fluent Bit through:
 
-```text
-$ fluent-bit -i cpu -t cpu -o websocket://192.168.2.3:80/something -m '*'
+```shell
+fluent-bit -i cpu -t cpu -o websocket://192.168.2.3:80/something -m '*'
 ```
 
-### Configuration File
+### Configuration file
+
+In your main configuration file, append the following:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
-In your main configuration file, append the following _Input_ & _Output_ sections:
+```yaml
+pipeline:
+  inputs:
+    - name: cpu
+      tag: cpu
 
-```python
+  outputs:
+    - name: websocket
+      match: '*'
+      host: 192.168.2.3
+      port: 80
+      uri: /something
+      format: json
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
+
+```text
 [INPUT]
-    Name  cpu
-    Tag   cpu
+  Name  cpu
+  Tag   cpu
 
 [OUTPUT]
-    Name  websocket
-    Match *
-    Host  192.168.2.3
-    Port  80
-    URI   /something
-    Format json
+  Name   websocket
+  Match  *
+  Host   192.168.2.3
+  Port   80
+  URI    /something
+  Format json
 ```
 
-Websocket plugin is working with tcp keepalive mode, please refer to [networking](https://docs.fluentbit.io/manual/v/master/administration/networking#configuration-options) section for details. Since websocket is a stateful plugin, it will decide when to send out handshake to server side, for example when plugin just begins to work or after connection with server has been dropped. In general, the interval to init a new websocket handshake would be less than the keepalive interval. With that strategy, it could detect and resume websocket connections.
+{% endtab %}
+{% endtabs %}
 
+For details about how the WebSocket plugin works with TCP keepalive mode, see [networking](https://docs.fluentbit.io/manual/v/master/administration/networking#configuration-options). Because WebSocket is a stateful plugin, it will decide when to send out handshake to server side. For example, when the plugin begins to work or after connection with server has been dropped. In general, the interval to init a new WebSocket handshake would be less than the keepalive interval. With that strategy, it could detect and resume WebSocket connections.
 
-## Testing
+## Tests
 
-### Configuration File
+### Configuration file example
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: tcp
+      listen: 0.0.0.0
+      port: 5170
+      format: json
+
+  outputs:
+    - name: websocket
+      match: '*'
+      host: 127.0.0.1
+      port: 8080
+      uri: /
+      format: json
+      workers: 4
+      net.keepalive: on
+      net.keepalive_idle_timeout: 30
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [INPUT]
-    Name        tcp
-    Listen      0.0.0.0
-    Port        5170
-    Format      json
+  Name        tcp
+  Listen      0.0.0.0
+  Port        5170
+  Format      json
+
 [OUTPUT]
-    Name           websocket
-    Match          *
-    Host           127.0.0.1
-    Port           8080
-    URI            /
-    Format         json
-    workers	   4
-    net.keepalive               on
-    net.keepalive_idle_timeout  30
+  Name           websocket
+  Match          *
+  Host           127.0.0.1
+  Port           8080
+  URI            /
+  Format         json
+  workers	   4
+  net.keepalive               on
+  net.keepalive_idle_timeout  30
 ```
 
-Once Fluent Bit is running, you can send some messages using the _netcat_:
+{% endtab %}
+{% endtabs %}
+
+When Fluent Bit is running, you can send some messages using `netcat`:
 
-```bash
-$ echo '{"key 1": 123456789, "key 2": "abcdefg"}' | nc 127.0.0.1 5170; sleep 35; echo '{"key 1": 123456789, "key 2": "abcdefg"}' | nc 127.0.0.1 5170
+```shell
+echo '{"key 1": 123456789, "key 2": "abcdefg"}' | nc 127.0.0.1 5170; sleep 35; echo '{"key 1": 123456789, "key 2": "abcdefg"}' | nc 127.0.0.1 5170
 ```
 
-In [Fluent Bit](http://fluentbit.io) we should see the following output:
+In [Fluent Bit](http://fluentbit.io) you should see the following output:
 
-```bash
-bin/fluent-bit   -c ../conf/out_ws.conf
-Fluent Bit v1.7.0
-* Copyright (C) 2019-2020 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
+```shell
+fluent-bit   -c ../conf/out_ws.conf
 
-[2021/02/05 22:17:09] [ info] [engine] started (pid=6056)
-[2021/02/05 22:17:09] [ info] [storage] version=1.1.0, initializing...
-[2021/02/05 22:17:09] [ info] [storage] in-memory
-[2021/02/05 22:17:09] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128
+...
 [2021/02/05 22:17:09] [ info] [input:tcp:tcp.0] listening on 0.0.0.0:5170
 [2021/02/05 22:17:09] [ info] [out_ws] we have following parameter /, 127.0.0.1, 8080, 25
 [2021/02/05 22:17:09] [ info] [output:websocket:websocket.0] worker #1 started
@@ -117,10 +165,11 @@ Fluent Bit v1.7.0
 [2021/02/05 22:18:27] [ info] [output:websocket:websocket.0] thread worker #3 stopping...
 [2021/02/05 22:18:27] [ info] [output:websocket:websocket.0] thread worker #3 stopped
 [2021/02/05 22:18:27] [ info] [out_ws] flb_ws_conf_destroy
+...
 ```
 
-### Scenario Description
+### Scenario description
 
-From the output of fluent-bit log, we see that once data has been ingested into fluent bit, plugin would perform handshake. After a while, no data or traffic is undergoing, tcp connection would been abort. And then another piece of data arrived, a retry for websocket plugin has been triggered, with another handshake and data flush.
+From the output of the Fluent Bit log, you can see that when data has been ingested into Fluent Bit, the plugin performs a handshake. If no data or traffic is ongoing, the TCP connection would be aborted. When additional data arrives, a retry for WebSocket plugin triggers, with another handshake and data flush.
 
-There is another scenario, once websocket server flaps in a short time, which means it goes down and up in a short time, fluent-bit would resume tcp connection immediately. But in that case, websocket output plugin is a malfunction state, it needs to restart fluent-bit to get back to work.
+In another scenario, if the WebSocket server goes down and up in a short time, Fluent Bit would resume the TCP connection immediately. But in that case, the WebSocket output plugin is a malfunction state, and needs to restart Fluent Bit to resume working.
diff --git a/pipeline/parsers/configuring-parser.md b/pipeline/parsers/configuring-parser.md
index 43c7de0cb..d993a72aa 100644
--- a/pipeline/parsers/configuring-parser.md
+++ b/pipeline/parsers/configuring-parser.md
@@ -1,73 +1,239 @@
-# Configuring Parser
+# Configuring parsers
 
-Parsers are an important component of [Fluent Bit](http://fluentbit.io), with them you can take any unstructured log entry and give them a structure that makes easier it processing and further filtering.
+You can use parsers to transform unstructured log entries into structured log entries, which makes it easier to process and further filter those logs.
 
-The parser engine is fully configurable and can process log entries based in two types of format:
+The parser engine is fully configurable and can process log entries based in two formats:
 
-* [JSON Maps](json.md)
-* [Regular Expressions](regular-expression.md) \(named capture\)
+- [JSON maps](json.md)
+- [Regular expressions](regular-expression.md) (named capture)
 
-By default, Fluent Bit provides a set of pre-configured parsers that can be used for different use cases such as logs from:
+By default, Fluent Bit provides a set of pre-configured parsers that can be used for different use cases, such as logs from:
 
-* Apache
-* Nginx
-* Docker
-* Syslog rfc5424
-* Syslog rfc3164
+- Apache
+- NGINX
+- Docker
+- Syslog rfc5424
+- Syslog rfc3164
 
-Parsers are defined in one or multiple configuration files that are loaded at start time, either from the command line or through the main Fluent Bit configuration file.
+Parsers are defined in one or more configuration files that are loaded at start time, either from the command line or through the main Fluent Bit configuration file.
 
-Note: If you are using Regular Expressions note that Fluent Bit uses Ruby based regular expressions and we encourage to use [Rubular](http://www.rubular.com) web site as an online editor to test them.
+{% hint style="info" %}
 
-## Configuration Parameters
+Fluent Bit uses Ruby-based regular expressions. You can use [Rubular](http://www.rubular.com) to test your regular expressions for Ruby compatibility.
+
+{% endhint %}
+
+## Configuration parameters
 
 Multiple parsers can be defined and each section has it own properties. The following table describes the available options for each parser definition:
 
 | Key | Description |
-| :--- | :--- |
-| Name | Set an unique name for the parser in question. |
-| Format | Specify the format of the parser, the available options here are: [json](json.md), [regex](regular-expression.md), [ltsv](ltsv.md) or [logfmt](logfmt.md). |
-| Regex | If format is _regex_, this option _must_ be set specifying the Ruby Regular Expression that will be used to parse and compose the structured message. |
-| Time\_Key | If the log entry provides a field with a timestamp, this option specifies the name of that field. |
-| Time\_Format | Specify the format of the time field so it can be recognized and analyzed properly. Fluent-bit uses `strptime(3)` to parse time so you can refer to [strptime documentation](https://linux.die.net/man/3/strptime) for available modifiers. |
-| Time\_Offset | Specify a fixed UTC time offset \(e.g. -0600, +0200, etc.\) for local dates. |
-| Time\_Keep | By default when a time key is recognized and parsed, the parser will drop the original time field. Enabling this option will make the parser to keep the original time field and it value in the log entry. |
-| Types | Specify the data type of parsed field. The syntax is `types <field_name_1>:<type_name_1> <field_name_2>:<type_name_2> ...`. The supported types are `string`\(default\), `integer`, `bool`, `float`, `hex`. The option is supported by `ltsv`, `logfmt` and `regex`. |
-| Decode\_Field | Decode a field value, the only decoder available is `json`. The syntax is: `Decode_Field json <field_name>`. |
-| Skip\_Empty\_Values | Specify a boolean which determines if the parser should skip empty values. The default is `true`. |
-| Time_Strict | The default value (`true`) tells the parser to be strict with the expected time format. With this option set to false, the parser will be permissive with the format of the time. This is useful when the format expects time fraction but the time to be parsed doesn't include it.  |
-
-## Parsers Configuration File
-
-All parsers **must** be defined in a _parsers.conf_ file, **not** in the Fluent Bit global configuration file. The parsers file expose all parsers available that can be used by the Input plugins that are aware of this feature. A parsers file can have multiple entries like this:
+| --- | ----------- |
+| `Name` | Sets the name of your parser. |
+| `Format` | Specifies the format of the parser. Possible options: [`json`](json.md), [`regex`](regular-expression.md), [`ltsv`](ltsv.md), or [`logfmt`](logfmt.md). |
+| `Regex` | Required for parsers with the `regex` format. Specifies the Ruby regular expression for parsing and composing the structured message. |
+| `Time_Key` | If the log entry provides a field with a timestamp, this option specifies the name of that field. |
+| `Time_Format` | Specifies the format of the time field so it can be recognized and analyzed properly. Fluent Bit uses `strptime(3)` to parse time. See the [`strptime` documentation](https://linux.die.net/man/3/strptime) for available modifiers. The `%L` field descriptor is supported for fractional seconds. |
+| `Time_Offset` | Specifies a fixed UTC time offset (such as `-0600` or `+0200`) for local dates. |
+| `Time_Keep` | If enabled, when a time key is recognized and parsed, the parser will keep the original time key. If disabled, the parser will drop the original time field. |
+| `Time_System_timezone` | If there is no time zone (`%z`) specified in the given `Time_Format`, enabling this option will make the parser detect and use the system's configured time zone. The configured time zone is detected from the [`TZ` environment variable](https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html). |
+| `Types` | Specifies the data type of parsed field. The syntax is `types <field_name_1>:<type_name_1> <field_name_2>:<type_name_2> ...`. The supported types are `string` (default), `integer`, `bool`, `float`, `hex`. The option is supported by `ltsv`, `logfmt` and `regex`. |
+| `Decode_Field` | If the content can be decoded in a structured message, append the structured message (keys and values) to the original log message. Decoder types: `json`, `escaped`, `escaped_utf8`. The syntax is: `Decode_Field <decoder_type> <field_name>`. See [Decoders](decoders.md) for additional information. |
+| `Decode_Field_As` | Any decoded content (unstructured or structured) will be replaced in the same key/value, and no extra keys are added. Decoder types: `json`, `escaped`, `escaped_utf8`. The syntax is: `Decode_Field_As <decoder_type> <field_name>`. See [Decoders](decoders.md) for additional information. |
+| `Skip_Empty_Values` | Specifies a boolean which determines if the parser should skip empty values. The default is `true`. |
+| `Time_Strict` | The default value (`true`) tells the parser to be strict with the expected time format. With this option set to false, the parser will be permissive with the format of the time. You can use this when the format expects time fraction but the time to be parsed doesn't include it.  |
+
+## Parsers configuration file
+
+All parsers must be defined in a parsers file, not in the Fluent Bit global configuration file. The parsers file exposes all parsers available that can be used by the input plugins that are aware of this feature. A parsers file can have multiple entries, like so:
+
+{% tabs %}
+{% tab title="parsers.yaml" %}
+
+```yaml
+parsers:
+  - name: docker
+    format: json
+    time_key: time
+    time_format: '%Y-%m-%dT%H:%M:%S.%L'
+    time_keep: on
+
+  - name: syslog-rfc5424
+    format: regex
+    regex: '^\<(?<pri>[0-9]{1,5})\>1 (?<time>[^ ]+) (?<host>[^ ]+) (?<ident>[^ ]+) (?<pid>[-0-9]+) (?<msgid>[^ ]+) (?<extradata>(\[(.*)\]|-)) (?<message>.+)$'
+    time_key: time
+    time_format: '%Y-%m-%dT%H:%M:%S.%L'
+    time_keep: on
+    types: pid:integer
+```
+
+{% endtab %}
+{% tab title="parsers.conf" %}
 
 ```text
 [PARSER]
-    Name        docker
-    Format      json
-    Time_Key    time
-    Time_Format %Y-%m-%dT%H:%M:%S.%L
-    Time_Keep   On
+  Name        docker
+  Format      json
+  Time_Key    time
+  Time_Format %Y-%m-%dT%H:%M:%S.%L
+  Time_Keep   On
 
 [PARSER]
-    Name        syslog-rfc5424
-    Format      regex
-    Regex       ^\<(?<pri>[0-9]{1,5})\>1 (?<time>[^ ]+) (?<host>[^ ]+) (?<ident>[^ ]+) (?<pid>[-0-9]+) (?<msgid>[^ ]+) (?<extradata>(\[(.*)\]|-)) (?<message>.+)$
-    Time_Key    time
-    Time_Format %Y-%m-%dT%H:%M:%S.%L
-    Time_Keep   On
-    Types pid:integer
+  Name        syslog-rfc5424
+  Format      regex
+  Regex       ^\<(?<pri>[0-9]{1,5})\>1 (?<time>[^ ]+) (?<host>[^ ]+) (?<ident>[^ ]+) (?<pid>[-0-9]+) (?<msgid>[^ ]+) (?<extradata>(\[(.*)\]|-)) (?<message>.+)$
+  Time_Key    time
+  Time_Format %Y-%m-%dT%H:%M:%S.%L
+  Time_Keep   On
+  Types pid:integer
 ```
 
-For more information about the parsers available, please refer to the default parsers file distributed with Fluent Bit source code:
-
-[https://github.com/fluent/fluent-bit/blob/master/conf/parsers.conf](https://github.com/fluent/fluent-bit/blob/master/conf/parsers.conf)
-
-## Time Resolution and Fractional Seconds
-
-Time resolution and its format supported are handled by using the [strftime\(3\)](http://man7.org/linux/man-pages/man3/strftime.3.html) libc system function.
-
-In addition, we extended our time resolution to support fractional seconds like _2017-05-17T15:44:31**.187512963**Z_. Since Fluent Bit v0.12 we have full support for nanoseconds resolution, the **%L** format option for Time\_Format is provided as a way to indicate that content must be interpreted as fractional seconds.
+{% endtab %}
+{% endtabs %}
+
+For more information about the parsers available, refer to the [default parsers file](https://github.com/fluent/fluent-bit/blob/master/conf/parsers.conf) distributed with Fluent Bit source code.
+
+## Time resolution and fractional seconds
+
+Time resolution and its format supported are handled by using the [strftime\(3\)](http://man7.org/linux/man-pages/man3/strftime.3.html) `libc` system function.
+
+In addition, Fluent Bit extends its time resolution to support fractional seconds like `017-05-17T15:44:31**.187512963**Z`. The `%L` format option for `Time_Format` is provided as a way to indicate that content must be interpreted as fractional seconds.
+
+{% hint style="info" %}
+
+The option `%L` is only valid when used after seconds (`%S`) or seconds since the epoch (`%s`). For example, `%S.%L` and `%s.%L` are valid strings.
+
+{% endhint %}
+
+## Supported time zone abbreviations
+
+The following time zone abbreviations are supported.
 
-> Note: The option %L is only valid when used after seconds \(`%S`\) or seconds since the Epoch \(`%s`\), e.g: `%S.%L` or `%s.%L`
+### Universal time zones
 
+| Abbreviation | UTC Offset (`HH:MM`) | Offset (seconds) | Is DST | Description                |
+| ------------ | -------------------- | ---------------- | ------ | -------------------------- |
+| `GMT`        | `+00:00`             | `0`              | no     | Greenwich Mean Time        |
+| `UTC`        | `+00:00`             | `0`              | no     | Coordinated Universal Time |
+| `Z`          | `+00:00`             | `0`              | no     | Zulu Time (UTC)            |
+| `UT`         | `+00:00`             | `0`              | no     | Universal Time             |
+
+<!-- vale FluentBit.Headings = NO -->
+
+### North American time zones
+
+| Abbreviation | UTC Offset (`HH:MM`) | Offset (seconds) | Is DST | Description                                              |
+| ------------ | -------------------- | ---------------- | ------ | -------------------------------------------------------- |
+| `EST`        | `-05:00`             | `-18000`         | no     | Eastern Standard Time                                    |
+| `EDT`        | `-04:00`             | `-14400`         | yes    | Eastern Daylight Time                                    |
+| `CST`        | `-06:00`             | `-21600`         | no     | Central Standard Time (North America)                    |
+| `CDT`        | `-05:00`             | `-18000`         | yes    | Central Daylight Time (North America)                    |
+| `MST`        | `-07:00`             | `-25200`         | no     | Mountain Standard Time                                   |
+| `MDT`        | `-06:00`             | `-21600`         | yes    | Mountain Daylight Time                                   |
+| `PST`        | `-08:00`             | `-28800`         | no     | Pacific Standard Time                                    |
+| `PDT`        | `-07:00`             | `-25200`         | yes    | Pacific Daylight Time                                    |
+| `AKST`       | `-09:00`             | `-32400`         | no     | Alaska Standard Time                                     |
+| `AKDT`       | `-08:00`             | `-28800`         | yes    | Alaska Daylight Time                                     |
+| `HST`        | `-10:00`             | `-36000`         | no     | Hawaii Standard Time                                     |
+| `HADT`       | `-09:00`             | `-32400`         | yes    | Hawaii-Aleutian Daylight Time (rarely used for Hawaii)   |
+| `AST`        | `-04:00`             | `-14400`         | no     | Atlantic Standard Time (for example, Canada, Caribbean)  |
+| `ADT`        | `-03:00`             | `-10800`         | yes    | Atlantic Daylight Time                                   |
+| `NST`        | `-03:30`             | `-12600`         | no     | Newfoundland Standard Time                               |
+| `NDT`        | `-02:30`             | `-9000`          | yes    | Newfoundland Daylight Time                               |
+
+### European time zones
+
+| Abbreviation | UTC Offset (`HH:MM`) | Offset (seconds) | Is DST | Description                      |
+| ------------ | -------------------- | ---------------- | ------ | -------------------------------- |
+| `WET`        | `+00:00`             | `0`              | no     | Western European Time            |
+| `WEST`       | `+01:00`             | `3600`           | yes    | Western European Summer Time     |
+| `CET`        | `+01:00`             | `3600`           | no     | Central European Time            |
+| `CEST`       | `+02:00`             | `7200`           | yes    | Central European Summer Time     |
+| `EET`        | `+02:00`             | `7200`           | no     | Eastern European Time            |
+| `EEST`       | `+03:00`             | `10800`          | yes    | Eastern European Summer Time     |
+| `MSK`        | `+03:00`             | `10800`          | no     | Moscow Standard Time             |
+
+### South American time zones
+
+<!-- vale FluentBit.Headings = YES -->
+
+| Abbreviation | UTC Offset (`HH:MM`) | Offset (seconds) | Is DST | Description                                                              |
+| ------------ | -------------------- | ---------------- | ------ | ------------------------------------------------------------------------ |
+| `ART`        | `-03:00`             | `-10800`         | no     | Argentina Time                                                           |
+| `BRT`        | `-03:00`             | `-10800`         | no     | Brazil Time (main population areas, can vary by region/DST)              |
+| `BRST`       | `-02:00`             | `-7200`          | yes    | Brazil Summer Time (historical, not currently observed by all)           |
+| `CLT`        | `-04:00`             | `-14400`         | no     | Chile Standard Time                                                      |
+| `CLST`       | `-03:00`             | `-10800`         | yes    | Chile Summer Time                                                        |
+
+### Australasian and Oceania time zones
+
+| Abbreviation | UTC Offset (`HH:MM`) | Offset (seconds) | Is DST | Description                        |
+| ------------ | -------------------- | ---------------- | ------ | ---------------------------------- |
+| `AEST`       | `+10:00`             | `36000`          | no     | Australian Eastern Standard Time   |
+| `AEDT`       | `+11:00`             | `39600`          | yes    | Australian Eastern Daylight Time   |
+| `ACST`       | `+09:30`             | `34200`          | no     | Australian Central Standard Time   |
+| `ACDT`       | `+10:30`             | `37800`          | yes    | Australian Central Daylight Time   |
+| `AWST`       | `+08:00`             | `28800`          | no     | Australian Western Standard Time   |
+| `NZST`       | `+12:00`             | `43200`          | no     | New Zealand Standard Time          |
+| `NZDT`       | `+13:00`             | `46800`          | yes    | New Zealand Daylight Time          |
+
+### Asian time zones
+
+| Abbreviation | UTC Offset (`HH:MM`) | Offset (seconds) | Is DST | Description                                               |
+| ------------ | -------------------- | ---------------- | ------ | --------------------------------------------------------- |
+| `JST`        | `+09:00`             | `32400`          | no     | Japan Standard Time                                       |
+| `KST`        | `+09:00`             | `32400`          | no     | Korea Standard Time                                       |
+| `SGT`        | `+08:00`             | `28800`          | no     | Singapore Time                                            |
+| `IST`        | `+05:30`             | `19800`          | no     | India Standard Time                                       |
+| `GST`        | `+04:00`             | `14400`          | no     | Gulf Standard Time (for example, UAE, Oman)               |
+| `ICT`        | `+07:00`             | `25200`          | no     | Indochina Time (Thailand, Vietnam, Laos, Cambodia)        |
+| `WIB`        | `+07:00`             | `25200`          | no     | Western Indonesian Time                                   |
+| `WITA`       | `+08:00`             | `28800`          | no     | Central Indonesian Time                                   |
+| `WIT`        | `+09:00`             | `32400`          | no     | Eastern Indonesian Time                                   |
+| `MYT`        | `+08:00`             | `28800`          | no     | Malaysia Time                                             |
+| `BDT`        | `+06:00`             | `21600`          | no     | Bangladesh Standard Time                                  |
+| `NPT`        | `+05:45`             | `20700`          | no     | Nepal Time                                                |
+
+### African time zones
+
+| Abbreviation | UTC Offset (`HH:MM`) | Offset (seconds) | Is DST | Description                 |
+| ------------ | -------------------- | ---------------- | ------ | --------------------------- |
+| `WAT`        | `+01:00`             | `3600`           | no     | West Africa Time            |
+| `CAT`        | `+02:00`             | `7200`           | no     | Central Africa Time         |
+| `EAT`        | `+03:00`             | `10800`          | no     | East Africa Time            |
+| `SAST`       | `+02:00`             | `7200`           | no     | South Africa Standard Time  |
+
+### Military time zones
+
+{% hint style="info" %}
+
+These are single-letter UTC offset designators. `J` (Juliet) represents local time and isn't included. `Z` represents Zulu Time, as listed in the [Universal time zones](#universal-time-zones) list.
+
+{% endhint %}
+
+| Abbreviation | UTC Offset (`HH:MM`) | Offset (seconds) | Is DST | Description                                             |
+| ------------ | -------------------- | ---------------- | ------ | ------------------------------------------------------- |
+| `A`          | `+01:00`             | `3600`           | no     | Alpha Time Zone                                         |
+| `B`          | `+02:00`             | `7200`           | no     | Bravo Time Zone                                         |
+| `C`          | `+03:00`             | `10800`          | no     | Charlie Time Zone                                       |
+| `D`          | `+04:00`             | `14400`          | no     | Delta Time Zone                                         |
+| `E`          | `+05:00`             | `18000`          | no     | Echo Time Zone                                          |
+| `F`          | `+06:00`             | `21600`          | no     | Foxtrot Time Zone                                       |
+| `G`          | `+07:00`             | `25200`          | no     | Golf Time Zone                                          |
+| `H`          | `+08:00`             | `28800`          | no     | Hotel Time Zone                                         |
+| `I`          | `+09:00`             | `32400`          | no     | India Time Zone (military, not Indian Standard Time)    |
+| `K`          | `+10:00`             | `36000`          | no     | Kilo Time Zone                                          |
+| `L`          | `+11:00`             | `39600`          | no     | Lima Time Zone                                          |
+| `M`          | `+12:00`             | `43200`          | no     | Mike Time Zone                                          |
+| `N`          | `-01:00`             | `-3600`          | no     | November Time Zone                                      |
+| `O`          | `-02:00`             | `-7200`          | no     | Oscar Time Zone                                         |
+| `P`          | `-03:00`             | `-10800`         | no     | Papa Time Zone                                          |
+| `Q`          | `-04:00`             | `-14400`         | no     | Quebec Time Zone                                        |
+| `R`          | `-05:00`             | `-18000`         | no     | Romeo Time Zone                                         |
+| `S`          | `-06:00`             | `-21600`         | no     | Sierra Time Zone                                        |
+| `T`          | `-07:00`             | `-25200`         | no     | Tango Time Zone                                         |
+| `U`          | `-08:00`             | `-28800`         | no     | Uniform Time Zone                                       |
+| `V`          | `-09:00`             | `-32400`         | no     | Victor Time Zone                                        |
+| `W`          | `-10:00`             | `-36000`         | no     | Whiskey Time Zone                                       |
+| `X`          | `-11:00`             | `-43200`         | no     | X-ray Time Zone                                         |
+| `Y`          | `-12:00`             | `-46800`         | no     | Yankee Time Zone                                        |
diff --git a/pipeline/parsers/decoders.md b/pipeline/parsers/decoders.md
index 38e9244f6..21f4c401b 100644
--- a/pipeline/parsers/decoders.md
+++ b/pipeline/parsers/decoders.md
@@ -1,71 +1,94 @@
 # Decoders
 
-There are certain cases where the log messages being parsed contains encoded data, a typical use case can be found in containerized environments with Docker: application logs it data in JSON format but becomes an escaped string, Consider the following example
+There are cases where the log messages you want to parse contain encoded data. A typical use case can be found in containerized environments with Docker. Docker logs its data in JSON format, which uses escaped strings.
 
-Original message generated by the application:
+Consider the following message generated by the application:
 
 ```text
 {"status": "up and running"}
 ```
 
-Then the Docker log message become encapsulated as follows:
+The Docker log message encapsulates something like this:
 
 ```text
 {"log":"{\"status\": \"up and running\"}\r\n","stream":"stdout","time":"2018-03-09T01:01:44.851160855Z"}
 ```
 
-as you can see the original message is handled as an escaped string. Ideally in Fluent Bit we would like to keep having the original structured message and not a string.
+The original message is handled as an escaped string. Fluent Bit will use the original structured message, and not a string.
 
-## Getting Started
+## Get started
 
-Decoders are a built-in feature available through the Parsers file, each Parser definition can optionally set one or multiple decoders. There are two type of decoders type:
+Decoders are a built-in feature of parsers in Fluent Bit. Each parser definition can optionally set one or more decoders. Select from one of these decoder types:
 
-* Decode\_Field: if the content can be decoded in a structured message, append that structure message \(keys and values\) to the original log message.
-* Decode\_Field\_As: any content decoded \(unstructured or structured\) will be replaced in the same key/value, no extra keys are added.
+- `Decode_Field`: If the content can be decoded in a structured message, append
+  the structured message (keys and values) to the original log message.
+- `Decode_Field_As`: Any decoded content (unstructured or structured) will be
+  replaced in the same key/value, and no extra keys are added.
 
-Our pre-defined Docker Parser have the following definition:
+For example, the predefined Docker parser has the following definition:
+
+{% tabs %}
+{% tab title="parsers.yaml" %}
+
+```yaml
+parsers:
+  - name: docker
+    format: json
+    time_key: time
+    time_format: '%Y-%m-%dT%H:%M:%S.%L'
+    time_keep: on
+    # Command   |  Decoder | Field | Optional Action   |
+    # ==========|==========|=======|===================|
+    decode_field_as: escaped log
+```
+
+{% endtab %}
+{% tab title="parsers.conf" %}
 
 ```text
 [PARSER]
-    Name         docker
-    Format       json
-    Time_Key     time
-    Time_Format  %Y-%m-%dT%H:%M:%S.%L
-    Time_Keep    On
-    # Command       |  Decoder  | Field | Optional Action   |
-    # ==============|===========|=======|===================|
-    Decode_Field_As    escaped     log
+  Name         docker
+  Format       json
+  Time_Key     time
+  Time_Format  %Y-%m-%dT%H:%M:%S.%L
+  Time_Keep    On
+  # Command       |  Decoder  | Field | Optional Action   |
+  # ==============|===========|=======|===================|
+  Decode_Field_As    escaped     log
 ```
 
-Each line in the parser with a key _Decode\_Field_ instruct the parser to apply a specific decoder on a given field, optionally it offer the option to take an extra action if the decoder cannot succeed.
+{% endtab %}
+{% endtabs %}
 
-### Decoders
+Each line in the parser with a key `Decode_Field` instructs the parser to apply a specific decoder on a given field. Optionally, it offers the option to take an extra action if the decoder doesn't succeed.
 
-| Name | Description |
-| :--- | :--- |
-| json | handle the field content as a JSON map. If it find a JSON map it will replace the content with a structured map. |
-| escaped | decode an escaped string. |
-| escaped\_utf8 | decode a UTF8 escaped string. |
+### Decoder options
 
-### Optional Actions
+| Name           | Description |
+| -------------- | ----------- |
+| `json`         | Handle the field content as a JSON map. If the decoder finds a JSON map, it replaces the content with a structured map. |
+| `escaped`      | Decode an escaped string. |
+| `escaped_utf8` | Decode a UTF8 escaped string. |
 
-By default if a decoder fails to decode the field or want to try a next decoder, is possible to define an optional action. Available actions are:
+### Optional actions
+
+If a decoder fails to decode the field, or if you want to try another decoder, you can define an optional action. Available actions are:
 
 | Name | Description |
-| :--- | :--- |
-| try\_next | if the decoder failed, apply the next Decoder in the list for the same field. |
-| do\_next | if the decoder succeeded or failed, apply the next Decoder in the list for the same field. |
+| -----| ----------- |
+| `try_next` | If the decoder failed, apply the next decoder in the list for the same field. |
+| `do_next` | If the decoder succeeded or failed, apply the next decoder in the list for the same field. |
 
-Note that actions are affected by some restrictions:
+Actions are affected by some restrictions:
 
-* on Decode\_Field\_As, if succeeded, another decoder of the same type in the same field can be applied only if the data continues being an unstructured message \(raw text\).
-* on Decode\_Field, if succeeded, can only be applied once for the same field. By nature Decode\_Field aims to decode a structured message.
+- `Decode_Field_As`: If successful, another decoder of the same type and the same field can be applied only if the data continues being an unstructured message (raw text).
+- `Decode_Field`: If successful, can be applied only once for the same field. `Decode_Field` is intended to decode a structured message.
 
 ### Examples
 
-### escaped\_utf8
+#### `escaped_utf8`
 
-Example input \(from `/path/to/log.log` in configuration below\)
+Example input from `/path/to/log.log`:
 
 ```text
 {"log":"\u0009Checking indexes...\n","stream":"stdout","time":"2018-02-19T23:25:29.1845444Z"}
@@ -73,41 +96,84 @@ Example input \(from `/path/to/log.log` in configuration below\)
 {"log":"\u0009Done\n","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}
 ```
 
-Example output
+Example output:
 
 ```text
-[24] tail.0: [1519082729.184544400, {"log"=>"   Checking indexes...                                                   
+...
+[24] tail.0: [1519082729.184544400, {"log"=>"   Checking indexes...
 ", "stream"=>"stdout", "time"=>"2018-02-19T23:25:29.1845444Z"}]
 [25] tail.0: [1519082729.184553600, {"log"=>"           Validated: _audit _internal _introspection _telemetry _thefishbucket history main snmp_data summary
 ", "stream"=>"stdout", "time"=>"2018-02-19T23:25:29.1845536Z"}]
-[26] tail.0: [1519082729.184562200, {"log"=>"   Done                  
+[26] tail.0: [1519082729.184562200, {"log"=>"   Done
 ", "stream"=>"stdout", "time"=>"2018-02-19T23:25:29.1845622Z"}]
+...
 ```
 
-Configuration file
+Decoder example Fluent Bit configuration files:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  parsers_file: parsers.yaml
+
+pipeline:
+  inputs:
+    - name: tail
+      parser: docker
+      path: /path/to/log.log
+
+  outputs:
+    - name: stdout
+      match: '*'
+```
+
+{% endtab %}
+{% tab title="fluent-bit.conf" %}
 
 ```text
 [SERVICE]
-    Parsers_File fluent-bit-parsers.conf
+  Parsers_File parsers.conf
 
 [INPUT]
-    Name        tail
-    Parser      docker
-    Path        /path/to/log.log
+  Name        tail
+  Parser      docker
+  Path        /path/to/log.log
 
 [OUTPUT]
-    Name   stdout
-    Match  *
+  Name   stdout
+  Match  *
+```
+
+{% endtab %}
+{% endtabs %}
+
+The example parsers file:
+
+{% tabs %}
+{% tab title="parsers.yaml" %}
+
+```yaml
+parsers:
+  - name: docker
+    format: json
+    time_key: time
+    time_format: '%Y-%m-%dT%H:%M:%S %z'
+    decode_field_as: escaped_utf8 log
 ```
 
-The `fluent-bit-parsers.conf` file,
+{% endtab %}
+{% tab title="parsers.conf" %}
 
 ```text
 [PARSER]
-    Name        docker
-    Format      json
-    Time_Key    time
-    Time_Format %Y-%m-%dT%H:%M:%S %z
-    Decode_Field_as escaped_utf8 log
+  Name        docker
+  Format      json
+  Time_Key    time
+  Time_Format %Y-%m-%dT%H:%M:%S %z
+  Decode_Field_as escaped_utf8 log
 ```
 
+{% endtab %}
+{% endtabs %}
\ No newline at end of file
diff --git a/pipeline/parsers/json.md b/pipeline/parsers/json.md
index 25d7a5dce..a8c86a721 100644
--- a/pipeline/parsers/json.md
+++ b/pipeline/parsers/json.md
@@ -1,20 +1,37 @@
 # JSON
 
-The JSON parser is the simplest option: if the original log source is a JSON map string, it will take its structure and convert it directly to the internal binary representation.
+The _JSON_ parser transforms JSON logs by converting them to internal binary representations.
 
-A simple configuration that can be found in the default parsers configuration file, is the entry to parse Docker log files \(when the tail input plugin is used\):
+For example, the default parsers configuration file includes a parser for parsing Docker logs (when the Tail input plugin is used):
 
-```python
+{% tabs %}
+{% tab title="parsers.yaml" %}
+
+```yaml
+parsers:
+  - name: docker
+    format: json
+    time_key: time
+    time_format: '%Y-%m-%dT%H:%M:%S %z'
+```
+
+{% endtab %}
+{% tab title="parsers.conf" %}
+
+```text
 [PARSER]
-    Name        docker
-    Format      json
-    Time_Key    time
-    Time_Format %Y-%m-%dT%H:%M:%S %z
+  Name        docker
+  Format      json
+  Time_Key    time
+  Time_Format %Y-%m-%dT%H:%M:%S %z
 ```
 
-The following log entry is a valid content for the parser defined above:
+{% endtab %}
+{% endtabs %}
+
+The following log entry is valid content for the previously defined parser:
 
-```javascript
+```text
 {"key1": 12345, "key2": "abc", "time": "2006-07-28T13:22:04Z"}
 ```
 
@@ -24,5 +41,4 @@ After processing, its internal representation will be:
 [1154103724, {"key1"=>12345, "key2"=>"abc"}]
 ```
 
-The time has been converted to Unix timestamp \(UTC\) and the map reduced to each component of the original message.
-
+The time was converted to a UTC timestamp and the map was reduced to each component of the original message.
\ No newline at end of file
diff --git a/pipeline/parsers/logfmt.md b/pipeline/parsers/logfmt.md
index 6e4389c09..ba3ee79ac 100644
--- a/pipeline/parsers/logfmt.md
+++ b/pipeline/parsers/logfmt.md
@@ -1,22 +1,37 @@
 # Logfmt
 
-The **logfmt** parser allows to parse the logfmt format described in [https://brandur.org/logfmt](https://brandur.org/logfmt) . A more formal description is in [https://godoc.org/github.com/kr/logfmt](https://godoc.org/github.com/kr/logfmt) .
+The _logfmt_ parser lets you parse data in the [logfmt](https://pkg.go.dev/github.com/kr/logfmt?utm_source=godoc) format.
 
-Here is an example configuration:
+Here is an example parsers configuration:
 
-```python
+{% tabs %}
+{% tab title="parsers.yaml" %}
+
+```yaml
+parsers:
+  - name: logfmt
+    format: logfmt
+```
+
+{% endtab %}
+{% tab title="parsers.conf" %}
+
+```text
 [PARSER]
-    Name        logfmt
-    Format      logfmt
+  Name        logfmt
+  Format      logfmt
 ```
 
-The following log entry is a valid content for the parser defined above:
+{% endtab %}
+{% endtabs %}
+
+The following log entry is valid for the previously defined parser:
 
 ```text
 key1=val1 key2=val2 key3
 ```
 
-After processing, it internal representation will be:
+After processing, its internal representation will be:
 
 ```text
 [1540936693, {"key1"=>"val1",
@@ -24,12 +39,27 @@ After processing, it internal representation will be:
               "key3"=>true}]
 ```
 
-If you want to be more strict than the logfmt standard and not parse lines where some attributes do
-not have values (such as `key3`) in the example above, you can configure the parser as follows:
+If you want to be more strict than the logfmt standard and not parse lines where certain keys lack values (such as `key3` in the previous example), you can configure the parser as follows:
 
-```python
+{% tabs %}
+{% tab title="parsers.yaml" %}
+
+```yaml
+parsers:
+  - name: logfmt
+    format: logfmt
+    logfmt_no_bare_keys: true
+```
+
+{% endtab %}
+{% tab title="parsers.conf" %}
+
+```text
 [PARSER]
-    Name        logfmt
-    Format      logfmt
-    Logfmt_No_Bare_Keys true
+  Name        logfmt
+  Format      logfmt
+  Logfmt_No_Bare_Keys true
 ```
+
+{% endtab %}
+{% endtabs %}
\ No newline at end of file
diff --git a/pipeline/parsers/ltsv.md b/pipeline/parsers/ltsv.md
index aa2590f89..1ed3cd0c2 100644
--- a/pipeline/parsers/ltsv.md
+++ b/pipeline/parsers/ltsv.md
@@ -1,46 +1,67 @@
 # LTSV
 
-The **ltsv** parser allows to parse [LTSV](http://ltsv.org/) formatted texts.
+The _LTSV_ parser lets you parse data in the [Labeled Tab-separated Values (LTSV)](http://ltsv.org/) format.
 
-Labeled Tab-separated Values \(LTSV format is a variant of Tab-separated Values \(TSV\). Each record in a LTSV file is represented as a single line. Each field is separated by TAB and has a label and a value. The label and the value have been separated by ':'.
+LTSV is a variant of the Tab-separated Values (TSV) format. Each record in an LTSV file is represented as a single line. Each field is separated by a tab and has a label and a value. The label and its value are separated by a colon (`:`).
 
-Here is an example how to use this format in the apache access log.
+Here is an example how to use this format in the Apache access log.
 
-Config this in httpd.conf:
+Configure this in `httpd.conf`:
 
 ```text
 LogFormat "host:%h\tident:%l\tuser:%u\ttime:%t\treq:%r\tstatus:%>s\tsize:%b\treferer:%{Referer}i\tua:%{User-Agent}i" combined_ltsv
 CustomLog "logs/access_log" combined_ltsv
 ```
 
-The parser.conf:
+The following is an example parsers configuration file:
 
-```python
+{% tabs %}
+{% tab title="parsers.yaml" %}
+
+```yaml
+parsers:
+  - name: access_log_ltsv
+    format: ltsv
+    time_key: time
+    time_format: '[%d/%b/%Y:%H:%M:%S %z]'
+    types: status:integer size:integer
+```
+
+{% endtab %}
+{% tab title="parsers.conf" %}
+
+```text
 [PARSER]
-    Name        access_log_ltsv
-    Format      ltsv
-    Time_Key    time
-    Time_Format [%d/%b/%Y:%H:%M:%S %z]
-    Types       status:integer size:integer
+  Name        access_log_ltsv
+  Format      ltsv
+  Time_Key    time
+  Time_Format [%d/%b/%Y:%H:%M:%S %z]
+  Types       status:integer size:integer
 ```
 
-The following log entry is a valid content for the parser defined above:
+{% endtab %}
+{% endtabs %}
+
+The following log entry is valid content for the previously defined parser:
 
 ```text
+...
 host:127.0.0.1  ident:- user:-  time:[10/Jul/2018:13:27:05 +0200]       req:GET / HTTP/1.1      status:200      size:16218      referer:http://127.0.0.1/       ua:Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0
 host:127.0.0.1  ident:- user:-  time:[10/Jul/2018:13:27:05 +0200]       req:GET /assets/plugins/bootstrap/css/bootstrap.min.css HTTP/1.1        status:200      size:121200     referer:http://127.0.0.1/       ua:Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0
 host:127.0.0.1  ident:- user:-  time:[10/Jul/2018:13:27:05 +0200]       req:GET /assets/css/headers/header-v6.css HTTP/1.1      status:200      size:37706      referer:http://127.0.0.1/       ua:Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0
 host:127.0.0.1  ident:- user:-  time:[10/Jul/2018:13:27:05 +0200]       req:GET /assets/css/style.css HTTP/1.1  status:200      size:1279       referer:http://127.0.0.1/       ua:Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0
+...
 ```
 
-After processing, it internal representation will be:
+After processing, its internal representation will be:
 
 ```text
+...
 [1531222025.000000000, {"host"=>"127.0.0.1", "ident"=>"-", "user"=>"-", "req"=>"GET / HTTP/1.1", "status"=>200, "size"=>16218, "referer"=>"http://127.0.0.1/", "ua"=>"Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0"}]
 [1531222025.000000000, {"host"=>"127.0.0.1", "ident"=>"-", "user"=>"-", "req"=>"GET /assets/plugins/bootstrap/css/bootstrap.min.css HTTP/1.1", "status"=>200, "size"=>121200, "referer"=>"http://127.0.0.1/", "ua"=>"Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0"}]
 [1531222025.000000000, {"host"=>"127.0.0.1", "ident"=>"-", "user"=>"-", "req"=>"GET /assets/css/headers/header-v6.css HTTP/1.1", "status"=>200, "size"=>37706, "referer"=>"http://127.0.0.1/", "ua"=>"Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0"}]
 [1531222025.000000000, {"host"=>"127.0.0.1", "ident"=>"-", "user"=>"-", "req"=>"GET /assets/css/style.css HTTP/1.1", "status"=>200, "size"=>1279, "referer"=>"http://127.0.0.1/", "ua"=>"Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0"}]
+...
 ```
 
-The time has been converted to Unix timestamp \(UTC\).
-
+The time was converted to Unix timestamp (UTC).
\ No newline at end of file
diff --git a/pipeline/parsers/regular-expression.md b/pipeline/parsers/regular-expression.md
index 8cce3eeae..0d33edaec 100644
--- a/pipeline/parsers/regular-expression.md
+++ b/pipeline/parsers/regular-expression.md
@@ -1,46 +1,67 @@
-# Regular Expression
+# Regular expression
 
-The **regex** parser allows to define a custom Ruby Regular Expression that will use a named capture feature to define which content belongs to which key name.
+The _Regular expression_ parser lets you define a custom Ruby regular expression that uses named capture to define which content belongs to which key name.
 
-Fluent Bit uses [Onigmo](https://github.com/k-takata/Onigmo) regular expression library on Ruby mode, for testing purposes you can use the following web editor to test your expressions:
+Use [Tail multiline](../inputs/tail.md#multiline) when you need to support regular expressions across multiple lines from a `tail`. The Tail input plugin treats each line as a separate entity.
 
-[http://rubular.com/](http://rubular.com/)
+{% hint style="warning" %}
 
-Important: do not attempt to add multiline support in your regular expressions if you are using [Tail](../inputs/tail.md) input plugin since each line is handled as a separated entity. Instead use Tail [Multiline](../inputs/tail.md#multiline) support configuration feature.
+This parser uses Onigmo, which is a backtracking regular expression's engine. When using complex regular expression patterns, Onigmo can take a long time to perform pattern matching. This can cause a [regular expression denial of service (ReDoS)](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS).
 
-Security Warning: Onigmo is a _backtracking_ regex engine. You need to be careful not to use expensive regex patterns, or Onigmo can take very long time to perform pattern matching. For details, please read the article ["ReDoS"](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS) on OWASP.
+{% end hint %}
 
-> Note: understanding how regular expressions works is out of the scope of this content.
+Setting the format to regular expressions requires a `regex` configuration key.
 
-From a configuration perspective, when the format is set to **regex**, is mandatory and expected that a _Regex_ configuration key exists.
+## Configuration parameters
 
-## Configuration Parameters
+The `regex` parser supports the following configuration parameters:
 
-The regex parser supports the following configuration parameters.
+| Key | Description | Default Value |
+| --- | ----------- | ------------- |
+| `Skip_Empty_Values` | If enabled, the parser ignores empty value of the record. | `True` |
 
-|Key|Description|Default Value|
-|-------|------------|--------|
-|`Skip_Empty_Values`|If enabled, the parser ignores empty value of the record.| True|
+Fluent Bit uses the [Onigmo](https://github.com/k-takata/Onigmo) regular expression library in Ruby mode.
 
-The following parser configuration example aims to provide rules that can be applied to an Apache HTTP Server log entry:
+You can use only alphanumeric characters and underscore in group names. For example, a group name like `(?<user-name>.*)` causes an error due to the invalid dash (`-`) character. Use the [Rubular](http://rubular.com/) web editor to test your expressions.
 
-```python
+The following parser configuration example provides rules that can be applied to an Apache HTTP Server log entry:
+
+{% tabs %}
+{% tab title="parsers.yaml" %}
+
+```yaml
+parsers:
+  - name: apache
+    format: regex
+    regex: '^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$'
+    time_key: time
+    time_format: '%d/%b/%Y:%H:%M:%S %z'
+    types: pid:integer size:integer
+```
+
+{% endtab %}
+{% tab title="parsers.conf" %}
+
+```text
 [PARSER]
-    Name   apache
-    Format regex
-    Regex  ^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$
-    Time_Key time
-    Time_Format %d/%b/%Y:%H:%M:%S %z
-    Types code:integer size:integer
+  Name   apache
+  Format regex
+  Regex  ^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$
+  Time_Key time
+  Time_Format %d/%b/%Y:%H:%M:%S %z
+  Types code:integer size:integer
 ```
 
-As an example, takes the following Apache HTTP Server log entry:
+{% endtab %}
+{% endtabs %}
+
+As an example, review the following Apache HTTP Server log entry:
 
 ```text
 192.168.2.20 - - [29/Jul/2015:10:27:10 -0300] "GET /cgi-bin/try/ HTTP/1.0" 200 3395
 ```
 
-The above content do not provide a defined structure for Fluent Bit, but enabling the proper parser we can help to make a structured representation of it:
+This log entry doesn't provide a defined structure for Fluent Bit. Enabling the proper parser can help to make a structured representation of the entry:
 
 ```text
 [1154104030, {"host"=>"192.168.2.20",
@@ -53,9 +74,4 @@ The above content do not provide a defined structure for Fluent Bit, but enablin
               "agent"=>""
               }
 ]
-```
-
-A common pitfall is that you cannot use characters other than alphabets, numbers and underscore in group names. For example, a group name like `(?<user-name>.*)` will cause an error due to containing an invalid character \(`-`\).
-
-In order to understand, learn and test regular expressions like the example above, we suggest you try the following Ruby Regular Expression Editor: [http://rubular.com/r/X7BH0M4Ivm](http://rubular.com/r/X7BH0M4Ivm)
-
+```
\ No newline at end of file
diff --git a/pipeline/pipeline-monitoring.md b/pipeline/pipeline-monitoring.md
index 6d6a654a1..abb954350 100644
--- a/pipeline/pipeline-monitoring.md
+++ b/pipeline/pipeline-monitoring.md
@@ -2,12 +2,11 @@
 description: Learn how to monitor your data pipeline with external services
 ---
 
-# Pipeline Monitoring
+# Pipeline monitoring
 
-A Data Pipeline represents a flow of data that goes through the inputs \(sources\), filters, and output \(sinks\). There are a couple of ways to monitor the pipeline. We recommend the following sections for a better understanding and steps to get started:
-
-* [HTTP Server: JSON and Prometheus Exporter-style metrics](../administration/monitoring.md#http-server)
-* [Grafana Dashboards and Alerts](../administration/monitoring.md#grafana-dashboard-and-alerts)
-* [Health Checks](../administration/monitoring.md#health-check-for-fluent-bit)
-* [Calyptia Cloud: hosted service to monitor and visualize your pipelines](../administration/monitoring.md#calyptia-cloud)
+A Data Pipeline represents a flow of data that goes through the inputs (sources), filters, and output (sinks). The following sections contain information and steps to get started monitoring the pipeline.
 
+- [HTTP Server: JSON and Prometheus Exporter-style metrics](../administration/monitoring.md#http-server)
+- [Grafana Dashboards and Alerts](../administration/monitoring.md#grafana-dashboard-and-alerts)
+- [Health Checks](../administration/monitoring.md#health-check-for-fluent-bit)
+- [Telemetry Pipeline: hosted service to monitor and visualize your pipelines](../administration/monitoring.md#telemetry-pipeline)
diff --git a/pipeline/processors/README.md b/pipeline/processors/README.md
index d2a3057f7..a231a0b86 100644
--- a/pipeline/processors/README.md
+++ b/pipeline/processors/README.md
@@ -1,2 +1,29 @@
 # Processors
 
+Processors are components that modify, transform, or enhance data as it flows through Fluent Bit. Unlike [filters](../filters/README.md), processors are tightly coupled to inputs, which means they execute immediately and avoid creating a performance bottleneck.
+
+Additionally, filters can be implemented in a way that mimics the behavior of processors, but processors can't be implemented in a way that mimics filters.
+
+{% hint style="info" %}
+
+Only [YAML configuration files](../../administration/configuring-fluent-bit/yaml/configuration-file.md) support processors.
+
+{% endhint %}
+
+## Available processors
+
+Fluent Bit offers the following processors:
+
+- [Content modifier](content-modifier.md): Manipulate the content, metadata, and attributes of logs and traces.
+- [Labels](labels.md): Add, update, or delete metric labels.
+- [Metrics selector](metrics-selector.md): Choose which metrics to keep or discard.
+- [OpenTelemetry envelope](opentelemetry-envelope.md): Transform logs into an OpenTelemetry-compatible format.
+- [Sampling](sampling.md): Apply head or tail sampling to incoming traces.
+- [SQL](sql.md): Use SQL queries to extract log content.
+- [Filters as processors](filters.md): Use filters as processors.
+
+## Features
+
+Compatible processors include the following features:
+
+- [Conditional processing](conditional-processing.md): Selectively apply processors to logs based on the value of fields that those logs contain.
diff --git a/pipeline/processors/conditional-processing.md b/pipeline/processors/conditional-processing.md
new file mode 100644
index 000000000..eaf1ca0e4
--- /dev/null
+++ b/pipeline/processors/conditional-processing.md
@@ -0,0 +1,278 @@
+# Conditional processing
+
+Conditional processing lets you selectively apply [processors](README.md) to logs based on the value of fields within those logs. This feature lets you create processing pipelines that only process records that meet certain criteria, and ignore the rest.
+
+Conditional processing is available in Fluent Bit version 4.0 and greater.
+
+## Configuration
+
+You can turn a standard processor into a conditional processor by adding a `condition` block to the processor's YAML configuration settings.
+
+{% hint style="info" %}
+
+- Only [YAML configuration files](../../administration/configuring-fluent-bit/yaml/README.md) support processors, including conditional processors.
+- Conditional processing isn't supported if you're using a [filter as a processor](../filters).
+
+{% endhint %}
+
+These `condition` blocks use the following syntax:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    <...>
+
+  processors:
+    logs:
+      - name: processor_name
+        <...>
+        condition:
+          op: {and|or}
+          rules:
+          - field: {field_name1}
+            op: {comparison_operator}
+            value: {comparison_value1}
+          - field: {field_name2}
+            op: {comparison_operator}
+            value: {comparison_value2}
+        <...>
+```
+
+{% endtab %}
+{% endtabs %}
+
+Each processor can only have a single `condition` block, but that condition can include multiple rules. These rules are stored as items in the `condition.rules` array.
+
+### Condition evaluation
+
+The `condition.op` parameter specifies the condition's evaluation logic. It can have one of the following values:
+
+- `and`: A log entry meets this condition when all the rules in the `condition.rules` array are [truthy](https://developer.mozilla.org/en-US/docs/Glossary/Truthy).
+- `or`: A log entry meets this condition when one or more rules in the `condition.rules` array are [truthy](https://developer.mozilla.org/en-US/docs/Glossary/Truthy).
+
+### Rules
+
+Each item in the `condition.rules` array must include values for the following parameters:
+
+| Parameter | Description |
+| --- | --- |
+| `field` | The field within your logs to evaluate. The value of this parameter must use [the correct syntax](#field-access) to access the fields inside logs. |
+| `op` | The [comparison operator](#comparison-operators) to evaluate whether the rule is true. This parameter (`condition.rules.op`) is distinct from the `condition.op` parameter and has different possible values. |
+| `value` | The value of the specified log field to use in your comparison. Optionally, you can provide [an array that contains multiple values](#array-of-values). |
+
+Rules are evaluated against each log that passes through your data pipeline. For example, given a rule with these parameters:
+
+```yaml
+rules:
+  - field: "$status"
+    op: eq
+    value: 200
+```
+
+This rule evaluates to `true` for a log that contains the string `'status':200`, but evaluates to `false` for a log that contains the string `'status':403`.
+
+#### Field access
+
+The `conditions.rules.field` parameter uses [record accessor syntax](/administration/configuring-fluent-bit/classic-mode/record-accessor.md) to reference fields inside logs.
+
+You can use `$field` syntax to access a top-level field, and `$field['child']['subchild']` to access nested fields.
+
+#### Comparison operators
+
+The `conditions.rules.op` parameter has the following possible values:
+
+- `eq`: equal to
+- `neq`: not equal to
+- `gt`: greater than
+- `lt`: less than
+- `gte`: greater than or equal to
+- `lte`: less than or equal to
+- `regex`: matches a regular expression
+- `not_regex`: does not match a regular expression
+- `in`: is included in the specified array
+- `not_in`: is not included in the specified array
+
+## Examples
+
+### Basic condition
+
+This example applies a condition that only processes logs that contain the string `{"request": {"method": "POST"`:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"request": {"method": "GET", "path": "/api/v1/resource"}}'
+      tag: request.log
+
+      processors:
+        logs:
+          - name: content_modifier
+            action: insert
+            key: modified_if_post
+            value: true
+            condition:
+              op: and
+              rules:
+                - field: "$request['method']"
+                  op: eq
+                  value: "POST"
+```
+
+{% endtab %}
+{% endtabs %}
+
+### Multiple conditions with `and`
+
+This example applies a condition that only processes logs when all the specified rules are met:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"request": {"method": "POST", "path": "/api/v1/sensitive-data"}}'
+      tag: request.log
+
+      processors:
+          logs:
+            - name: content_modifier
+              action: insert
+              key: requires_audit
+              value: true
+              condition:
+                op: and
+                rules:
+                  - field: "$request['method']"
+                    op: eq
+                    value: "POST"
+                  - field: "$request['path']"
+                    op: regex
+                    value: "\/sensitive-.*"
+```
+
+{% endtab %}
+{% endtabs %}
+
+### Multiple conditions with `or`
+
+This example applies a condition that only processes logs when one or more of the specified rules are met:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"request": {"method": "GET", "path": "/api/v1/resource", "status_code": 200, "response_time": 150}}'
+      tag: request.log
+
+      processors:
+        logs:
+          - name: content_modifier
+            action: insert
+            key: requires_performance_check
+            value: true
+            condition:
+              op: or
+              rules:
+                - field: "$request['response_time']"
+                  op: gt
+                  value: 100
+                - field: "$request['status_code']"
+                  op: gte
+                  value: 400
+```
+
+{% endtab %}
+{% endtabs %}
+
+### Array of values
+
+This example uses an array for the value of `condition.rules.value`:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"request": {"method": "GET", "path": "/api/v1/resource"}}'
+      tag: request.log
+
+      processors:
+        logs:
+          - name: content_modifier
+            action: insert
+            key: high_priority_method
+            value: true
+            condition:
+              op: and
+              rules:
+                - field: "$request['method']"
+                  op: in
+                  value: ["POST", "PUT", "DELETE"]
+```
+
+{% endtab %}
+{% endtabs %}
+
+### Multiple processors with conditions
+
+This example uses multiple processors with conditional processing enabled for each:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"log": "Error: Connection refused", "level": "error", "service": "api-gateway"}'
+      tag: app.log
+
+      processors:
+        logs:
+          - name: content_modifier
+            action: insert
+            key: alert
+            value: true
+            condition:
+              op: and
+              rules:
+                - field: "$level"
+                  op: eq
+                  value: "error"
+                - field: "$service"
+                  op: in
+                  value: ["api-gateway", "authentication", "database"]
+
+          - name: content_modifier
+            action: insert
+            key: paging_required
+            value: true
+            condition:
+              op: and
+              rules:
+                - field: "$log"
+                  op: regex
+                  value: "(?i)(connection refused|timeout|crash)"
+                - field: "$level"
+                  op: in
+                  value: ["error", "fatal"]
+```
+
+{% endtab %}
+{% endtabs %}
+
+This configuration adds an `alert` field to error logs from critical services, and adds a `paging_required` field to errors that contain specific critical patterns.
diff --git a/pipeline/processors/content-modifier.md b/pipeline/processors/content-modifier.md
index 88943f3a1..fd380386b 100644
--- a/pipeline/processors/content-modifier.md
+++ b/pipeline/processors/content-modifier.md
@@ -1,40 +1,84 @@
-# Content Modifier
+# Content modifier
 
-The **content_modifier** processor allows you to manipulate the metadata/attributes and content of Logs and Traces. 
+The _content modifier_ processor lets you manipulate the content, metadata, and attributes of logs and traces.
 
-Similar to the functionality exposed by filters, this processor presents a unified mechanism to perform such operations for data manipulation. The most significant difference is that processors perform better than filters, and when chaining them, there are no encoding/decoding performance penalties.
+Similar to how filters work, this processor uses a unified mechanism to perform operations for data manipulation. The most significant difference is that processors perform better than filters, and when chaining them, there are no encoding/decoding performance penalties.
 
-Note that processors and this specific component can only be enabled using the new YAML configuration format. Classic mode configuration format doesn't support processors.
+{% hint style="info" %}
 
-## Configuration Parameters
+Only [YAML configuration files](../../administration/configuring-fluent-bit/yaml/README.md) support processors.
+
+{% endhint %}
+
+## Contexts
+
+The content modifier relies on _context_, meaning the place where the content modification will happen. Fluent Bit provides different contexts to manipulate the desired information.
+
+The following contexts are available:
+
+| Name | Telemetry type | Description |
+| ---- | -------------- | ----------- |
+| `attributes` | Logs | Modifies the attributes or metadata of a log record. |
+| `body` | Logs | Modifies the content of a log record. |
+| `span_name` | Traces | Modifies the name of a span. |
+| `span_kind` | Traces | Modifies the kind of a span. |
+| `span_status` | Traces | Modifies the status of a span. |
+| `span_attributes` | Traces | Modifies the attributes of a span. |
+
+
+### OpenTelemetry contexts
+
+Additionally, Fluent Bit provides specific contexts for modifying data that follows the OpenTelemetry log schema. All of these contexts operate on shared data across a group of records.
+
+The following contexts are available:
+
+| Name | Telemetry type | Description |
+| ---- | -------------- | ----------- |
+| `otel_resource_attributes` | Logs | Modifies the attributes of the log resource. |
+| `otel_scope_name` | Logs | Modifies the name of a log scope. |
+| `otel_scope_version` | Logs | Modifies version of a log scope. |
+| `otel_scope_attributes` | Logs | Modifies the attributes of a log scope. |
+
+
+{% hint style="info" %}
+
+If your data doesn't follow the OpenTelemetry log schema, but your log destination expects to be in that format, you can use the [OpenTelemetry envelope](opentelemetry-envelope.md) processor to transform your data. You can then pass that transformed data through the content modifier filter and use OpenTelemetry contexts accordingly.
+
+{% endhint %}
+
+## Configuration parameters
+
+The following configuration parameters are available:
 
 | Key         | Description |
-| :---------- | :--- |
-| action | Define the operation to run on the target content. This field is mandatory; for more details about the actions available, check the table below. |
-| context | Specify which component of the Telemetry type will be affected. When processing Logs the following contexts are available:  `attributes`  or `body`. When processing Traces the following contexts are available: `span_name`, `span_kind`, `span_status`, `span_attributes`. |
-| key | Specify the name of the key that will be used to apply the modification. |
-| value | Based on the action type, `value` might required and represent different things. Check the detailed information for the specific actions. |
-| pattern | Defines a regular expression pattern. This property is only used by the `extract` action. |
-| converted_type | Define the data type to perform the conversion, the available options are: `string`, `boolean`, `int` and `double` . |
+| ----------- | ----------- |
+| `context` | Specifies the [context](#contexts) where the modifications will happen. |
+| `key` | Specifies the name of the key that will be used to apply the modification. |
+| `value` | The role of this parameter changes based on the [action](#actions) type. |
+| `pattern` | Defines a regular expression pattern. This property is only used by the `extract` [action](#actions). |
+| `converted_type` | Defines the data type to perform the conversion. Possible values: `string`, `boolean`, `int` and `double`. |
 
 ### Actions
 
-The actions specify the type of operation to run on top of a specific key or content from a Log or a Trace. The following actions are available:
+The actions specify the type of operation to run on top of a specific key or content from a log or a trace. The following actions are available:
 
 | Action  | Description                                                  |
 | ------- | ------------------------------------------------------------ |
-| insert  | Insert a new key with a value into the target context. The `key` and `value` parameters are required. |
-| upsert  | Given a specific key with a value, the `upsert` operation will try to update the value of the key. If the key does not exist, the key will be created. The `key` and `value` parameters are required. |
-| delete  | Delete a key from the target context. The `key` parameter is required. |
-| rename  | Change the name of a key. The `value` set in the configuration will represent the new name. The `key` and `value` parameters are required. |
-| hash    | Replace the key value with a hash generated by the SHA-256 algorithm, the binary value generated is finally set as an hex string representation. The `key` parameter is required. |
-| extract | Allows to extact the value of a single key as a list of key/value pairs. This action needs the configuration of a regular expression in the  `pattern` property . The `key` and `pattern` parameters are required.  For more details check the examples below. |
-| convert | Convert the data type of a key value. The `key` and `converted_type` parameters are required. |
+| `insert`  | Inserts a new key with a value into the target context. The `key` and `value` parameters are required. |
+| `upsert`  | Given a specific key with a value, the `upsert` operation will try to update the value of the key. If the key doesn't exist, a new key will be created. The `key` and `value` parameters are required. |
+| `delete`  | Deletes a key from the target context. The `key` parameter is required. |
+| `rename`  | Changes the name of a key. The `value` set in the configuration will represent the new name. The `key` and `value` parameters are required. |
+| `hash`    | Replaces the key value with a hash generated by the SHA-256 algorithm, the binary value generated is finally set as a hex string representation. The `key` parameter is required. |
+| `extract` | Extracts the value of a single key as a list of key/value pairs. This action needs the configuration of a regular expression in the  `pattern` property. The `key` and `pattern` parameters are required. |
+| `convert` | Converts the data type of a key value. The `key` and `converted_type` parameters are required. |
 
 #### Insert example
 
 The following example appends the key `color` with the value `blue` to the log stream.
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
   inputs:
@@ -47,16 +91,23 @@ pipeline:
             action: insert
             key: "color"
             value: "blue"
+
   outputs:
     - name : stdout
       match: '*'
       format: json_lines
 ```
 
+{% endtab %}
+{% endtabs %}
+
 #### Upsert example
 
 Update the value of `key1` and insert `key2`:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
   inputs:
@@ -74,19 +125,23 @@ pipeline:
             action: upsert
             key: "key2"
             value: "example"
-            
+
   outputs:
     - name : stdout
       match: '*'
       format: json_lines
-
 ```
 
+{% endtab %}
+{% endtabs %}
 
 #### Delete example
 
 Delete `key2` from the stream:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
   inputs:
@@ -97,18 +152,24 @@ pipeline:
         logs:
           - name: content_modifier
             action: delete
-            key: "key2"   
-         
+            key: "key2"
+
   outputs:
     - name : stdout
       match: '*'
       format: json_lines
 ```
 
+{% endtab %}
+{% endtabs %}
+
 #### Rename example
 
 Change the name of `key2` to `test`:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
   inputs:
@@ -128,10 +189,16 @@ pipeline:
       format: json_lines
 ```
 
+{% endtab %}
+{% endtabs %}
+
 #### Hash example
 
 Apply the SHA-256 algorithm for the value of the key `password`:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
   inputs:
@@ -150,11 +217,15 @@ pipeline:
       format: json_lines
 ```
 
-
+{% endtab %}
+{% endtabs %}
 
 #### Extract example
 
-By using a domain address, perform a extraction of the components of it as a list of key value pairs:
+By using a domain address, perform an extraction of the components of it as a list of key value pairs:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
 ```yaml
 pipeline:
@@ -168,19 +239,23 @@ pipeline:
             action: extract
             key: "http.url"
             pattern: ^(?<http_protocol>https?):\/\/(?<http_domain>[^\/\?]+)(?<http_path>\/[^?]*)?(?:\?(?<http_query_params>.*))?
-            
+
   outputs:
     - name : stdout
       match: '*'
       format: json_lines
 ```
 
-
+{% endtab %}
+{% endtabs %}
 
 #### Convert example
 
 Both keys in the example are strings. Convert the `key1` to a double/float type and `key2` to a boolean:
 
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
 ```yaml
 pipeline:
   inputs:
@@ -198,9 +273,12 @@ pipeline:
             action: convert
             key: key2
             converted_type: boolean
-            
+
   outputs:
     - name : stdout
       match: '*'
       format: json_lines
 ```
+
+{% endtab %}
+{% endtabs %}
diff --git a/pipeline/processors/filters.md b/pipeline/processors/filters.md
new file mode 100644
index 000000000..9879f2b94
--- /dev/null
+++ b/pipeline/processors/filters.md
@@ -0,0 +1,36 @@
+# Filters as processors
+
+You can use any [filter](../filters/README.md) as a processor in Fluent Bit.
+
+{% hint style="info" %}
+
+Only [YAML configuration files](../../administration/configuring-fluent-bit/yaml/README.md) support processors.
+
+{% endhint %}
+
+## Grep example
+
+In this example, the [Grep](../filters/grep.md) filter is an output processor that sends log records only if they match a specified regular expression.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: tail
+      path: lines.txt
+      parser: json
+
+  outputs:
+    - name: stdout
+      match: '*'
+
+      processors:
+        logs:
+          - name: grep
+            regex: log aa
+```
+
+{% endtab %}
+{% endtabs %}
\ No newline at end of file
diff --git a/pipeline/processors/labels.md b/pipeline/processors/labels.md
new file mode 100644
index 000000000..c6a902b06
--- /dev/null
+++ b/pipeline/processors/labels.md
@@ -0,0 +1,146 @@
+# Labels
+
+The _labels_ processor lets you manipulate the labels of metrics.
+
+Similar to filters, this processor presents an enriching/modifying mechanism to perform operations for labels manipulation. The most significant difference is that processors perform better than filters, and when chaining them there are no encoding or decoding performance penalties.
+
+{% hint style="info" %}
+
+Only [YAML configuration files](../../administration/configuring-fluent-bit/yaml/README.md) support processors.
+
+{% endhint %}
+
+## Configuration parameters
+
+| Key | Description |
+| --- | ----------- |
+| `update` | Updates an existing key with a value into metrics. The key/value pair is required. If the specified key doesn't exist, the operation silently fails and has no effect. |
+| `insert` | Inserts a new key with a value into metrics. The key/value pair is required. |
+| `upsert` | Upserts a specific key with a value, the `upsert` operation will try to update the value of the key. If the specified key doesn't exist, a new key will be created. The key/value pair is required. |
+| `delete` | Deletes a key from the labels of metrics. The key/value pair is required. If the specified key doesn't exist, the operation silently fails and has no effect. |
+| `hash` | Replaces the key value with a hash generated by the SHA-256 algorithm from the specified label name. The generated binary value is set as a hex string. |
+
+### Update example
+
+The following example changes the value of the `name` key to `fluentbit`:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: fluentbit_metrics
+
+      processors:
+        metrics:
+          - name: labels
+            update: name fluentbit
+  
+  outputs:
+    - name : stdout
+      match: '*'
+```
+
+{% endtab %}
+{% endtabs %}
+
+### Insert example
+
+The following example appends the key `agent` with the value `fluentbit` as the label of metrics:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: fluentbit_metrics
+
+      processors:
+        metrics:
+          - name: labels
+            insert: agent fluentbit
+
+  outputs:
+    - name : stdout
+      match: '*'
+```
+
+{% endtab %}
+{% endtabs %}
+
+### Upsert example
+
+The following example upserts the value of `name` and inserts `fluentbit`:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: fluentbit_metrics
+
+      processors:
+        metrics:
+          - name: labels
+            upsert: name fluentbit
+  
+  outputs:
+    - name : stdout
+      match: '*'
+```
+
+{% endtab %}
+{% endtabs %}
+
+### Delete example
+
+The following example deletes the `name` key from metrics:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: fluentbit_metrics
+
+      processors:
+        metrics:
+          - name: labels
+            delete: name
+  
+  outputs:
+    - name : stdout
+      match: '*'
+```
+
+{% endtab %}
+{% endtabs %}
+
+### Hash example
+
+The following example applies the SHA-1 algorithm for the value of the key `hostname`:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+pipeline:
+  inputs:
+    - name: fluentbit_metrics
+
+      processors:
+        metrics:
+          - name: labels
+            hash: hostname
+
+  outputs:
+    - name : stdout
+      match: '*'
+```
+
+{% endtab %}
+{% endtabs %}
\ No newline at end of file
diff --git a/pipeline/processors/metrics-selector.md b/pipeline/processors/metrics-selector.md
index 962577ad3..e42384f06 100644
--- a/pipeline/processors/metrics-selector.md
+++ b/pipeline/processors/metrics-selector.md
@@ -1,24 +1,43 @@
-# Metrics Selector
+# Metrics selector
 
-The **metric_selector** processor allows you to select metrics to include or exclude (similar to the `grep` filter for logs).
+The _metrics selector_ processor lets you choose which metrics to include or exclude, similar to the [grep](../filters/grep.md) filter for logs.
 
-## Configuration Parameters <a id="config"></a>
+## Configuration parameters
 
-The native processor plugin supports the following configuration parameters:
+The metrics selector processor supports the following configuration parameters:
 
-| Key         | Description | Default |
-| :---------- | :--- | :--- |
-| Metric\_Name | Keep metrics in which the metric of name matches with the actual name or the regular expression. | |
-| Context | Specify matching context. Currently, metric_name is only supported. | `Metrics_Name` |
-| Action | Specify the action for specified metrics. INCLUDE and EXCLUDE are allowed. | |
-| Operation\_Type | Specify the operation type of action for metrics payloads. PREFIX and SUBSTRING are allowed. | |
+| Key | Description | Default |
+| --- | ----------- | ------- |
+| `metric_name` | The string that determines which metrics are affected by this processor, depending on the active [matching operation](#matching-operations). | _none_ |
+| `context` | Specifies matching context. Possible values: `metric_name` or `delete_label`. | `metrics_name` |
+| `action` | Specifies whether to include or exclude matching metrics. Possible values: `INCLUDE` or `EXCLUDE`. | _none_ |
+| `operation_type` | Specifies the [matching operation](#matching-operations) to apply to the value of `metric_name`. Possible values: `PREFIX` or `SUBSTRING`. | _none_ |
+| `label` | Specifies a label key and value pair. | _none_ |
 
-## Configuration Examples <a id="config_example"></a>
+## Matching operations
 
-Here is a basic configuration example.
+The metrics selector processor has these matching operations: prefix matching and substring matching.
+
+### Prefix matching
+
+Prefix matching compares the value of `metric_name` to the beginning of each incoming metric name. For example, the value `fluentbit_input` results in a match for metrics named `fluentbit_input_records`, but not for metrics named `total_fluentbit_input`.
+
+If no `operation_type` value is specified, and if the value of `metric_name` is a standard string, the metrics selector processor defaults to prefix matching.
+
+### Substring matching
+
+Substring matching treats the value of `metric_name` as a regular expression pattern, and compares this pattern against each incoming metric name accordingly. This pattern can appear anywhere within the name of the incoming metric. For example, the value `bytes` results in a match for both metrics named `bytes_total` and metrics named `input_bytes_count`.
+
+If the value of `metric_name` is a string wrapped in forward slashes (for example, `metric_name: /storage..*/`), the metrics selector processor defaults to substring matching, regardless of whether an `operation_type` value is specified. This means that a `metric_name` value wrapped in forward slashes will always use substring matching, even if `operation_type` is set to `PREFIX`.
+
+However, if `operation_type` is explicitly set to `SUBSTRING`, you don't need to wrap the value of `metric_name` in forward slashes.
+
+## Configuration examples
+
+The following examples show possible configurations of the metrics selector processor.
+
+### Without `context`
 
-{% tabs %}
-{% tab title="fluent-bit.yaml" %}
 ```yaml
 service:
   flush: 5
@@ -36,6 +55,7 @@ pipeline:
           - name: metrics_selector
             metric_name: /storage/
             action: include
+       
           - name: metrics_selector
             metric_name: /fs/
             action: exclude
@@ -43,19 +63,35 @@ pipeline:
           - name: labels
             delete: name
 
-
   outputs:
     - name: stdout
       match: '*'
 ```
-{% endtab %}
-{% endtabs %}
 
+### With `context`
+
+```yaml
+service:
+  flush: 5
+  daemon: off
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: fluentbit_metrics
+      tag: fluentbit.metrics
+      scrape_interval: 10
+
+      processors:
+        metrics:
+          - name: metrics_selector
+            context: delete_label_value
+            label: name stdout.0
 
-All processors are only valid with the YAML configuration format. 
-Processor configuration should be located under the relevant input or output plugin configuration.
+          - name: labels
+            delete: name
 
-Metric\_Name parameter will translate the strings which is quoted with backslashes `/.../` as Regular expressions.
-Without them, users need to specify Operation\_Type whether prefix matching or substring matching.
-The default operation is prefix matching.
-For example, `/chunks/` will be translated as a regular expression.
+  outputs:
+    - name: stdout
+      match: '*'
+```
\ No newline at end of file
diff --git a/pipeline/processors/opentelemetry-envelope.md b/pipeline/processors/opentelemetry-envelope.md
new file mode 100644
index 000000000..d22662adb
--- /dev/null
+++ b/pipeline/processors/opentelemetry-envelope.md
@@ -0,0 +1,181 @@
+# OpenTelemetry envelope
+
+The _OpenTelemetry envelope_ processor transforms your data to be compatible with the OpenTelemetry log schema. If your data wasn't generated by the [OpenTelemetry input plugin](../inputs/opentelemetry.md), you can use this processor before sending that data to a destination that expects an OpenTelemetry-compatible schema.
+
+![OpenTelemetry envelope transformation](../../.gitbook/assets/processor_opentelemetry_envelope.png)
+
+{% hint style="info" %}
+
+Only [YAML configuration files](../../administration/configuring-fluent-bit/yaml/README.md) support processors.
+
+{% endhint %}
+
+## Configuration parameters
+
+The OpenTelemetry envelope processor doesn't use configuration parameters.
+
+## Examples
+
+The following example uses the `dummy` input plugin to generate one sample message per second, then transforms those messages by using the `opentelemetry_envelope` processor. The resulting transformed data is sent to `stdout` and the `opentelemetry` output plugin.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"message": "Hello World"}'
+
+      processors:
+        logs:
+          - name: opentelemetry_envelope
+
+  outputs:
+    - name : stdout
+      match: '*'
+
+    - name: opentelemetry
+      match: '*'
+      host: 127.0.0.1
+      port: 4318
+```
+
+{% endtab %}
+{% tab title="otel-collector.yaml" %}
+
+```yaml
+receivers:
+  otlp:
+    protocols:
+      http:
+        endpoint: 127.0.0.1:4318
+
+exporters:
+  file:
+    path: out.json
+  logging:
+    loglevel: info
+
+service:
+  telemetry:
+    logs:
+      level: debug
+  pipelines:
+    logs:
+      receivers: [otlp]
+      exporters: [file, logging]
+```
+
+{% endtab %}
+{% endtabs %}
+
+The standard output of Fluent Bit prints the raw representation of the schema. However, the OpenTelemetry collector receives the data in an OpenTelemetry-compatible format.
+
+If you inspect the `out.json` output file, you will see OpenTelemetry-compatible data, similar to the following:
+
+
+```json
+{
+  "resourceLogs": [
+    {
+      "resource": {},
+      "scopeLogs": [
+        {
+          "scope": {},
+          "logRecords": [
+            {
+              "timeUnixNano": "1722904188085758000",
+              "body": {
+                "stringValue": "dummy"
+              },
+              "traceId": "",
+              "spanId": ""
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
+```
+
+If you're interested in additional transformations, you can also use the [content modifier](../processors/content-modifier.md) processor to modify the content of your logs. The following example shows how to add resource and scope attributes to logs:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+
+pipeline:
+  inputs:
+    - name: dummy
+      dummy: '{"message": "Hello World"}'
+
+      processors:
+        logs:
+          - name: opentelemetry_envelope
+
+          - name: content_modifier
+            context: otel_resource_attributes
+            action: upsert
+            key: service.name
+            value: my-service
+
+  outputs:
+    - name : stdout
+      match: '*'
+
+    - name: opentelemetry
+      match: '*'
+      host: 127.0.0.1
+      port: 4318
+```
+
+{% endtab %}
+{% endtabs %}
+
+The collector JSON output will resemble the following:
+
+```json
+{
+  "resourceLogs": [
+    {
+      "resource": {
+        "attributes": [
+          {
+            "key": "service.name",
+            "value": {
+              "stringValue": "my-service"
+            }
+          }
+        ]
+      },
+      "scopeLogs": [
+        {
+          "scope": {},
+          "logRecords": [
+            {
+              "timeUnixNano": "1722904465173450000",
+              "body": {
+                "stringValue": "Hello World"
+              },
+              "traceId": "",
+              "spanId": ""
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
+```
+
+For more details about further processing, read the [content modifier](../processors/content-modifier.md) processor documentation.
\ No newline at end of file
diff --git a/pipeline/processors/sampling.md b/pipeline/processors/sampling.md
new file mode 100644
index 000000000..8232de6bd
--- /dev/null
+++ b/pipeline/processors/sampling.md
@@ -0,0 +1,454 @@
+# Sampling
+
+The _sampling_ processor uses an extendable architecture that supports multiple trace sampling strategies and backends. It provides you with the ability to apply head or tail sampling to incoming trace telemetry data.
+
+{% hint style="info" %}
+
+Only [YAML configuration files](../../administration/configuring-fluent-bit/yaml/README.md) support processors.
+
+{% endhint %}
+
+## Configuration parameters
+
+This processor uses the following configuration parameters:
+
+| Key | Description |
+| --- | ----------- |
+| `type` | The type of sampling to perform. Possible values: `probabilistic` ([head sampling](#head-sampling)) or `tail` ([tail sampling](#tail-sampling)). |
+| `sampling_settings` | Contains key/value pairs for different sampling settings. These settings vary by `type`. |
+| `conditions` | An array of objects where each object specifies a different [condition](#conditions) for `tail` sampling. The possible items in each object vary by `conditions.type`. |
+
+## Head sampling
+
+Head sampling makes the decision whether to keep a trace at the very beginning of its ingestion. This is when a root span is created but before the request is actually fulfilled.
+
+![Head sampling diagram](../../.gitbook/assets/traces_head_sampling.png)
+
+Head sampling uses the following `sampling_settings` configuration parameters:
+
+| Key | Description |
+| --- | :---------- |
+| `sampling_percentage` | Sets the probability of sampling trace. Must be a value between `0` and `100`. For example, `40` samples 40% of traces randomly. |
+
+This example uses head sampling to process a smaller percentage of the overall ingested traces and spans. It accomplishes this by setting up the pipeline to ingest on the OpenTelemetry defined port using the OpenTelemetry Protocol (OTLP). The `processor` section defines traces for head sampling and the percentage of traces and spans to forward to the specified output plugins.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+  hot_reload: on
+
+pipeline:
+  inputs:
+    - name: opentelemetry
+      port: 4318
+
+      processors:
+        traces:
+          # Head sampling of traces (percentage)
+          - name: sampling
+            type: probabilistic
+            sampling_settings:
+            sampling_percentage: 40
+
+  outputs:
+    - name: stdout
+      match: "*"
+```
+
+{% endtab %}
+{% endtabs %}
+
+With this head sampling configuration, a sample set of ingested traces will randomly send 40% of the total traces to standard output.
+
+## Tail sampling
+
+Tail sampling offers a more selective and fine-grained control over the collection of traces and spans. It evaluates the entire trace when making a sampling decision and can inspect the metadata and status of traces to inform the decision.
+
+![Tail sampling diagram](../../.gitbook/assets/traces_tail_sampling.png)
+
+Tail sampling uses the following `sampling_settings` configuration parameters:
+
+| Key | Description | Default |
+| --- | :---------- | ------- |
+| `decision_wait` | Specifies how long to buffer spans before making a sampling decision, allowing full trace evaluation. | `30s` |
+| `max_traces` | Specifies the maximum number of traces that can be held in memory. When the limit is reached, the oldest trace is deleted. | _none_ |
+
+### Conditions
+
+Tail sampling supports different conditions. These conditions determine whether a trace meets specified criteria.
+
+The following condition are available:
+
+- [Latency](#latency)
+- [Span count](#span-count)
+- [Status code](#status-code)
+- [String attribute](#string-attribute)
+- [Numeric attribute](#numeric-attribute)
+- [Boolean attribute](#boolean-attribute)
+- [Trace state](#trace-state)
+
+#### Latency
+
+This condition samples traces based on span duration. It uses `threshold_ms_low` to capture short traces and `threshold_ms_high` for long traces.
+
+The latency condition uses the following `conditions` configuration parameters:
+
+| Key | Description | Default |
+| --- | ----------- | --------|
+| `type` | Sets the condition type. For the latency condition, this value must be `latency`. | _none_ |
+| `threshold_ms_low` | Specifies the lower latency threshold. Traces with a duration less than or equal to this value will be sampled. | `0` |
+| `threshold_ms_high` | Specifies the upper latency threshold. Traces with a duration greater than or equal to this value will be sampled. | `0` |
+
+The following example waits five seconds before making a decision. It then samples traces based on latency, capturing short traces of 200&nbsp;ms or less and long traces of 3000&nbsp;ms or more. Traces between 200&nbsp;ms and 3000&nbsp;ms won't be sampled unless another condition applies.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+  hot_reload: on
+
+pipeline:
+  inputs:
+    - name: opentelemetry
+      port: 4318
+
+      processors:
+        traces:
+          # Tail sampling of traces (latency)
+          - name: sampling
+            type: tail
+            sampling_settings:
+              decision_wait: 5s
+              conditions:
+                - type: latency
+                  threshold_ms_low: 200
+                  threshold_ms_high: 3000
+
+  outputs:
+    - name: stdout
+      match: "*"
+```
+
+{% endtab %}
+{% endtabs %}
+
+#### Span count
+
+This condition samples traces that have specific span counts defined in a configurable range. It uses `min_spans` and `max_spans` to specify the number of spans a trace can have to be sampled.
+
+The span count condition uses the following `conditions` configuration parameters:
+
+| Key | Description | Default |
+| --- | ----------- | --------|
+| `type` | Sets the condition type. For the span count condition, this value must be `span_count`. | _none_ |
+| `max_spans` | Specifies the minimum number of spans a trace must have to be sampled. | _none_ |
+| `min_spans` | Specifies the maximum number of spans a trace can have to be sampled.  | _none_ |
+
+The following example configuration waits five seconds before making a decision. It then samples traces with at least three spans but no more than five spans. Traces with less than three spans or greater than five spans won't be sampled unless another condition applies.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+  hot_reload: on
+
+pipeline:
+  inputs:
+    - name: opentelemetry
+      port: 4318
+
+      processors:
+        traces:
+          # Tail sampling of traces (span_count)
+          - name: sampling
+            type: tail
+            sampling_settings:
+              decision_wait: 5s
+              conditions:
+                - type: span_count
+                  min_spans: 3
+                  max_spans: 5
+
+  outputs:
+    - name: stdout
+      match: "*"
+```
+
+{% endtab %}
+{% endtabs %}
+
+#### Status code
+
+This condition samples traces based on span status codes (`OK`, `ERROR`, `UNSET`).
+
+The status code condition uses the following `conditions` configuration parameters:
+
+| Key | Description | Default |
+| --- | ----------- | --------|
+| `type` | Sets the condition type. For the status code condition, this value must be `status_code`. | _none_ |
+| `status_codes` | Defines an array of span status codes (`OK`, `ERROR`, `UNSET`) to filter traces. Traces are sampled if any span matches a listed status code. For example, `status_codes: [ERROR, UNSET]` captures traces with errors or unset statuses. | _none_ |
+
+The following example configuration samples only spans with the `ERROR` status code.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+  hot_reload: on
+
+pipeline:
+  inputs:
+    - name: opentelemetry
+      port: 4318
+
+      processors:
+        traces:
+          # Tail sampling of traces (status_code)
+          - name: sampling
+            type: tail
+            sampling_settings:
+              decision_wait: 5s
+              conditions:
+                - type: status_code
+                  status_codes: [ERROR]
+
+  outputs:
+    - name: stdout
+      match: "*"
+```
+
+{% endtab %}
+{% endtabs %}
+
+#### String attribute
+
+This conditional lets you sample traces based on specific span or resource attributes. You can define key-value filters (for example, `http.method=POST`) to selectively capture relevant traces.
+
+The string attribute condition uses the following `conditions` configuration parameters:
+
+| Key | Description | Default |
+| --- | ----------- | --------|
+| `type` | Sets the condition type. For the string attribute condition, this value must be `string_attribute`. | _none_ |
+| `key` | Specifies the span or resource attribute to match (for example, `"service.name"`). | _none_ |
+| `values` | Defines an array of accepted values for the attribute. A trace is sampled if any span contains a matching key-value pair: `["payment-processing"]` | _none_ |
+| `match_type` | Defines how attributes are compared: `strict` ensures exact value matching (and is case-sensitive), `exists` checks if the attribute is present regardless of its value, and `regex` uses regular expression pattern matching. | `strict` |
+
+The following example configuration waits two seconds before making a decision. It then samples traces based on string matching key-value pairs:
+
+- Traces with `http.method` exactly equal to `GET`
+- Traces that have a `service.name` attribute (any value)
+- Traces with `http.url` starting with `https://api.` or ending with `/health`
+- Traces with `error.message` containing timeout, connection failed, or rate limit patterns
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+  hot_reload: on
+
+pipeline:
+  inputs:
+    - name: opentelemetry
+      port: 4318
+
+      processors:
+        traces:
+          # Tail sampling of traces (string_attribute)
+          - name: sampling
+            type: tail
+            sampling_settings:
+              decision_wait: 2s
+              conditions:
+                # Exact matching
+                - type: string_attribute
+                  match_type: strict
+                  key: "http.method"
+                  values: ["GET"]
+
+                # Check if attribute exists
+                - type: string_attribute
+                  match_type: exists
+                  key: "service.name"
+
+                # Regex pattern matching
+                - type: string_attribute
+                  match_type: regex
+                  key: "http.url"
+                  values: ["^https://api\\..*", ".*\\/health$"]
+
+                # Multiple regex patterns for error conditions
+                - type: string_attribute
+                  match_type: regex
+                  key: "error.message"
+                  values: ["timeout.*", "connection.*failed", ".*rate.?limit.*"]
+
+  outputs:
+    - name: stdout
+      match: "*"
+```
+
+{% endtab %}
+{% endtabs %}
+
+#### Numeric attribute
+
+This condition samples traces based on numeric attribute values of a defined key where users can configure minimum and maximum thresholds.
+
+The numeric attribute condition uses the following `conditions` configuration parameters:
+
+| Key | Description | Default |
+| --- | ----------- | --------|
+| `type` | Sets the condition type. For the numeric attribute condition, this value must be `numeric_attribute`. | _none_ |
+| `key` | Specifies the span or resource attribute to match (for example, `"service.name"`). | _none_ |
+| `min_value`| The minimum inclusive value for the numeric attribute. Traces with values greater than or equal to the `min_value` are sampled. | _none_ |
+| `max_value` | The maximum inclusive value for the numeric attribute. Traces with values less than or equal to the `max_value` are sampled. | _none_ |
+| `match_type` | This defines how attribute values are evaluated: `strict` matches exact values, `exists` checks if the attribute is present, regardless of its value. | `strict` |
+
+The following example configuration samples only spans with the key `http.status code` with numeric values between `400` and `504` inclusive.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+  hot_reload: on
+
+pipeline:
+  inputs:
+    - name: opentelemetry
+      port: 4318
+
+      processors:
+        traces:
+          # Tail sampling of traces (status_code)
+          - name: sampling
+            type: tail
+            sampling_settings:
+              decision_wait: 5s
+              conditions:
+                - type: numeric_attribute
+                  key: "http.status_code"
+                  min_value: 400
+                  max_value: 504
+
+  outputs:
+    - name: stdout
+      match: "*"
+```
+
+{% endtab %}
+{% endtabs %}
+
+#### Boolean attribute
+
+This condition samples traces based on a boolean attribute value of a defined key. This allows for selection of traces based on flags such as error indicators or debug modes.
+
+The Boolean attribute condition uses the following `conditions` configuration parameters:
+
+| Key | Description | Default |
+| --- | ----------- | --------|
+| `type` | Sets the condition type. For the Boolean attribute condition, this value must be `boolean_attribute`. | _none_ |
+| `key` | Specifies the span or resource attribute to match (for example, `"service.name"`). | _none_ |
+| `value` | Expected boolean value: `true` or `false` | _none_ |
+
+The following example configuration waits two seconds before making a decision. It then samples traces that have the key `user.logged` set to `false`.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+  hot_reload: on
+
+pipeline:
+  inputs:
+    - name: opentelemetry
+      port: 4318
+
+      processors:
+        traces:
+          # Tail sampling of traces (boolean_attribute)
+          - name: sampling
+            type: tail
+            sampling_settings:
+              decision_wait: 2s
+              conditions:
+                - type: boolean_attribute
+                  key: "user.logged"
+                  value: false
+
+  outputs:
+    - name: stdout
+      match: "*"
+```
+
+{% endtab %}
+{% endtabs %}
+
+#### Trace state
+
+This condition samples traces based on metadata stored in the W3C `trace_state` field.
+
+The trace state condition uses the following `conditions` configuration parameters:
+
+| Key | Description | Default |
+| --- | ----------- | --------|
+| `type` | Sets the condition type. For the trace state condition, this value must be `trace_state`. | _none_ |
+| `values` | Defines a list of key, value pairs to match against the `trace_state`. A trace is sampled if any of the specified values exist in the `trace_state` field. Matching follows OR logic, meaning at least one value must be present for sampling to occur. | _none_ |
+
+Example configuration:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
+
+```yaml
+service:
+  flush: 1
+  log_level: info
+  hot_reload: on
+
+pipeline:
+  inputs:
+    - name: opentelemetry
+      port: 4318
+
+      processors:
+        traces:
+          # Tail sampling of traces (trace_state)
+          - name: sampling
+            type: tail
+            sampling_settings:
+              decision_wait: 2s
+              conditions:
+                - type: trace_state
+                  values: [debug=false, priority=high]
+
+  outputs:
+    - name: stdout
+      match: "*"
+```
+
+{% endtab %}
+{% endtabs %}
+
+For more details about further processing, read the [content modifier](../processors/content-modifier.md) processor documentation.
diff --git a/pipeline/processors/sql.md b/pipeline/processors/sql.md
index d1b06d461..4ade4b640 100644
--- a/pipeline/processors/sql.md
+++ b/pipeline/processors/sql.md
@@ -1,22 +1,27 @@
-# Structured Query Language (SQL)
+# SQL
 
-The **sql** processor provides a simple interface to select content from Logs by also supporting conditional expressions.
+The _SQL_ processor lets you use conditional expressions to select content from logs. This processor doesn't depend on a database or table. Instead, your queries run on the stream.
 
-Our SQL processor does not depend on a database or indexing; it runs everything on the fly (this is good). We don't have the concept of tables but you run the query on the STREAM.
+This processor differs from the stream processor interface that runs after filters.
 
-Note that this processor differs from the "stream processor interface" that runs after the filters; this one can only be used in the processor's section of the input plugins when using YAML configuration mode.
+{% hint style="info" %}
 
-## Configuration Parameters
+Only [YAML configuration files](../../administration/configuring-fluent-bit/yaml/README.md) support processors.
 
-| Key         | Description |
-| :---------- | :--- |
-| query | Define the SQL statement to run on top of the Logs stream; it must end with `;` . |
+{% endhint %}
 
+## Configuration parameters
 
+| Key | Description |
+| --- | ----------- |
+| `query` | The SQL statement to query your logs stream. This statement must end with `;`. |
 
-### Simple selection example
+## Basic selection example
 
-The following example generates a sample message with two keys called `key` and `http.url`. By using a simple SQL statement we will select only the key `http.url`. 
+The following example generates a sample message with the keys `key` and `http.url`, and then uses a SQL statement to select only the key `http.url`.
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
 ```yaml
 pipeline:
@@ -35,9 +40,15 @@ pipeline:
       format: json_lines
 ```
 
-### Extract and select example
+{% endtab %}
+{% endtabs %}
+
+## Extract and select example
 
-Similar to the example above, now we will extract the parts of `http.url` and only select the domain from the value, for that we will use together content-modifier and sql processors together:
+The following example is similar to the previous example, but additionally extracts part of `http.url` to select the domain from the value. To accomplish this, use the `content-modifier` and `sql` processors in tandem:
+
+{% tabs %}
+{% tab title="fluent-bit.yaml" %}
 
 ```yaml
 pipeline:
@@ -52,8 +63,8 @@ pipeline:
             key: "http.url"
             pattern: ^(?<http_protocol>https?):\/\/(?<http_domain>[^\/\?]+)(?<http_path>\/[^?]*)?(?:\?(?<http_query_params>.*))?
 
-          - name: sql
-            query: "SELECT http_domain FROM STREAM;"
+    - name: sql
+      query: "SELECT http_domain FROM STREAM;"
 
   outputs:
     - name : stdout
@@ -61,12 +72,14 @@ pipeline:
       format: json_lines
 ```
 
-the expected output of this pipeline will be something like this:
+{% endtab %}
+{% endtabs %}
+
+The resulting output resembles the following:
 
 ```json
 {
   "date": 1711059261.630668,
   "http_domain": "fluentbit.io"
 }
-```
-
+```
\ No newline at end of file
diff --git a/stream-processing/README.md b/stream-processing/README.md
deleted file mode 100644
index bf5f019c2..000000000
--- a/stream-processing/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Introduction
-
-![](https://github.com/fluent/fluent-bit-docs/tree/6bc4af039821d9e8bc1636797a25ad23b52a511f/stream-processing/imgs/stream_processor.png)
-
-[Fluent Bit](https://fluentbit.io) is a fast and flexible Log processor that aims to collect, parse, filter and deliver logs to remote databases, so Data Analysis can be performed.
-
-Data Analysis usually happens after the data is stored and indexed in a database, but for real-time and complex analysis needs, process the data while it's still in motion in the Log processor brings a lot of advantages and this approach is called **Stream Processing on the Edge**.
-
-[Fluent Bit](http://fluentbit.io) is part of the [Fluentd](http://fluentd.org) project ecosystem, it's licensed under the terms of the [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0). This project is made and sponsored by [Arm](https://www.arm.com) & [Treasure Data](https://www.treasuredata.com).
diff --git a/stream-processing/changelog.md b/stream-processing/changelog.md
index 745cd1b0a..f51dca6f1 100644
--- a/stream-processing/changelog.md
+++ b/stream-processing/changelog.md
@@ -1,6 +1,6 @@
 # Changelog
 
-Upon new versions of [Fluent Bit](https://fluentbit.io), the Stream Processor engine gets new improvements. In the following section you will find the details of the new additions in the major release versions.
+This page details new additions to the stream processor engine in major release versions of Fluent Bit.
 
 ## Fluent Bit v1.2
 
@@ -8,7 +8,7 @@ Upon new versions of [Fluent Bit](https://fluentbit.io), the Stream Processor en
 
 ### Sub-key selection and conditionals support
 
-It's pretty common that records contains nested maps or sub-keys. Now we provide the ability to use sub-keys to perform conditionals and keys selection. Consider the following record:
+Added the ability to use nested maps and sub-keys to perform conditions and key selections. For example, consider the following record:
 
 ```javascript
 {
@@ -30,26 +30,25 @@ SELECT key3['sub1']['sub2'] FROM STREAM:test WHERE key3['sub1']['sub2'] = 789;
 
 ### New @record functions
 
-On conditionals we have introduced the new _@record_ functions:
+For conditionals, added the new _@record_ functions:
 
 | Function | Description |
 | :--- | :--- |
-| @record.time\(\) | returns the record timestamp |
-| @record.contains\(key\) | returns true or false if _key_ exists in the record |
+| `@record.time()` | Returns the record timestamp. |
+| `@record.contains(key)` | Returns `true` or false if `key` exists in the record, or `false` if not. |
 
-### IS NULL, IS NOT NULL
+### `IS NULL` and `IS NOT NULL`
 
-We currently support different data types such as _strings_, _integers_, _floats_, _maps_ and _null_. In Fluent Bit, a _null_ value is totally valid and is not related to the absence of a value as in normal databases. To compare if an existing key in the record have a _null_ value or not, we have introduced _IS NULL_ and _IS NOT NULL_ statements, e.g:
+Added `IS NULL` and `IS NOT NULL` statements to determine whether an existing key in a record has a null value. For example:
 
 ```sql
 SELECT * FROM STREAM:test WHERE key3['sub1'] IS NOT NULL;
 ```
 
-For more details please review the section [Check Keys and NULL values](getting-started/check-keys-null-values.md)
+For more details, see [Check keys and null values](../stream-processing/getting-started/check-keys-null-values.md).
 
 ## Fluent Bit v1.1
 
-> Release date: May 09, 2019
-
-This is the initial version of the Stream Processor into Fluent Bit.
+> Release date: 2019-05-09
 
+Added the stream processor to Fluent Bit.
diff --git a/stream-processing/getting-started/README.md b/stream-processing/getting-started/README.md
index 0ae5515ac..86e9b2346 100644
--- a/stream-processing/getting-started/README.md
+++ b/stream-processing/getting-started/README.md
@@ -1,21 +1,9 @@
-# Getting Started
-
-The following guide assumes that you are familiar with [Fluent Bit](https://fluentbit.io), if that is not the case we suggest you review the official manual first:
-
-* [Fluent Bit Manual](https://docs.fluentbit.io/manual/)
-
-## Requirements
-
-* [Fluent Bit](https://fluentbit.io) &gt;= v1.1.0 or Fluent Bit from [GIT Master](https://github.com/fluent/fluent-bit)
-* Basic understanding of Structured Query Language \(SQL\)
-
-## Technical Concepts
+# Get started
 
 | Concept | Description |
 | :--- | :--- |
-| Stream | A Stream represents an unique flow of data being ingested by an Input plugin. By default Streams get a name using the plugin name plus an internal numerical identification, e.g: tail.0 . Stream name can be changed setting the _alias_ property. |
-| Task | Stream Processor configuration have the notion of Tasks that represents an execution unit, for short: SQL queries are configured in a Task. |
-| Results | When Stream Processor runs a SQL query, results are generated. These results can be re-ingested back into the main Fluent Bit pipeline or simply redirected to the standard output interfaces for debugging purposes. |
-| Tag | Fluent Bit group records and associate a Tag to them. Tags are used to define routing rules or in the case of the stream processor to attach to specific Tag that matches a pattern. |
-| Match | Matching rule that can use a wildcard to match specific records associated to a Tag. |
-
+| Stream | A stream is a single flow of data being ingested by an input plugin. By default, each stream name is the name of its input plugin plus a number (for example, `tail.0`). You can use the `alias` property to change this name. |
+| Task | A single execution unit. For example, a SQL query. |
+| Results | After a stream processor runs a SQL query, results are generated. You can re-ingest these results back into the main Fluent Bit pipeline or redirect them to the standard output interface for debugging purposes. |
+| Tag | Fluent Bit groups records and assigns tags to them. These tags define routing rules and can be used to apply stream processors to specific tags that match a pattern. |
+| Match | Matching rules can use a wildcard to match specific records associated with a tag. |
diff --git a/stream-processing/getting-started/check-keys-null-values.md b/stream-processing/getting-started/check-keys-null-values.md
index 0ec4f2cb5..183da6370 100644
--- a/stream-processing/getting-started/check-keys-null-values.md
+++ b/stream-processing/getting-started/check-keys-null-values.md
@@ -1,22 +1,20 @@
-# Check Keys and NULL values
+# Check keys and null values
 
-> Feature available on Fluent Bit &gt;= 1.2
+When working with structured messages (also known as records), there are certain cases where you might want to confirm whether a key exists, and whether its value is null or not null.
 
-When working with structured messages \(records\), there are certain cases where we want to know if a key exists, if it value is _null_ or have a value different than _null_.
+In Fluent Bit, records are a binary serialization of maps with keys and value. A value can be `null`, which is a valid data type. The following statements can be applied in Fluent Bit SQL:
 
-[Fluent Bit](https://fluentbit.io) internal records are a binary serialization of maps with keys and values. A value can be _null_ which is a valid data type. In our SQL language we provide the following statements that can be applied to the conditionals statements:
+## Check if a key value is null
 
-## Check if a key value IS NULL
-
-The following SQL statement can be used to retrieve all records from stream _test_ where the key called _phone_ has a _null_ value:
+The following statement retrieves all records from the stream `test` where the key `phone` has a value of `null`:
 
 ```sql
 SELECT * FROM STREAM:test WHERE phone IS NULL;
 ```
 
-## Check if a key value IS NOT NULL
+## Check if a key value is not null
 
-Similar to the example above, there are cases where we want to retrieve all records that certain key value have something different than _null_:
+The following statement is similar to the previous example, but instead retrieves all records from the stream `test` where the key `phone` has a non-null value:
 
 ```sql
 SELECT * FROM STREAM:test WHERE phone IS NOT NULL;
@@ -24,15 +22,14 @@ SELECT * FROM STREAM:test WHERE phone IS NOT NULL;
 
 ## Check if a key exists
 
-Another common use-case is to check if certain key exists in the record. We provide specific record functions that can be used in the conditional part of the SQL statement. The prototype of the function to check if a key exists in the record is the following:
+You can also confirm whether a certain key exists in a record at all, regardless of its value. Fluent Bit provides specific record functions that you can use in the condition part of the SQL statement. The following function determines whether `key` exists in a record:
 
-```text
+```sql
 @record.contains(key)
 ```
 
-The following example query all records that contains a key called _phone_:
+For example, the following statement retrieves all records that contain a key called `phone`:
 
 ```sql
 SELECT * FROM STREAM:test WHERE @record.contains(phone);
 ```
-
diff --git a/stream-processing/getting-started/fluent-bit-sql.md b/stream-processing/getting-started/fluent-bit-sql.md
index 798b62817..35545b085 100644
--- a/stream-processing/getting-started/fluent-bit-sql.md
+++ b/stream-processing/getting-started/fluent-bit-sql.md
@@ -1,14 +1,14 @@
-# Fluent Bit + SQL
+# Fluent Bit and SQL
 
-Fluent Bit stream processor uses common SQL to perform record queries. The following section describe the features available and examples of it.
+Stream processing in Fluent Bit uses SQL to perform record queries.
 
-## Statements
+For more information, see the [stream processing README file](https://github.com/fluent/fluent-bit/tree/master/src/stream_processor).
 
-You can find the detailed query language syntax in BNF form [here](https://github.com/fluent/fluent-bit/tree/master/src/stream_processor). The following section will be a brief introduction on how to write SQL queries for Fluent Bit stream processing.
+## Statements
 
-### SELECT Statement
+Use the following SQL statements in Fluent Bit.
 
-#### Synopsis
+### `SELECT`
 
 ```sql
 SELECT results_statement
@@ -18,31 +18,29 @@ SELECT results_statement
   [GROUP BY groupby]
 ```
 
-#### Description
+Groups keys from records that originate from a specified stream, or from records that match a specific tag pattern.
 
-Select keys from records coming from a stream or records matching a specific Tag pattern. Note that a simple `SELECT` statement **not** associated from a stream creation will send the results to the standard output interface \(stdout\), useful for debugging purposes.
+{% hint style="info" %}
+A `SELECT` statement not associated with stream creation will send the results to the standard output interface, which can be helpful for debugging purposes.
+{% endhint %}
 
-The query allows filtering the results by applying a condition using `WHERE` statement. We will explain `WINDOW` and `GROUP BY` statements later in aggregation functions section.
+You can filter the results of this query by applying a condition by using a `WHERE` statement. For information about the `WINDOW` and `GROUP BY` statements, see [Aggregation functions](#aggregation-functions).
 
-#### Examples
+#### Examples [#select-examples]
 
-Select all keys from records coming from a stream called _apache_:
+Selects all keys from records that originate from a stream called `apache`:
 
 ```sql
 SELECT * FROM STREAM:apache;
 ```
 
-Select code key from records which Tag starts with _apache._:
+Selects the `code` key from records with tags whose name begins with `apache`:
 
 ```sql
 SELECT code AS http_status FROM TAG:'apache.*';
 ```
 
-> Since the TAG selector allows the use of wildcards, we put the value between single quotes.
-
-### CREATE STREAM Statement
-
-#### Synopsis
+### `CREATE STREAM`
 
 ```sql
 CREATE STREAM stream_name
@@ -50,169 +48,130 @@ CREATE STREAM stream_name
   AS select_statement
 ```
 
-#### Description
+Creates a new stream of data using the results from a `SELECT` statement. If the `Tag` property in the `WITH` statement is set, this new stream can optionally be re-ingested into the Fluent Bit pipeline.
 
-Create a new stream of data using the results from the `SELECT` statement. New stream created can be optionally re-ingested back into Fluent Bit pipeline if the property _Tag_ is set in the WITH statement.
+#### Examples [#create-stream-examples]
 
-#### Examples
-
-Create a new stream called _hello_ from stream called _apache_:
+Creates a new stream called `hello_` from a stream called `apache`:
 
 ```sql
 CREATE STREAM hello AS SELECT * FROM STREAM:apache;
 ```
 
-Create a new stream called hello for all records which original Tag starts with _apache_:
+Creates a new stream called `hello` for all records whose original tag name begins with `apache`:
 
 ```sql
 CREATE STREAM hello AS SELECT * FROM TAG:'apache.*';
 ```
 
-## Aggregation Functions
-
-Aggregation functions are used in `results_statement` on the keys, allowing to perform data calculation on groups of records. Group of records that aggregation functions apply on are determined by `WINDOW` keyword. When `WINDOW` is not specified, aggregation functions apply on the current buffer of records received, which may have non-deterministic number of elements. Aggregation functions can be applied on records in a window of a specific time interval \(see the syntax of `WINDOW` in select statement\).
+## Aggregation functions
 
-Fluent Bit streaming currently supports tumbling window, which is non-overlapping window type. That means, a window of size 5 seconds performs aggregation computations on records over a 5-second interval, and then starts new calculations for the next interval.
+You can use aggregation functions in the `results_statement` on keys, which lets you perform data calculation on groups of records. These groups are determined by the `WINDOW` key. If `WINDOW` is unspecified, aggregation functions are applied to the current buffer of records received, which might have a non-deterministic number of elements. You can also apply aggregation functions to records in a window of a specific time interval.
 
-In addition, the syntax support `GROUP BY` statement, which groups the results by the one or more keys, when they have the same values.
+Fluent Bit uses a tumbling window, which is non-overlapping. For example, a window size of `5` performs aggregation computations on records during a five-second interval, then starts new calculations for the next interval.
 
-### AVG
+Additionally, you can use the `GROUP BY` statement to group results by one or more keys with matching values.
 
-#### Synopsis
+### `AVG`
 
 ```sql
 SELECT AVG(size) FROM STREAM:apache WHERE method = 'POST' ;
 ```
 
-#### Description
-
-Calculates the average of request sizes in POST requests.
+Calculates the average size of `POST` requests.
 
-### COUNT
-
-#### Synopsis
+### `COUNT`
 
 ```sql
-SELECT host, COUNT(*) FROM STREAM:apache WINDOW TUMBLING (5 SECOND) GROUP BY host;
+SELECT host, COUNT(*) FROM STREAM:apache WINDOW TUMBLING (X SECOND) GROUP BY host;
 ```
 
-#### Description
-
-Count the number of records in 5 second windows group by host IP addresses.
+Counts the number of records in a five-second window, grouped by host IP addresses.
 
-### MIN
-
-#### Synopsis
+### `MIN`
 
 ```sql
 SELECT MIN(key) FROM STREAM:apache;
 ```
 
-#### Description
-
-Gets the minimum value of a key in a set of records.
+Returns the minimum value of a key in a set of records.
 
-### MAX
-
-#### Synopsis
+### `MAX`
 
 ```sql
-SELECT MIN(key) FROM STREAM:apache;
+SELECT MAX(key) FROM STREAM:apache;
 ```
 
-#### Description
-
-Gets the maximum value of a key in a set of records.
+Returns the maximum value of a key in a set of records.
 
-### SUM
-
-#### Synopsis
+### `SUM`
 
 ```sql
 SELECT SUM(key) FROM STREAM:apache;
 ```
 
-#### Description
-
-Calculates the sum of all values of key in a set of records.
+Calculates the sum of all values of a key in a set of records.
 
-## Time Functions
+## Time functions
 
-Time functions adds a new key into the record with timing data
+Use time functions to add a new key with time data into a record.
 
-### NOW
-
-#### Synopsis
+### `NOW`
 
 ```sql
 SELECT NOW() FROM STREAM:apache;
 ```
 
-#### Description
-
-Add system time using format: %Y-%m-%d %H:%M:%S. Output example: 2019-03-09 21:36:05.
+Adds the current system time to a record using the format `%Y-%m-%d %H:%M:%S`. Output example: `2019-03-09 21:36:05`.
 
-### UNIX\_TIMESTAMP
-
-#### Synopsis
+### `UNIX_TIMESTAMP`
 
 ```sql
 SELECT UNIX_TIMESTAMP() FROM STREAM:apache;
 ```
 
-#### Description
-
-Add current Unix timestamp to the record. Output example: 1552196165 .
-
-## Record Functions
+Adds the current Unix time to a record. Output example: `1552196165`.
 
-Record functions append new keys to the record using values from the record context.
+## Record functions
 
-### RECORD\_TAG
+Use record functions to append new keys to a record using values from the record's context.
 
-#### Synopsis
+### `RECORD_TAG`
 
 ```sql
 SELECT RECORD_TAG() FROM STREAM:apache;
 ```
 
-#### Description
+Append tag string associated to the record as a new key.
 
-Append Tag string associated to the record as a new key.
-
-### RECORD\_TIME
-
-#### Synopsis
+### `RECORD_TIME`
 
 ```sql
 SELECT RECORD_TIME() FROM STREAM:apache;
 ```
 
-## WHERE Condition
+## `WHERE` condition
 
-Similar to conventional SQL statements, `WHERE` condition is supported in Fluent Bit query language. The language supports conditions over keys and subkeys, for instance:
+Similar to conventional SQL statements, Fluent Bit supports the `WHERE` condition. You can use this condition in both keys and subkeys. For example:
 
 ```sql
 SELECT AVG(size) FROM STREAM:apache WHERE method = 'POST' AND status = 200;
 ```
 
-It is possible to check the existence of a key in the record using record-specific function `@record.contains`:
+You can confirm whether a key exists in a record by using the record-specific function `@record.contains`:
 
 ```sql
 SELECT MAX(key) FROM STREAM:apache WHERE @record.contains(key);
 ```
 
-And to check if the value of a key is/is not `NULL`:
+To determine if the value of a key is `NULL`:
 
 ```sql
 SELECT MAX(key) FROM STREAM:apache WHERE key IS NULL;
 ```
 
+Or similar:
+
 ```sql
 SELECT * FROM STREAM:apache WHERE user IS NOT NULL;
 ```
-
-#### Description
-
-Append a new key with the record Timestamp in _double_ format: seconds.nanoseconds. Output example: 1552196165.705683 .
-
diff --git a/stream-processing/getting-started/hands-on.md b/stream-processing/getting-started/hands-on.md
index 1e17278c3..cc6b26218 100644
--- a/stream-processing/getting-started/hands-on.md
+++ b/stream-processing/getting-started/hands-on.md
@@ -1,55 +1,46 @@
-# Hands On! 101
+# Tutorial
 
-This article goes through very specific and simple steps to learn how Stream Processor works. For simplicity it uses a custom Docker image that contains the relevant components for testing.
+Follow this tutorial to learn more about stream processing.
 
 ## Requirements
 
-The following tutorial requires the following software components:
+This tutorial requires the following components:
 
-* [Fluent Bit](https://fluentbit.io) &gt;= v1.2.0
-* [Docker Engine](https://www.docker.com/products/docker-engine) \(not mandatory if you already have Fluent Bit binary installed in your system\)
+* Fluent Bit
+* [Docker Engine](https://www.docker.com/products/docker-engine)
+* A stream processing [sample file](https://raw.githubusercontent.com/fluent/fluent-bit-docs/37b477786d6e28eb223e08611c26ec93671a34ac/stream-processing/samples/sp-samples-1k.log)
 
-In addition download the following data [sample file](https://raw.githubusercontent.com/fluent/fluent-bit-docs/37b477786d6e28eb223e08611c26ec93671a34ac/stream-processing/samples/sp-samples-1k.log) \(130KB\).
+## Steps
 
-## Stream Processing using the command line
-
-For all next steps we will run Fluent Bit from the command line, and for simplicity we will use the official Docker image.
+These steps use the official Fluent Bit Docker image.
 
 ### 1. Fluent Bit version
 
-```bash
+Run the following command to confirm that Fluent Bit is installed and up-to-date:
+
+```shell
 $ docker run -ti fluent/fluent-bit:1.4 /fluent-bit/bin/fluent-bit --version
-Fluent Bit v1.8.2
+
+Fluent Bit v4.0.4
 ```
 
 ### 2. Parse sample files
 
-The samples file contains JSON records. On this command, we are appending the Parsers configuration file and instructing _tail_ input plugin to parse the content as _json_:
+The sample file contains JSON records. Run the following command to append the `parsers.conf` file and instruct the Tail input plugin to parse content as JSON:
 
-```bash
-$ docker run -ti -v `pwd`/sp-samples-1k.log:/sp-samples-1k.log      \
-     fluent/fluent-bit:1.8.2                                          \
-     /fluent-bit/bin/fluent-bit -R /fluent-bit/etc/parsers.conf     \
-                                -i tail -p path=/sp-samples-1k.log  \
-                                        -p parser=json              \
-                                        -p read_from_head=true      \ 
-                                -o stdout -f 1
+```shell
+docker run -ti -v `pwd`/sp-samples-1k.log:/sp-samples-1k.log  \
+  fluent/fluent-bit:1.8.2                                     \
+  /fluent-bit/bin/fluent-bit -R /fluent-bit/etc/parsers.conf  \
+  -i tail -p path=/sp-samples-1k.log  \
+  -p parser=json                      \
+  -p read_from_head=true              \
+  -o stdout -f 1
 ```
 
-The command above will simply print the parsed content to the standard output interface. The content will print the _Tag_ associated to each record and an array with two fields: record timestamp and record map:
+This command prints the parsed content to the standard output interface. The parsed content includes a tag associated with each record and an array with two fields: a timestamp and a record map:
 
 ```text
-Fluent Bit v1.8.2
-* Copyright (C) 2019-2021 The Fluent Bit Authors
-* Copyright (C) 2015-2018 Treasure Data
-* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
-* https://fluentbit.io
-
-[2019/05/08 13:34:16] [ info] [storage] initializing...
-[2019/05/08 13:34:16] [ info] [storage] in-memory
-[2019/05/08 13:34:16] [ info] [storage] normal synchronization mode, checksum disabled
-[2019/05/08 13:34:16] [ info] [engine] started (pid=1)
-[2019/05/08 13:34:16] [ info] [sp] stream processor started
 [0] tail.0: [1557322456.315513208, {"date"=>"22/abr/2019:12:43:51 -0600", "ip"=>"73.113.230.135", "word"=>"balsamine", "country"=>"Japan", "flag"=>false, "num"=>96}]
 [1] tail.0: [1557322456.315525280, {"date"=>"22/abr/2019:12:43:52 -0600", "ip"=>"242.212.128.227", "word"=>"inappendiculate", "country"=>"Chile", "flag"=>false, "num"=>15}]
 [2] tail.0: [1557322456.315532364, {"date"=>"22/abr/2019:12:43:52 -0600", "ip"=>"85.61.182.212", "word"=>"elicits", "country"=>"Argentina", "flag"=>true, "num"=>73}]
@@ -58,26 +49,24 @@ Fluent Bit v1.8.2
 [5] tail.0: [1557322456.315550927, {"date"=>"22/abr/2019:12:43:52 -0600", "ip"=>"132.113.203.169", "word"=>"fendered", "country"=>"United States", "flag"=>true, "num"=>53}]
 ```
 
-As of now there is no Stream Processing, on step \#3 we will start doing some basic queries.
-
-### 3. Selecting specific record keys
-
-This command introduces a Stream Processor \(SP\) query through the **-T** option and changes the output plugin to _null_, this is done with the purpose of obtaining the SP results in the standard output interface and avoid confusions in the terminal.
-
-```bash
-$ docker run -ti -v `pwd`/sp-samples-1k.log:/sp-samples-1k.log           \
-     fluent/fluent-bit:1.2                                               \
-     /fluent-bit/bin/fluent-bit                                          \
-         -R /fluent-bit/etc/parsers.conf                                 \
-         -i tail                                                         \
-             -p path=/sp-samples-1k.log                                  \
-             -p parser=json                                              \
-             -p read_from_head=true                                      \
-         -T "SELECT word, num FROM STREAM:tail.0 WHERE country='Chile';" \
-         -o null -f 1
+### 3. Select specific record keys
+
+Run the following command to create a stream processor query using the `-T` flag and change the output to the Null plugin. This obtains the stream processing results in the standard output interface and avoids confusion in the terminal.
+
+```shell
+docker run -ti -v `pwd`/sp-samples-1k.log:/sp-samples-1k.log  \
+  fluent/fluent-bit:1.2                                       \
+  /fluent-bit/bin/fluent-bit                                  \
+  -R /fluent-bit/etc/parsers.conf                             \
+  -i tail                                                     \
+  -p path=/sp-samples-1k.log                                  \
+  -p parser=json                                              \
+  -p read_from_head=true                                      \
+  -T "SELECT word, num FROM STREAM:tail.0 WHERE country='Chile';" \
+  -o null -f 1
 ```
 
-The query above aims to retrieve all records that a key named _country_ value matches the value _Chile_, and for each match compose and output a record using only the key fields _word_ and _num_:
+The previous query aims to retrieve all records for which the `country` key contains the value `Chile`. For each match, it composes and outputs a record that only contains the keys `word` and `num`:
 
 ```text
 [0] [1557322913.263534, {"word"=>"Candide", "num"=>94}]
@@ -87,24 +76,24 @@ The query above aims to retrieve all records that a key named _country_ value ma
 [0] [1557322913.263706, {"word"=>"decasyllables", "num"=>76}]
 ```
 
-### 4. Calculate Average Value
-
-The following query is similar to the one in the previous step, but this time we will use the aggregation function called AVG\(\) to get the average value of the records ingested:
-
-```bash
-$ docker run -ti -v `pwd`/sp-samples-1k.log:/sp-samples-1k.log           \
-     fluent/fluent-bit:1.8.2                                             \
-     /fluent-bit/bin/fluent-bit                                          \
-         -R /fluent-bit/etc/parsers.conf                                 \
-         -i tail                                                         \
-             -p path=/sp-samples-1k.log                                  \
-             -p parser=json                                              \
-             -p read_from_head=true                                      \
-         -T "SELECT AVG(num) FROM STREAM:tail.0 WHERE country='Chile';"  \
-         -o null -f 1
+### 4. Calculate average value
+
+Run the following command to use the `AVG` aggregation function to get the average value of ingested records:
+
+```shell
+docker run -ti -v `pwd`/sp-samples-1k.log:/sp-samples-1k.log  \
+  fluent/fluent-bit:1.8.2                                     \
+  /fluent-bit/bin/fluent-bit                                  \
+  -R /fluent-bit/etc/parsers.conf                             \
+  -i tail                                                     \
+  -p path=/sp-samples-1k.log                                  \
+  -p parser=json                                              \
+  -p read_from_head=true                                      \
+  -T "SELECT AVG(num) FROM STREAM:tail.0 WHERE country='Chile';"  \
+  -o null -f 1
 ```
 
-output:
+The previous query yields the following output:
 
 ```text
 [0] [1557323573.940149, {"AVG(num)"=>61.230770}]
@@ -114,86 +103,64 @@ output:
 [0] [1557323573.945130, {"AVG(num)"=>99.000000}]
 ```
 
-why did we get multiple records? Answer: When Fluent Bit processes the data, records come in chunks and the Stream Processor runs the process over chunks of data, so the input plugin ingested 5 chunks of records and SP processed the query for each chunk independently. To process multiple chunks at once we have to group results during windows of time.
-
-### 5. Grouping Results and Window
-
-Grouping results aims to simplify data processing and when used in a defined window of time we can achieve great things. The next query group the results by _country_ and calculate the average of _num_ value, the processing window is 1 second which basically means: process all incoming chunks coming within 1 second window:
-
-```bash
-$ docker run -ti -v `pwd`/sp-samples-1k.log:/sp-samples-1k.log      \
-     fluent/fluent-bit:1.8.2                                        \
-     /fluent-bit/bin/fluent-bit                                     \
-         -R /fluent-bit/etc/parsers.conf                            \
-         -i tail                                                    \
-             -p path=/sp-samples-1k.log                             \
-             -p parser=json                                         \
-             -p read_from_head=true                                 \
-         -T "SELECT country, AVG(num) FROM STREAM:tail.0            \
-             WINDOW TUMBLING (1 SECOND)                             \
-             WHERE country='Chile'                                  \
-             GROUP BY country;"                                     \
-         -o null -f 1
+{% hint style="info" %}
+
+The resulting output contains multiple records because Fluent Bit processes data in chunks, and the stream processor processes each chunk independently. To process multiple chunks at the same time, you can group results using time windows.
+
+{% endhint %}
+
+### 5. Group results and windows
+
+Grouping results within a time window simplifies data processing. Run the following command to group results by `country` and calculate the average of `num` with a one-second processing window:
+
+```shell
+docker run -ti -v `pwd`/sp-samples-1k.log:/sp-samples-1k.log \
+  fluent/fluent-bit:1.8.2                                    \
+  /fluent-bit/bin/fluent-bit                                 \
+  -R /fluent-bit/etc/parsers.conf                            \
+  -i tail                                                    \
+  -p path=/sp-samples-1k.log                                 \
+  -p parser=json                                             \
+  -p read_from_head=true                                     \
+  -T "SELECT country, AVG(num) FROM STREAM:tail.0            \
+      WINDOW TUMBLING (1 SECOND)                             \
+      WHERE country='Chile'                                  \
+      GROUP BY country;"                                     \
+  -o null -f 1
 ```
 
-output:
+The previous query yields the following output:
 
 ```text
 [0] [1557324239.003211, {"country"=>"Chile", "AVG(num)"=>53.164558}]
 ```
 
-### 6. Ingest Stream Processor results as new Stream of Data
-
-Now we see a more real-world use case. Sending data results to the standard output interface is good for learning purposes, but now we will instruct the Stream Processor to ingest results as part of Fluent Bit data pipeline and attach a Tag to them.
-
-This can be done using the **CREATE STREAM** statement that will also tag results with **sp-results** value. Note that output plugin parameter is now _stdout_ matching all records tagged with _sp-results_:
-
-```bash
-$ docker run -ti -v `pwd`/sp-samples-1k.log:/sp-samples-1k.log      \
-     fluent/fluent-bit:1.8.2                                        \
-     /fluent-bit/bin/fluent-bit                                     \
-         -R /fluent-bit/etc/parsers.conf                            \
-         -i tail                                                    \
-             -p path=/sp-samples-1k.log                             \
-             -p parser=json                                         \
-             -p read_from_head=true                                 \
-         -T "CREATE STREAM results WITH (tag='sp-results')          \
-             AS                                                     \
-               SELECT country, AVG(num) FROM STREAM:tail.0          \
-               WINDOW TUMBLING (1 SECOND)                           \
-               WHERE country='Chile'                                \
-               GROUP BY country;"                                   \
-         -o stdout -m 'sp-results' -f 1
+### 6. Ingest stream processor results as a new stream of data
+
+Next, instruct the stream processor to ingest results as part of the Fluent Bit data pipeline and assign a tag to each record.
+
+Run the following command, which uses a `CREATE STREAM` statement to tag results with the `sp-results` tag, then outputs records with that tag to standard output:
+
+```shell
+docker run -ti -v `pwd`/sp-samples-1k.log:/sp-samples-1k.log   \
+  fluent/fluent-bit:1.8.2                                      \
+  /fluent-bit/bin/fluent-bit                                   \
+  -R /fluent-bit/etc/parsers.conf                              \
+  -i tail                                                      \
+  -p path=/sp-samples-1k.log                                   \
+  -p parser=json                                               \
+  -p read_from_head=true                                       \
+  -T "CREATE STREAM results WITH (tag='sp-results')            \
+      AS                                                       \
+      SELECT country, AVG(num) FROM STREAM:tail.0              \
+      WINDOW TUMBLING (1 SECOND)                               \
+      WHERE country='Chile'                                    \
+      GROUP BY country;"                                       \
+  -o stdout -m 'sp-results' -f 1
 ```
 
-output:
+The previous query yields the following results:
 
 ```text
 [0] sp-results: [1557325032.000160100, {"country"=>"Chile", "AVG(num)"=>53.164558}]
-```
-
-## F.A.Q
-
-### Where STREAM name comes from?
-
-Fluent Bit have the notion of streams, and every input plugin instance gets a default name. You can override that behavior by setting an alias. Check the **alias** parameter and new **stream** name in the following example:
-
-```bash
-$ docker run -ti -v `pwd`/sp-samples-1k.log:/sp-samples-1k.log      \
-     fluent/fluent-bit:1.8.2                                        \
-     /fluent-bit/bin/fluent-bit                                     \
-         -R /fluent-bit/etc/parsers.conf                            \
-         -i tail                                                    \
-             -p path=/sp-samples-1k.log                             \
-             -p parser=json                                         \
-             -p read_from_head=true                                 \
-             -p alias=samples                                       \
-         -T "CREATE STREAM results WITH (tag='sp-results')          \
-             AS                                                     \
-               SELECT country, AVG(num) FROM STREAM:samples         \
-               WINDOW TUMBLING (1 SECOND)                           \
-               WHERE country='Chile'                                \
-               GROUP BY country;"                                   \
-         -o stdout -m 'sp-results' -f 1
-```
-
+```
\ No newline at end of file
diff --git a/stream-processing/introduction.md b/stream-processing/introduction.md
index 0db71332e..1fbea8754 100644
--- a/stream-processing/introduction.md
+++ b/stream-processing/introduction.md
@@ -1,8 +1,7 @@
-# Introduction to Stream Processing
+# Introduction to stream processing
 
-![](../.gitbook/assets/stream_processor.png)
+![Fluent Bit stream processing](../.gitbook/assets/stream_processor.png)
 
-[Fluent Bit](https://fluentbit.io) is a fast and flexible Log processor that aims to collect, parse, filter and deliver logs to remote databases, so Data Analysis can be performed.
-
-Data Analysis usually happens after the data is stored and indexed in a database, but for real-time and complex analysis needs, process the data while it's still in motion in the Log processor brings a lot of advantages and this approach is called **Stream Processing on the Edge**.
+Fluent Bit is a fast and flexible log processor that collects, parsers, filters, and delivers logs to remote databases, where data analysis can then be performed.
 
+For real-time and complex analysis needs, you can also process the data while it's still in motion through _stream processing on the edge_.
diff --git a/stream-processing/overview.md b/stream-processing/overview.md
index 73afb3a6b..7d0cee09e 100644
--- a/stream-processing/overview.md
+++ b/stream-processing/overview.md
@@ -1,28 +1,27 @@
 # Overview
 
-Stream Processing is the ability to query continuous data streams while they are still in motion. [Fluent Bit](https://fluentbit.io) implements a Streaming SQL Engine that can be used for such process.
+Stream processing is a feature that lets you query continuous data streams while they're still in motion. Fluent Bit uses a streaming SQL engine for this process.
 
-In order to understand how Stream Processing works in Fluent Bit, we will go through a quick overview of Fluent Bit architecture and how the data goes through the pipeline.
+To understand how stream processing works in Fluent Bit, follow this overview of Fluent Bit architecture and how data travels through the pipeline.
 
-## Fluent Bit Data Pipeline
+## Fluent Bit data pipeline
 
-[Fluent Bit](https://fluentbit.io) collects and process logs \(records\) from different input sources and allows to parse and filter these records before they hit the Storage interface. Once data is processed and it's in a safe state \(either in memory or the file system\), the records are routed through the proper output destinations.
+[Fluent Bit](https://fluentbit.io) collects and process logs (also known as _records_) from different input sources, then parses and filters these records before they're stored. After data is processed and in a safe state, meaning either in memory or in the file system, the records are routed through the proper output destinations.
 
-> Most of the phases in the pipeline are implemented through plugins: Input, Filter and Output.
+Most of the phases in the pipeline are implemented through plugins: input, filter, and output.
 
-![](../.gitbook/assets/flb_pipeline.png)
+![Fluent Bit pipeline flow](../.gitbook/assets/flb_pipeline.png)
 
-The Filtering interface is good to perform specific record modifications like append or remove a key, enrich with specific metadata \(e.g: Kubernetes Filter\) or discard records based on specific conditions. Just after the data will not have any further modification and hits the Storage, optionally, will be redirected to the Stream Processor.
+Filters can perform specific record modifications like appending or removing a key, enriching with metadata (for example, Kubernetes filter), or discarding records based on specific conditions. After data is stored, no further modifications are made, but records can optionally be redirected to the stream processor.
 
-## Stream Processor
+## Stream processor
 
-The Stream Processor is an independent subsystem that check for new records hitting the Storage interface. By configuration the Stream Processor will attach to records coming from a specific Input plugin \(stream\) or by applying Tag and Matching rules.
+The stream processor is an independent subsystem that checks for new records hitting the storage interface. Based on your configuration settings, the stream processor will attach to records that come from a specific input plugin or by applying tag and matching rules.
 
-> Every _Input_ instance is considered a **Stream**, that stream collects data and ingest records into the pipeline.
+Every input instance is considered a stream. These streams collect data and ingest records into the pipeline.
 
-![](../.gitbook/assets/flb_pipeline_sp.png)
+![Fluent Bit pipeline flow plus stream processor](../.gitbook/assets/flb_pipeline_sp.png)
 
-By configuring specific SQL queries \(Structured Query Language\), the user can perform specific tasks like key selections, filtering and data aggregation within others. Note that there is **no** database concept here, everything is **schema-less** and happens **in-memory**, for hence the concept of _Tables_ as in common relational databases don't exists.
-
-One of the powerful features of Fluent Bit Stream Processor is that allows to create new streams of data using the results from a previous SQL query, these results are re-ingested back into the pipeline to be consumed again for the Stream Processor \(if desired\) or routed to output destinations such any common record by using Tag/Matching rules \(tip: stream processor results can be Tagged!\)
+By configuring specific SQL queries, you can perform specific tasks like key selections, filtering, and data aggregation. Keep in mind that there is no database; everything is schema-less and happens in memory. Concepts like tables that are common in relational database don't exist in Fluent Bit.
 
+One powerful feature of the Fluent Bit stream processor is the ability to create new streams of data using the results from a previous SQL query. These results are re-ingested back into the pipeline to be consumed again for the stream processor, if desired, or routed to output destinations by any common record using tag/matching rules. (Stream processor results can be tagged.)
diff --git a/stream-processing/stream-processing.md b/stream-processing/stream-processing.md
index 99eda4b50..bd06b3687 100644
--- a/stream-processing/stream-processing.md
+++ b/stream-processing/stream-processing.md
@@ -1,7 +1,7 @@
 # Introduction
 
-![](../.gitbook/assets/stream_processor.png)
+![Fluent Bit stream processing](../.gitbook/assets/stream_processor.png)
 
-[Fluent Bit](https://fluentbit.io) is a fast and flexible Log processor that aims to collect, parse, filter and deliver logs to remote databases, so Data Analysis can be performed.
+[Fluent Bit](https://fluentbit.io) is a fast and flexible log processor that aims to collect, parse, filter, and deliver logs to remote databases so data analysis can be performed.
 
-Data Analysis usually happens after the data is stored and indexed in a database, but for real-time and complex analysis needs, process the data while it's still in motion in the Log processor brings a lot of advantages and this approach is called **Stream Processing on the Edge**.
+Data analysis usually happens after the data is stored and indexed in a database. However, for real-time and complex analysis needs, processing the data while it's still in motion in the log processor brings a lot of advantages. This approach is called **Stream Processing on the Edge**.
diff --git a/vale-styles/FluentBit/AMPM.yml b/vale-styles/FluentBit/AMPM.yml
new file mode 100644
index 000000000..5b696b3b8
--- /dev/null
+++ b/vale-styles/FluentBit/AMPM.yml
@@ -0,0 +1,10 @@
+
+extends: existence
+message: "Use 'AM' or 'PM' (preceded by a space)."
+link: 'https://developers.google.com/style/word-list'
+level: suggestion
+nonword: true
+tokens:
+  - '\d{1,2}[AP]M'
+  - '\d{1,2} ?[ap]m'
+  - '\d{1,2} ?[aApP]\.[mM]\.'
\ No newline at end of file
diff --git a/vale-styles/FluentBit/Acronyms.yml b/vale-styles/FluentBit/Acronyms.yml
new file mode 100644
index 000000000..c924ca5cc
--- /dev/null
+++ b/vale-styles/FluentBit/Acronyms.yml
@@ -0,0 +1,138 @@
+extends: conditional
+message: "Spell out '%s', if it's unfamiliar to the audience."
+link: 'https://developers.google.com/style/abbreviations'
+level: suggestion
+ignorecase: false
+# Ensures that the existence of 'first' implies the existence of 'second'.
+first: '\b([A-Z]{3,5})\b'
+second: '(?:\b[A-Z][a-z]+ )+\(([A-Z]{3,5})\)'
+# ... with the exception of these:
+exceptions:
+  - AAD
+  - ACL
+  - AMD
+  - ANSI
+  - API
+  - ARN
+  - ASC
+  - ASP
+  - AWS
+  - BSD
+  - CIDR
+  - CLI
+  - CNCF
+  - CORS
+  - CPU
+  - CRI
+  - CRD
+  - CSS
+  - CSV
+  - DCO
+  - DEBUG
+  - DESC
+  - DOM
+  - DNS
+  - DPI
+  - DPPS
+  - DST
+  - ECR
+  - ECS
+  - EKS
+  - FAQ
+  - FIPS
+  - GCC
+  - GCP
+  - GCS
+  - GDB
+  - GELF
+  - GET
+  - GNU
+  - GPG
+  - GPU
+  - GTK
+  - GUI
+  - GZIP
+  - HEC
+  - HMAC
+  - HPA
+  - HTML
+  - HTTP
+  - HTTPS
+  - IAM
+  - IBM
+  - IDE
+  - IMDS
+  - ISO
+  - JAR
+  - JSON
+  - JSX
+  - KQL
+  - LESS
+  - LLDB
+  - LLVM
+  - LTS
+  - LTSV
+  - MIME
+  - MAC
+  - MQTT
+  - MSI
+  - MSK
+  - NATS
+  - NET
+  - NGINX
+  - NIC
+  - NOTE
+  - NSIS
+  - NVDA
+  - OAP
+  - OOM
+  - OSS
+  - PATH
+  - PEM
+  - PDF
+  - PHP
+  - POSIX
+  - POST
+  - RAM
+  - REPL
+  - REST
+  - RHEL
+  - RPC
+  - RSA
+  - SASL
+  - SCM
+  - SCSS
+  - SDK
+  - SDS
+  - SHA
+  - SIEM
+  - SLA
+  - SNI
+  - SQL
+  - SSH
+  - SSL
+  - SSM
+  - SSO
+  - STS
+  - SVG
+  - TBD
+  - TCP
+  - TLS
+  - TRE
+  - TODO
+  - UAE
+  - UDP
+  - URI
+  - URL
+  - USB
+  - UTC
+  - UTF
+  - UUID
+  - VPC
+  - WASI
+  - WMI
+  - XML
+  - XSS
+  - YAML
+  - YUM
+  - ZIP
diff --git a/vale-styles/FluentBit/AmSpelling.yml b/vale-styles/FluentBit/AmSpelling.yml
new file mode 100644
index 000000000..f871b061e
--- /dev/null
+++ b/vale-styles/FluentBit/AmSpelling.yml
@@ -0,0 +1,8 @@
+extends: existence
+message: "In general, use US English spelling instead of '%s'."
+link: 'https://developers.google.com/style/spelling'
+ignorecase: true
+level: error
+tokens:
+  - '(?:\w+)nised?'
+  - '(?:\w+)logue'
diff --git a/vale-styles/FluentBit/Ampersand.yml b/vale-styles/FluentBit/Ampersand.yml
new file mode 100644
index 000000000..acac80682
--- /dev/null
+++ b/vale-styles/FluentBit/Ampersand.yml
@@ -0,0 +1,11 @@
+extends: existence
+message: 'Use "and" instead of "&" in content.'
+level: error
+scope: text
+nonword: true
+tokens:
+  - '\s&\s'
+  - '^&\s'
+  - '\s&$'
+  - '\s&[^\w]'
+  - '[^\w]&\s'
diff --git a/vale-styles/FluentBit/Colons.yml b/vale-styles/FluentBit/Colons.yml
new file mode 100644
index 000000000..aee9281c3
--- /dev/null
+++ b/vale-styles/FluentBit/Colons.yml
@@ -0,0 +1,8 @@
+extends: existence
+message: "'%s' should be in lowercase."
+link: 'https://developers.google.com/style/colons'
+nonword: true
+level: suggestion
+scope: sentence
+tokens:
+  - ':\s[A-Z]'
\ No newline at end of file
diff --git a/vale-styles/FluentBit/Contractions.yml b/vale-styles/FluentBit/Contractions.yml
new file mode 100644
index 000000000..525687ca6
--- /dev/null
+++ b/vale-styles/FluentBit/Contractions.yml
@@ -0,0 +1,30 @@
+extends: substitution
+message: "Feel free to use '%s' instead of '%s'."
+link: 'https://developers.google.com/style/contractions'
+level: suggestion
+ignorecase: true
+action:
+  name: replace
+swap:
+  are not: aren't
+  cannot: can't
+  could not: couldn't
+  did not: didn't
+  do not: don't
+  does not: doesn't
+  has not: hasn't
+  have not: haven't
+  how is: how's
+  is not: isn't
+  it is: it's
+  should not: shouldn't
+  that is: that's
+  they are: they're
+  was not: wasn't
+  we are: we're
+  we have: we've
+  were not: weren't
+  what is: what's
+  when is: when's
+  where is: where's
+  will not: won't
\ No newline at end of file
diff --git a/vale-styles/FluentBit/DateFormat.yml b/vale-styles/FluentBit/DateFormat.yml
new file mode 100644
index 000000000..c70b3b7bc
--- /dev/null
+++ b/vale-styles/FluentBit/DateFormat.yml
@@ -0,0 +1,9 @@
+extends: existence
+message: "Use 'July 31, 2016' format, not '%s'."
+link: 'https://developers.google.com/style/dates-times'
+ignorecase: true
+level: suggestion
+nonword: true
+tokens:
+  - '\d{1,2}(?:\.|/)\d{1,2}(?:\.|/)\d{4}'
+  - '\d{1,2} (?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)|May|Jun(?:e)|Jul(?:y)|Aug(?:ust)|Sep(?:tember)?|Oct(?:ober)|Nov(?:ember)?|Dec(?:ember)?) \d{4}'
\ No newline at end of file
diff --git a/vale-styles/FluentBit/Directional.yml b/vale-styles/FluentBit/Directional.yml
new file mode 100644
index 000000000..1d18a0f4d
--- /dev/null
+++ b/vale-styles/FluentBit/Directional.yml
@@ -0,0 +1,8 @@
+---
+extends: existence
+message: "Verify your use of '%s' with the Style Guide."
+level: suggestion
+ignorecase: true
+tokens:
+  - above
+  - below
diff --git a/vale-styles/FluentBit/DontUse.yml b/vale-styles/FluentBit/DontUse.yml
new file mode 100644
index 000000000..b23fa495f
--- /dev/null
+++ b/vale-styles/FluentBit/DontUse.yml
@@ -0,0 +1,18 @@
+---
+extends: existence
+message: "We don't use '%s'."
+ignorecase: true
+level: error
+tokens:
+  - a.k.a.
+  - aka
+  - and/or
+  - at this point
+  - desire
+  - it is recommended that
+  - just
+  - note that
+  - please
+  - quite
+  - such that
+  - thus
diff --git a/vale-styles/FluentBit/Drilldown.yml b/vale-styles/FluentBit/Drilldown.yml
new file mode 100644
index 000000000..ca7cb2ed7
--- /dev/null
+++ b/vale-styles/FluentBit/Drilldown.yml
@@ -0,0 +1,8 @@
+---
+extends: sequence
+message: "Use drilldown as an adjective or noun."
+level: suggestion
+ignorecase: true
+tokens:
+  - tag: NN|JJ
+    pattern: '(?:drill down|drill-down)'
diff --git a/vale-styles/FluentBit/DrilldownVerb.yml b/vale-styles/FluentBit/DrilldownVerb.yml
new file mode 100644
index 000000000..3dd6ca047
--- /dev/null
+++ b/vale-styles/FluentBit/DrilldownVerb.yml
@@ -0,0 +1,8 @@
+---
+extends: sequence
+message: "Use drill down as a verb."
+level: suggestion
+ignorecase: true
+tokens:
+  - tag: VB|VBD|VBG|VBN|VBP|VBZ
+    pattern: '(?:drilldown|drill-down)'
diff --git a/vale-styles/FluentBit/Ellipses.yml b/vale-styles/FluentBit/Ellipses.yml
new file mode 100644
index 000000000..6b93a0c44
--- /dev/null
+++ b/vale-styles/FluentBit/Ellipses.yml
@@ -0,0 +1,9 @@
+extends: existence
+message: "In general, don't use an ellipsis."
+link: 'https://developers.google.com/style/ellipses'
+nonword: true
+level: suggestion
+action:
+  name: remove
+tokens:
+  - '\.\.\.'
\ No newline at end of file
diff --git a/vale-styles/FluentBit/EmDash.yml b/vale-styles/FluentBit/EmDash.yml
new file mode 100644
index 000000000..1befe72aa
--- /dev/null
+++ b/vale-styles/FluentBit/EmDash.yml
@@ -0,0 +1,12 @@
+extends: existence
+message: "Don't put a space before or after a dash."
+link: 'https://developers.google.com/style/dashes'
+nonword: true
+level: error
+action:
+  name: edit
+  params:
+    - remove
+    - ' '
+tokens:
+  - '\s[—–]\s'
diff --git a/vale-styles/FluentBit/EnDash.yml b/vale-styles/FluentBit/EnDash.yml
new file mode 100644
index 000000000..b314dc4e9
--- /dev/null
+++ b/vale-styles/FluentBit/EnDash.yml
@@ -0,0 +1,13 @@
+extends: existence
+message: "Use an em dash ('—') instead of '–'."
+link: 'https://developers.google.com/style/dashes'
+nonword: true
+level: error
+action:
+  name: edit
+  params:
+    - replace
+    - '-'
+    - '—'
+tokens:
+  - '–'
diff --git a/vale-styles/FluentBit/Exclamation.yml b/vale-styles/FluentBit/Exclamation.yml
new file mode 100644
index 000000000..3e15181b2
--- /dev/null
+++ b/vale-styles/FluentBit/Exclamation.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Don't use exclamation points in text."
+link: 'https://developers.google.com/style/exclamation-points'
+nonword: true
+level: error
+tokens:
+  - '\w!(?:\s|$)'
diff --git a/vale-styles/FluentBit/FirstPerson.yml b/vale-styles/FluentBit/FirstPerson.yml
new file mode 100644
index 000000000..0b7b8828c
--- /dev/null
+++ b/vale-styles/FluentBit/FirstPerson.yml
@@ -0,0 +1,13 @@
+extends: existence
+message: "Avoid first-person pronouns such as '%s'."
+link: 'https://developers.google.com/style/pronouns#personal-pronouns'
+ignorecase: true
+level: warning
+nonword: true
+tokens:
+  - (?:^|\s)I\s
+  - (?:^|\s)I,\s
+  - \bI'm\b
+  - \bme\b
+  - \bmy\b
+  - \bmine\b
diff --git a/vale-styles/FluentBit/FluentBitCasing.yml b/vale-styles/FluentBit/FluentBitCasing.yml
new file mode 100644
index 000000000..1e1931f1c
--- /dev/null
+++ b/vale-styles/FluentBit/FluentBitCasing.yml
@@ -0,0 +1,16 @@
+extends: existence
+message: "Use the proper noun 'Fluent Bit' with correct casing and spacing."
+level: warning
+ignorecase: false
+scope: text
+tokens:
+  # Matches incorrect variants in plain prose but excludes filenames, links, quotes, and code
+  - '(?<![-[".\w:/\]])\bfluent bit\b(?![-\]".\w:/\]])'
+  - '(?<![-[".\w:/\]])\bfluentbit\b(?![-\]".\w:/\]])'
+  - '(?<![-[".\w:/\]])\bFluent bit\b(?![-\]".\w:/\]])'
+  - '(?<![-[".\w:/\]])\bfluent Bit\b(?![-\]".\w:/\]])'
+  - '(?<![-[".\w:/\]])\bfluent-bit\b(?![-\]".\w:/\]])'
+  - '(?<![-[".\w:/\]])\bFluent-Bit\b(?![-\]".\w:/\]])'
+  - '(?<![-[".\w:/\]])\bfluent\-Bit\b(?![-\]".\w:/\]])'
+  - '(?<![-[".\w:/\]])\bFLUENT BIT\b(?![-\]".\w:/\]])'
+  - '(?<![-[".\w:/\]])\bFLUENT-BIT\b(?![-\]".\w:/\]])'
diff --git a/vale-styles/FluentBit/FutureTense.yml b/vale-styles/FluentBit/FutureTense.yml
new file mode 100644
index 000000000..17d1bd6a6
--- /dev/null
+++ b/vale-styles/FluentBit/FutureTense.yml
@@ -0,0 +1,10 @@
+---
+extends: existence
+message: "'%s' might be in future tense. Strive for active voice and present tense in your documentation."
+ignorecase: true
+level: suggestion
+raw:
+  - "(going to( |\n|[[:punct:]])[a-zA-Z]*|"
+  - "will( |\n|[[:punct:]])[a-zA-Z]*|"
+  - "won't( |\n|[[:punct:]])[a-zA-Z]*|"
+  - "[a-zA-Z]*'ll( |\n|[[:punct:]])[a-zA-Z]*)"
diff --git a/vale-styles/FluentBit/Gender.yml b/vale-styles/FluentBit/Gender.yml
new file mode 100644
index 000000000..c8486181d
--- /dev/null
+++ b/vale-styles/FluentBit/Gender.yml
@@ -0,0 +1,9 @@
+extends: existence
+message: "Don't use '%s' as a gender-neutral pronoun."
+link: 'https://developers.google.com/style/pronouns#gender-neutral-pronouns'
+level: error
+ignorecase: true
+tokens:
+  - he/she
+  - s/he
+  - \(s\)he
diff --git a/vale-styles/FluentBit/GenderBias.yml b/vale-styles/FluentBit/GenderBias.yml
new file mode 100644
index 000000000..261cfb666
--- /dev/null
+++ b/vale-styles/FluentBit/GenderBias.yml
@@ -0,0 +1,45 @@
+extends: substitution
+message: "Consider using '%s' instead of '%s'."
+link: 'https://developers.google.com/style/inclusive-documentation'
+ignorecase: true
+level: error
+swap:
+  (?:alumna|alumnus):          graduate
+  (?:alumnae|alumni):          graduates
+  air(?:m[ae]n|wom[ae]n):      pilot(s)
+  anchor(?:m[ae]n|wom[ae]n):   anchor(s)
+  authoress:                   author
+  camera(?:m[ae]n|wom[ae]n):   camera operator(s)
+  chair(?:m[ae]n|wom[ae]n):    chair(s)
+  congress(?:m[ae]n|wom[ae]n): member(s) of congress
+  door(?:m[ae]|wom[ae]n):      concierge(s)
+  draft(?:m[ae]n|wom[ae]n):    drafter(s)
+  fire(?:m[ae]n|wom[ae]n):     firefighter(s)
+  fisher(?:m[ae]n|wom[ae]n):   fisher(s)
+  fresh(?:m[ae]n|wom[ae]n):    first-year student(s)
+  garbage(?:m[ae]n|wom[ae]n):  waste collector(s)
+  lady lawyer:                 lawyer
+  ladylike:                    courteous
+  landlord:                    building manager
+  mail(?:m[ae]n|wom[ae]n):     mail carriers
+  man and wife:                husband and wife
+  man enough:                  strong enough
+  mankind:                     human kind
+  manmade:                     manufactured
+  manpower:                    personnel
+  men and girls:               men and women
+  middle(?:m[ae]n|wom[ae]n):   intermediary
+  news(?:m[ae]n|wom[ae]n):     journalist(s)
+  ombuds(?:man|woman):         ombuds
+  oneupmanship:                upstaging
+  poetess:                     poet
+  police(?:m[ae]n|wom[ae]n):   police officer(s)
+  repair(?:m[ae]n|wom[ae]n):   technician(s)
+  sales(?:m[ae]n|wom[ae]n):    salesperson or sales people
+  service(?:m[ae]n|wom[ae]n):  soldier(s)
+  steward(?:ess)?:             flight attendant
+  tribes(?:m[ae]n|wom[ae]n):   tribe member(s)
+  waitress:                    waiter
+  woman doctor:                doctor
+  woman scientist[s]?:         scientist(s)
+  work(?:m[ae]n|wom[ae]n):     worker(s)
diff --git a/vale-styles/FluentBit/HeadingPunctuation.yml b/vale-styles/FluentBit/HeadingPunctuation.yml
new file mode 100644
index 000000000..bd8330809
--- /dev/null
+++ b/vale-styles/FluentBit/HeadingPunctuation.yml
@@ -0,0 +1,13 @@
+extends: existence
+message: "Don't put a period at the end of a heading."
+link: 'https://developers.google.com/style/capitalization#capitalization-in-titles-and-headings'
+nonword: true
+level: error
+scope: heading
+action:
+  name: edit
+  params:
+    - remove
+    - '.'
+tokens:
+  - '[a-z0-9][.]\s*$'
diff --git a/vale-styles/FluentBit/Headings.yml b/vale-styles/FluentBit/Headings.yml
new file mode 100644
index 000000000..448bd8a20
--- /dev/null
+++ b/vale-styles/FluentBit/Headings.yml
@@ -0,0 +1,163 @@
+extends: capitalization
+message: "'%s' should use sentence-style capitalization."
+link: 'https://developers.google.com/style/capitalization#capitalization-in-titles-and-headings'
+level: suggestion
+scope: heading
+match: $sentence
+indicators:
+  - ':'
+exceptions:
+  - AlmaLinux
+  - Amazon
+  - Amazon CloudWatch
+  - Amazon ECR
+  - Amazon ECR Public Gallery
+  - Amazon Kinesis Data Firehose
+  - Amazon Kinesis Data Streams
+  - Amazon Kinesis Firehose
+  - Amazon Kinesis Streams
+  - Amazon OpenSearch Service
+  - Apache SkyWalking
+  - Amazon S3
+  - Apache Arrow
+  - API
+  - APIs
+  - AWS
+  - AWS MSK IAM
+  - AWS IAM
+  - Azure
+  - Azure Blob
+  - Azure Data Explorer
+  - Azure Logs Ingestion API
+  - Azure Log Analytics
+  - Azure Storage
+  - Azurite
+  - BuildKite
+  - CentOS
+  - CheckList
+  - Chronosphere
+  - CircleCI
+  - CLI
+  - CloudWatch
+  - CNCF
+  - Code
+  - Collector
+  - Cosmos
+  - CPU
+  - Crowdstrike
+  - CSV
+  - cURL
+  - Datadog
+  - DNS
+  - Docker
+  - Docker Hub
+  - DogStatsD
+  - eBPF
+  - EC2
+  - ECS
+  - EKS
+  - Elastic Cloud
+  - Emmet
+  - EventBridge
+  - FlowCounter
+  - Fluent Bit
+  - Fluentd
+  - Forward
+  - GCP
+  - GitLab
+  - GitHub
+  - Go
+  - Google
+  - Google Chronicle
+  - Google Cloud
+  - Google Cloud BigQuery
+  - Google Cloud Platform
+  - GPG
+  - Grafana
+  - Grafana Cloud
+  - Graylog Extended Log Format
+  - GELF
+  - gRPC
+  - gzip
+  - Helm
+  - Homebrew
+  - HTTP
+  - I
+  - InfluxDB
+  - I/O
+  - JSON
+  - Kafka
+  - Kafka Producer
+  - Kafka
+  - Kinesis
+  - KQL
+  - Kubernetes
+  - Kusto
+  - LaunchDarkly
+  - Libpq
+  - Linux
+  - LogDNA
+  - LogEntry
+  - LTSV
+  - macOS
+  - Marketplace
+  - MessagePack
+  - Microsoft Fabric
+  - MongoDB
+  - MQTT
+  - NATS
+  - New Relic
+  - Observability Platform
+  - OIDC
+  - Okta
+  - OpenMetrics
+  - OpenObserve
+  - OpenSearch
+  - OpenShift
+  - OpenTelemetry
+  - Opsgenie
+  - Oracle Cloud Infrastructure Logging Analytics
+  - PagerDuty
+  - Pod Identity
+  - PostgreSQL
+  - Prometheus
+  - PromQL
+  - Raspberry Pi
+  - Red Hat
+  - REPL
+  - REST
+  - RHEL
+  - RockyLinux
+  - ServiceMonitor
+  - SignalFx
+  - SIMD
+  - Slack
+  - SQL
+  - SSL
+  - SSM
+  - StatsD
+  - Studio
+  - Sumo Logic
+  - Tanzu
+  - TCP
+  - Telemetry Pipeline
+  - Tensorflow Lite
+  - Terraform
+  - TLS
+  - Transport Layer Security
+  - Treasure Data
+  - TypeScript
+  - Ubuntu
+  - UDP
+  - Unix
+  - URLs
+  - VictorOps
+  - Visual
+  - Vivo Exporter
+  - VS
+  - Wasm
+  - WebSocket
+  - Windows
+  - Windows Event
+  - YAML
+  - YUM
diff --git a/vale-styles/FluentBit/Hints.yml b/vale-styles/FluentBit/Hints.yml
new file mode 100644
index 000000000..6c047d701
--- /dev/null
+++ b/vale-styles/FluentBit/Hints.yml
@@ -0,0 +1,15 @@
+extends: existence
+message: "Instead of using `>` to call out information, use GitBook hint syntax. https://gitbook.com/docs/creating-content/blocks/hint#representation-in-markdown"
+level: error
+nonword: true
+scope: raw
+tokens:
+  - '> \**_*(?i)note'
+  - '> \**_*(?i)caution'
+  - '> \**_*(?i)warning'
+  - '> \**_*(?i)danger'
+  - '> \**_*(?i)important'
+  - '> \**_*(?i)info'
+  - '> \**_*(?i)hint'
+  - '> \**_*(?i)tip'
+  - '> \**_*(?i)success'
diff --git a/vale-styles/FluentBit/Latin.yml b/vale-styles/FluentBit/Latin.yml
new file mode 100644
index 000000000..a2dc275cb
--- /dev/null
+++ b/vale-styles/FluentBit/Latin.yml
@@ -0,0 +1,17 @@
+extends: substitution
+message: "Use '%s' instead of '%s'."
+link: 'https://developers.google.com/style/abbreviations'
+ignorecase: true
+level: error
+nonword: true
+action:
+  name: replace
+swap:
+  '\b(?:eg|e\.g\.)[\s,]': for example
+  '\b(?:ie|i\.e\.)[\s,]': that is
+  'ad-hoc': if needed
+  '[\s]et al[\s]': and others
+  '[\s]etc[\s|.]': and so on
+  '[\s]via[\s]': through or by using
+  'vice versa': and the reverse
+  '[\s]vs[\s|.]': versus
diff --git a/vale-styles/FluentBit/LyHyphens.yml b/vale-styles/FluentBit/LyHyphens.yml
new file mode 100644
index 000000000..ac8f557a4
--- /dev/null
+++ b/vale-styles/FluentBit/LyHyphens.yml
@@ -0,0 +1,14 @@
+extends: existence
+message: "'%s' doesn't need a hyphen."
+link: 'https://developers.google.com/style/hyphens'
+level: error
+ignorecase: false
+nonword: true
+action:
+  name: edit
+  params:
+    - replace
+    - '-'
+    - ' '
+tokens:
+  - '\s[^\s-]+ly-'
diff --git a/vale-styles/FluentBit/MayMightCan.yml b/vale-styles/FluentBit/MayMightCan.yml
new file mode 100644
index 000000000..8d75bb53a
--- /dev/null
+++ b/vale-styles/FluentBit/MayMightCan.yml
@@ -0,0 +1,7 @@
+---
+extends: existence
+message: "Use 'can' for permissions or 'might' for possibility."
+level: error
+ignorecase: true
+tokens:
+  - may
diff --git a/vale-styles/FluentBit/NonStandardQuotes.yml b/vale-styles/FluentBit/NonStandardQuotes.yml
new file mode 100644
index 000000000..61e8f5a02
--- /dev/null
+++ b/vale-styles/FluentBit/NonStandardQuotes.yml
@@ -0,0 +1,8 @@
+---
+extends: existence
+message: 'Use standard single quotes or double quotes only. Do not use left or right quotes.'
+level: error
+ignorecase: true
+scope: raw
+raw:
+  - '[‘’“”]'
diff --git a/vale-styles/FluentBit/OptionalPlurals.yml b/vale-styles/FluentBit/OptionalPlurals.yml
new file mode 100644
index 000000000..f858ea6fe
--- /dev/null
+++ b/vale-styles/FluentBit/OptionalPlurals.yml
@@ -0,0 +1,12 @@
+extends: existence
+message: "Don't use plurals in parentheses such as in '%s'."
+link: 'https://developers.google.com/style/plurals-parentheses'
+level: error
+nonword: true
+action:
+  name: edit
+  params:
+    - remove
+    - '(s)'
+tokens:
+  - '\b\w+\(s\)'
diff --git a/vale-styles/FluentBit/Ordinal.yml b/vale-styles/FluentBit/Ordinal.yml
new file mode 100644
index 000000000..d1ac7d27e
--- /dev/null
+++ b/vale-styles/FluentBit/Ordinal.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Spell out all ordinal numbers ('%s') in text."
+link: 'https://developers.google.com/style/numbers'
+level: error
+nonword: true
+tokens:
+  - \d+(?:st|nd|rd|th)
diff --git a/vale-styles/FluentBit/Passive.yml b/vale-styles/FluentBit/Passive.yml
new file mode 100644
index 000000000..b52c01204
--- /dev/null
+++ b/vale-styles/FluentBit/Passive.yml
@@ -0,0 +1,184 @@
+extends: existence
+link: 'https://developers.google.com/style/voice'
+message: "In general, use active voice instead of passive voice ('%s')."
+ignorecase: true
+level: suggestion
+raw:
+  - \b(am|are|were|being|is|been|was|be)\b\s*
+tokens:
+  - '[\w]+ed'
+  - awoken
+  - beat
+  - become
+  - been
+  - begun
+  - bent
+  - beset
+  - bet
+  - bid
+  - bidden
+  - bitten
+  - bled
+  - blown
+  - born
+  - bought
+  - bound
+  - bred
+  - broadcast
+  - broken
+  - brought
+  - built
+  - burnt
+  - burst
+  - cast
+  - caught
+  - chosen
+  - clung
+  - come
+  - cost
+  - crept
+  - cut
+  - dealt
+  - dived
+  - done
+  - drawn
+  - dreamt
+  - driven
+  - drunk
+  - dug
+  - eaten
+  - fallen
+  - fed
+  - felt
+  - fit
+  - fled
+  - flown
+  - flung
+  - forbidden
+  - foregone
+  - forgiven
+  - forgotten
+  - forsaken
+  - fought
+  - found
+  - frozen
+  - given
+  - gone
+  - gotten
+  - ground
+  - grown
+  - heard
+  - held
+  - hidden
+  - hit
+  - hung
+  - hurt
+  - kept
+  - knelt
+  - knit
+  - known
+  - laid
+  - lain
+  - leapt
+  - learnt
+  - led
+  - left
+  - lent
+  - let
+  - lighted
+  - lost
+  - made
+  - meant
+  - met
+  - misspelt
+  - mistaken
+  - mown
+  - overcome
+  - overdone
+  - overtaken
+  - overthrown
+  - paid
+  - pled
+  - proven
+  - put
+  - quit
+  - read
+  - rid
+  - ridden
+  - risen
+  - run
+  - rung
+  - said
+  - sat
+  - sawn
+  - seen
+  - sent
+  - set
+  - sewn
+  - shaken
+  - shaven
+  - shed
+  - shod
+  - shone
+  - shorn
+  - shot
+  - shown
+  - shrunk
+  - shut
+  - slain
+  - slept
+  - slid
+  - slit
+  - slung
+  - smitten
+  - sold
+  - sought
+  - sown
+  - sped
+  - spent
+  - spilt
+  - spit
+  - split
+  - spoken
+  - spread
+  - sprung
+  - spun
+  - stolen
+  - stood
+  - stridden
+  - striven
+  - struck
+  - strung
+  - stuck
+  - stung
+  - stunk
+  - sung
+  - sunk
+  - swept
+  - swollen
+  - sworn
+  - swum
+  - swung
+  - taken
+  - taught
+  - thought
+  - thrived
+  - thrown
+  - thrust
+  - told
+  - torn
+  - trodden
+  - understood
+  - upheld
+  - upset
+  - wed
+  - wept
+  - withheld
+  - withstood
+  - woken
+  - won
+  - worn
+  - wound
+  - woven
+  - written
+  - wrung
\ No newline at end of file
diff --git a/vale-styles/FluentBit/Periods.yml b/vale-styles/FluentBit/Periods.yml
new file mode 100644
index 000000000..d24a6a6c0
--- /dev/null
+++ b/vale-styles/FluentBit/Periods.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Don't use periods with acronyms or initialisms such as '%s'."
+link: 'https://developers.google.com/style/abbreviations'
+level: error
+nonword: true
+tokens:
+  - '\b(?:[A-Z]\.){3,}'
diff --git a/vale-styles/FluentBit/Possessives.yml b/vale-styles/FluentBit/Possessives.yml
new file mode 100644
index 000000000..394cbbb62
--- /dev/null
+++ b/vale-styles/FluentBit/Possessives.yml
@@ -0,0 +1,7 @@
+---
+extends: existence
+message: "Rewrite '%s' to not use 's."
+level: warning
+ignorecase: true
+tokens:
+  - Bit's
diff --git a/vale-styles/FluentBit/Quotes.yml b/vale-styles/FluentBit/Quotes.yml
new file mode 100644
index 000000000..f9c927459
--- /dev/null
+++ b/vale-styles/FluentBit/Quotes.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Commas and periods go inside quotation marks."
+link: 'https://developers.google.com/style/quotation-marks'
+level: suggestion
+nonword: true
+tokens:
+  - '"[^"]+"[.,?]'
\ No newline at end of file
diff --git a/vale-styles/FluentBit/Ranges.yml b/vale-styles/FluentBit/Ranges.yml
new file mode 100644
index 000000000..30fb25d22
--- /dev/null
+++ b/vale-styles/FluentBit/Ranges.yml
@@ -0,0 +1,7 @@
+extends: existence
+message: "Don't add words such as 'from' or 'between' to describe a range of numbers."
+link: 'https://developers.google.com/style/hyphens'
+nonword: true
+level: error
+tokens:
+  - '(?:from|between)\s\d+\s?-\s?\d+'
diff --git a/vale-styles/FluentBit/Repetition.yml b/vale-styles/FluentBit/Repetition.yml
new file mode 100644
index 000000000..36bd97ddd
--- /dev/null
+++ b/vale-styles/FluentBit/Repetition.yml
@@ -0,0 +1,7 @@
+---
+extends: repetition
+message: '"%s" is repeated.'
+level: error
+alpha: true
+tokens:
+  - '[^\s]+'
diff --git a/vale-styles/FluentBit/SentenceLengthLong.yml b/vale-styles/FluentBit/SentenceLengthLong.yml
new file mode 100644
index 000000000..556580b10
--- /dev/null
+++ b/vale-styles/FluentBit/SentenceLengthLong.yml
@@ -0,0 +1,7 @@
+---
+extends: occurrence
+message: "Improve readability by using fewer than 35 words in this sentence."
+scope: sentence
+level: suggestion
+max: 35
+token: \b(\w+)\b
diff --git a/vale-styles/FluentBit/Simplicity.yml b/vale-styles/FluentBit/Simplicity.yml
new file mode 100644
index 000000000..7e2f4549f
--- /dev/null
+++ b/vale-styles/FluentBit/Simplicity.yml
@@ -0,0 +1,12 @@
+---
+extends: existence
+message: 'Avoid words like "%s" that imply ease of use, because the user may find this action difficult.'
+level: warning
+ignorecase: true
+tokens:
+  - easy
+  - easily
+  - handy
+  - simple
+  - simply
+  - useful
diff --git a/vale-styles/FluentBit/Slang.yml b/vale-styles/FluentBit/Slang.yml
new file mode 100644
index 000000000..63f4c248a
--- /dev/null
+++ b/vale-styles/FluentBit/Slang.yml
@@ -0,0 +1,11 @@
+extends: existence
+message: "Don't use internet slang abbreviations such as '%s'."
+link: 'https://developers.google.com/style/abbreviations'
+ignorecase: true
+level: error
+tokens:
+  - 'tl;dr'
+  - ymmv
+  - rtfm
+  - imo
+  - fwiw
diff --git a/vale-styles/FluentBit/Spacing.yml b/vale-styles/FluentBit/Spacing.yml
new file mode 100644
index 000000000..27f7ca2bd
--- /dev/null
+++ b/vale-styles/FluentBit/Spacing.yml
@@ -0,0 +1,8 @@
+extends: existence
+message: "'%s' should have one space."
+link: 'https://developers.google.com/style/sentence-spacing'
+level: error
+nonword: true
+tokens:
+  - '[a-z][.?!] {2,}[A-Z]'
+  - '[a-z][.?!][A-Z]'
diff --git a/vale-styles/FluentBit/Spelling-exceptions.txt b/vale-styles/FluentBit/Spelling-exceptions.txt
new file mode 100644
index 000000000..27a10f7af
--- /dev/null
+++ b/vale-styles/FluentBit/Spelling-exceptions.txt
@@ -0,0 +1,254 @@
+accessor
+accessors
+allowlist
+Ansible
+API
+APIs
+Appname
+autoscale
+autoscaler
+autoscaling
+Avro
+backoff
+backporting
+backpressure
+backtrace
+Bazel
+BitBake
+Blackhole
+blocklist
+boolean
+Buildkite
+Buildroot
+cAdvisor
+Calyptia
+Chronosphere
+chronotf
+clickstreams
+CloudWatch
+CMake
+cmdlet
+cmetrics
+collectd
+Config
+Coralogix
+coroutine
+coroutines
+cron
+Crowdstrike
+CRDs
+DaemonSet
+Dash0
+Datadog
+Datagen
+datagram
+datagrams
+datapoint
+Datastream
+declaratively
+deduplicate
+deduplication
+Deployer
+deprovision
+deprovisioned
+deprovisioning
+deprovisions
+Devo
+distroless
+DogStatsD
+downsample
+downsampled
+downsamples
+downsampling
+downscale
+downscaling
+downscales
+dri
+Dynatrace
+Elasticsearch
+endcode
+endhint
+endtab
+endtabs
+Enum
+Eventhouse
+Exabeam
+Fargate
+Filebeats
+Firehose
+FluentBit
+Fluentd
+formatter
+formatters
+github
+glibc
+Golang
+golib
+Grafana
+Graphite
+Graylog
+grpc_code
+grpc_method
+grpc_service
+gzip
+gzipped
+HashiCorp
+HEC
+Homebrew
+hostname
+Hostname
+Ingester
+inotify
+Keepalive
+Istio
+jemalloc
+keepalive
+keyless
+Kinesis
+kubectl
+kubelet
+Kube
+Kubernetes
+Kusto
+labelset
+libpq
+librdkafka
+loadgenerator
+logfmt
+Logstash
+Lua
+Lucene
+macOS
+Mandiant
+markdownlint
+matchers
+metacharacter
+Metricbeat
+Minishift
+minikube
+MTTx
+multiline
+multithreading
+Musl
+namespace
+namespaces
+netcat
+Nginx
+NGINX
+OAuth
+Okta
+Onigmo
+Oniguruma
+OpenSearch
+OpenObserve
+OpenTelemetry
+Opsgenie
+OTel
+PagerDuty
+performant
+persistable
+Podman
+popen
+Postgres
+PostgreSQL
+PowerShell
+prepopulate
+preprocessor
+Profiler
+Prometheus
+PromQL
+proto
+protobuf
+Protobuf
+proxying
+Pulumi
+Pushgateway
+quantile
+quantiles
+queryable
+Queryable
+Raspbian
+rdkafka
+Redpanda
+remapper
+reindexed
+rollup
+Rollup
+rollups
+Rollups
+routable
+Rubular
+runbook
+runbooks
+Scalyr
+SDKs
+SELinux
+serverless
+ServiceDiscovery
+ServiceMonitor
+ServiceMonitors
+sharding
+SignalFx
+Signup
+Sigstore
+sparkline
+sparklines
+Sparklines
+Splunk
+Stackdriver
+StatsD
+stderr
+stdout
+strftime
+subcommand
+subcommands
+subkey
+subkeys
+subquery
+subrecord
+substring
+sysinfo
+syslog
+systemctl
+systemd
+Tanzu
+Telegraf
+templated
+temporality
+Tensorflow
+Terraform
+textfile
+Thanos
+Timeshift
+tolerations
+tooltip
+tooltips
+truthy
+uber
+unaggregated
+unary
+Unary
+unmuted
+unnests
+unsort
+upsert
+upserts
+untrusted
+UUIDs
+Vectra
+Vercel
+VictoriaMetrics
+VictorOps
+Vivo
+VMs
+Wasm
+Wavefront
+winevtlog
+winlog
+Winlogbeat
+Worldmap
+Yocto
+Zipkin
+Zsh
+Zstandard
+zstd
diff --git a/vale-styles/FluentBit/Spelling.yml b/vale-styles/FluentBit/Spelling.yml
new file mode 100644
index 000000000..46cc6dc74
--- /dev/null
+++ b/vale-styles/FluentBit/Spelling.yml
@@ -0,0 +1,5 @@
+extends: spelling
+message: "Spelling check: '%s'?"
+level: suggestion
+ignore:
+  - FluentBit/Spelling-exceptions.txt
diff --git a/vale-styles/FluentBit/Subjunctive.yml b/vale-styles/FluentBit/Subjunctive.yml
new file mode 100644
index 000000000..f7087389c
--- /dev/null
+++ b/vale-styles/FluentBit/Subjunctive.yml
@@ -0,0 +1,14 @@
+---
+extends: existence
+message: "Use the indicative or imperative moods when writing docs."
+ignorecase: true
+level: suggestion
+tokens:
+  - should
+  - shouldn't
+  - should not
+  - won't
+  - would
+  - wouldn't
+  - could
+  - couldn't
diff --git a/vale-styles/FluentBit/Terms.yml b/vale-styles/FluentBit/Terms.yml
new file mode 100644
index 000000000..6ad4cf2e3
--- /dev/null
+++ b/vale-styles/FluentBit/Terms.yml
@@ -0,0 +1,13 @@
+---
+extends: substitution
+message: Use '%s' instead of '%s'.
+level: suggestion
+ignorecase: true
+scope: paragraph
+action:
+  name: replace
+swap:
+  datapoints: data points
+  Terraform Provider: Terraform provider
+  timeseries: time series
+  topology: placement
diff --git a/vale-styles/FluentBit/Units.yml b/vale-styles/FluentBit/Units.yml
new file mode 100644
index 000000000..be5ac6589
--- /dev/null
+++ b/vale-styles/FluentBit/Units.yml
@@ -0,0 +1,11 @@
+extends: existence
+message: "Put a nonbreaking space between the number and the unit in '%s'."
+link: 'https://developers.google.com/style/units-of-measure'
+nonword: true
+level: suggestion
+tokens:
+  - \d+(?:B|kB|KB|KiB|MB|MiB|GB|GiB|TB|TiB)
+  - \d+(?:ns|ms|s|min|h|d)
+
+exceptions:
+  - k3s
diff --git a/vale-styles/FluentBit/UserFocus.yml b/vale-styles/FluentBit/UserFocus.yml
new file mode 100644
index 000000000..340ad71e7
--- /dev/null
+++ b/vale-styles/FluentBit/UserFocus.yml
@@ -0,0 +1,17 @@
+---
+extends: existence
+message: "Rewrite to put the focus on what the user wants to do rather than on how the document is laid out."
+ignorecase: true
+level: suggestion
+tokens:
+  - The purpose of this document is
+  - This document (?:describes|explains|shows)
+  - This page (?:describes|explains|shows)
+  - This page (?:describes|explains|shows)
+  - This document (?:describes|explains|shows)
+  - This section (?:describes|explains|shows)
+  - This section (?:describes|explains|shows)
+  - The following page (?:describes|explains|shows)
+  - The following document (?:describes|explains|shows)
+  - The following section (?:describes|explains|shows)
+  - This topic (?:describes|explains|shows)
diff --git a/vale-styles/FluentBit/We.yml b/vale-styles/FluentBit/We.yml
new file mode 100644
index 000000000..ffe69e65d
--- /dev/null
+++ b/vale-styles/FluentBit/We.yml
@@ -0,0 +1,11 @@
+extends: existence
+message: "Try to avoid using first-person plural like '%s'."
+link: 'https://developers.google.com/style/pronouns#personal-pronouns'
+level: suggestion
+ignorecase: true
+tokens:
+  - we
+  - we'(?:ve|re)
+  - ours?
+  - us
+  - let's
\ No newline at end of file
diff --git a/vale-styles/FluentBit/WordList.yml b/vale-styles/FluentBit/WordList.yml
new file mode 100644
index 000000000..f6d666f27
--- /dev/null
+++ b/vale-styles/FluentBit/WordList.yml
@@ -0,0 +1,75 @@
+extends: substitution
+message: "Use '%s' instead of '%s'."
+link: 'https://developers.google.com/style/word-list'
+level: suggestion
+ignorecase: false
+action:
+  name: replace
+swap:
+  '(?:API Console|dev|developer) key': API key
+  '(?:cell ?phone|smart ?phone)': phone|mobile phone
+  '(?:dev|developer|APIs) console': API console
+  '(?:e-mail|Email|E-mail)': email
+  '(?:file ?path|path ?name)': path
+  '(?:kill|terminate|abort)': stop|exit|cancel|end
+  '(?:OAuth ?2|Oauth)': OAuth 2.0
+  '(?:ok|Okay)': OK|okay
+  '(?:WiFi|wifi)': Wi-Fi
+  '[\.]+apk': APK
+  '3\-D': 3D
+  'Google (?:I\-O|IO)': Google I/O
+  'tap (?:&|and) hold': touch & hold
+  'un(?:check|select)': clear
+  # account name: username
+  action bar: app bar
+  admin: administrator
+  Ajax: AJAX
+  allows to: lets you
+  allows you to: lets you
+  Android device: Android-powered device
+  android: Android
+  API explorer: APIs Explorer
+  approx\.: approximately
+  as well as: and
+  authN: authentication
+  authZ: authorization
+  autoupdate: automatically update
+  blacklist: blocklist
+  cellular data: mobile data
+  cellular network: mobile network
+  chapter: documents|pages|sections
+  Container Engine: Kubernetes Engine
+  curated roles: predefined roles
+  data are: data is
+  Developers Console: Google API Console|API Console
+  ephemeral IP address: ephemeral external IP address
+  fewer data: less data
+  file name: filename
+  firewalls: firewall rules
+  functionality: capability|feature
+  Google account: Google Account
+  Google accounts: Google Accounts
+  Googling: search with Google
+  grayed-out: unavailable
+  HTTPs: HTTPS
+  in order to: to
+  # ingest: import|load
+  k8s: Kubernetes
+  network IP address: internal IP address
+  omnibox: address bar
+  open-source: open source
+  overview screen: recents screen
+  regex: regular expression
+  SHA1: SHA-1|HAS-SHA1
+  sign into: sign in to
+  \w* ?sign-?on: single sign-on
+  static IP address: static external IP address
+  stylesheet: style sheet
+  synch: sync
+  tablename: table name
+  tablet: device
+  url:  URL
+  vs\.: versus
+  whitelist: allowlist
+  wish: want
+  World Wide Web: web
