<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>Eric D. Schabell</title><description>Thoughts on cloud, observability, appdev, architecture, and open source software, but not always in that order...</description><managingEditor>noreply@blogger.com (Eric D. Schabell)</managingEditor><pubDate>Thu, 4 Jun 2026 18:00:49 +0200</pubDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1688</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">20</openSearch:itemsPerPage><link>http://www.schabell.org/</link><language>en-us</language><item><title>Mastering Fluent Bit: Beginners Guide for Contributing to our CNCF Project Docs</title><link>http://www.schabell.org/2026/05/mastering-fluentbit-beginners-guide-for-contributing-to-our-cncf-project-docs.html</link><category>Cloud</category><category>Cloud Data</category><category>Cloud Native</category><category>Containers</category><category>Fluent Bit</category><category>Mastering Fluent Bit</category><category>Observability</category><pubDate>Fri, 15 May 2026 07:00:00 +0200</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-1786619750853605795</guid><description>&lt;div class="separator" style="caret-color: rgb(68, 68, 68); clear: both;"&gt;&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s960/Mastering%20Fluent%20Bit%20Blog%20Series.png" rel="nofollow" style="clear: left; color: #1a56db; display: inline; float: left; font-family: Inter, system-ui, -apple-system, sans-serif; font-size: 16px; margin-bottom: 1em; margin-right: 1em; text-align: center; text-decoration: none;" target="_blank"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="180" loading="lazy" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s320-rw/Mastering%20Fluent%20Bit%20Blog%20Series.png" style="-webkit-box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 0px; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border-radius: 0px; border: 1px solid transparent; box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 0px; padding: 8px; position: relative;" width="320" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;This series is a general purpose getting started guide for those of us wanting to learn about the Cloud Native Computing Foundation (CNCF) project Fluent Bit.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="font-family: Inter, system-ui, -apple-system, sans-serif; text-align: left;"&gt;&lt;/p&gt;&lt;p style="font-family: Inter, system-ui, -apple-system, sans-serif; text-align: left;"&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;Each article in this series addresses a single topic by providing insights into what the topic is, why we are interested in exploring that topic, where to get started with the topic, and how to get hands-on with learning about the topic as it relates to the Fluent Bit project.&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;The idea is that each article can stand on its own, but that they also lead down a path that slowly increases our abilities to implement solutions with Fluent Bit telemetry pipelines.&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="caret-color: rgb(0, 0, 0);"&gt;Let's take a look at the topic of this article, contributing to the&amp;nbsp;&lt;/span&gt;&lt;a class="underline underline underline-offset-2 decoration-1 decoration-current/40 hover:decoration-current focus:decoration-current" href="https://docs.fluentbit.io/"&gt;Fluent Bit docs project&lt;/a&gt;&lt;span style="caret-color: rgb(0, 0, 0);"&gt;. This is a follow-up to &lt;a href="https://www.schabell.org/2026/05/mastering-fluentbit-beginners-guide-for-contributing-to-our-cncf-project-website.html" rel="nofollow" target="_blank"&gt;our&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;a href="https://www.schabell.org/2026/05/mastering-fluentbit-beginners-guide-for-contributing-to-our-cncf-project-website.html" rel="nofollow" target="_blank"&gt;previous article&lt;/a&gt; on contributing to the Fluent Bit project website&lt;span style="caret-color: rgb(0, 0, 0);"&gt;, and this time we go a step further by tackling documentation contributions. If we can find something undocumented, clarify something confusing, or fix a gap between what the code does and what the docs say — that is a genuine contribution that the community notices.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;All examples in this article have been done on OSX and are assuming the reader is able to convert the actions shown here to their own local machines.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;&lt;strong&gt;&lt;span style="font-family: inherit;"&gt;Contributing to the Fluent Bit docs project?&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]" style="caret-color: rgb(0, 0, 0);"&gt;&lt;span style="font-family: inherit;"&gt;Before diving into the hands-on steps, let's understand why contributing to the Fluent Bit docs matters and why it's a great fit for anyone new to contributing to a CNCF project.&lt;/span&gt;&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]" style="caret-color: rgb(0, 0, 0);"&gt;&lt;span style="font-family: inherit;"&gt;The Fluent Bit documentation is the first place developers go when they are trying to figure out how to configure an input plugin, wire up an output, or understand a pipeline behavior. Gaps in that documentation have a real cost — people waste time, open issues that aren't actually bugs, or simply give up. When you fix a doc, you are helping every developer who comes after you.&lt;/span&gt;&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]" style="caret-color: rgb(0, 0, 0);"&gt;&lt;span style="font-family: inherit;"&gt;Contributing docs also gives you a natural reason to dig into the code. You often end up reading the actual source to understand what a plugin really does before you write about it. That is how you start building the intuition that eventually gets you contributing code too. But for now, let's start with documentation and get our first PR in.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Where to get started&lt;/strong&gt;&lt;/h3&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]" style="caret-color: rgb(0, 0, 0);"&gt;&lt;span style="font-family: inherit;"&gt;This time we have two repositories we need to work on the docs project. The docs project does not live in the same place as the code project, and both are relevant to any fixes we are making as we want to verify everything against the existing code.&lt;/span&gt;&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]" style="caret-color: rgb(0, 0, 0);"&gt;&lt;span style="font-family: inherit;"&gt;The first project is the code project found at&amp;nbsp;&lt;a class="underline underline underline-offset-2 decoration-1 decoration-current/40 hover:decoration-current focus:decoration-current" href="https://github.com/fluent/fluent-bit"&gt;fluent/fluent-bit&lt;/a&gt;, the upstream canonical source code repository, and&amp;nbsp;we need to fork it to our own&amp;nbsp;&lt;em&gt;username/fluent-bit-fork. &lt;/em&gt;Easy enough to do using the GitHub UI.&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;We reference the code project when we need to understand what a feature actually does in practice before we document it. Note, as with our previous article, the fork has been renamed with the&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&lt;/span&gt;&lt;strong style="font-family: inherit;"&gt;-fork&lt;/strong&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;suffix to make it easy to identify at a glance. We clone this fork to our location machine.&lt;/span&gt;&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; color: #444444; font-family: inherit; font-size: 14px; font-variant-ligatures: normal; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Fork the original code project using GitHub.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Check out the fork locally, here using my fork as an example.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ git clone git@github.com:eschabell/fluent-bit-fork.git&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Add the upstream website repo.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ git remote add upstream https://github.com/fluent/fluent-bit.git&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]" style="caret-color: rgb(0, 0, 0);"&gt;&lt;span style="font-family: inherit;"&gt;The second project is the docs project found at&amp;nbsp;&lt;a class="underline underline underline-offset-2 decoration-1 decoration-current/40 hover:decoration-current focus:decoration-current" href="https://github.com/fluent/fluent-bit-docs"&gt;fluent/fluent-bit-docs&lt;/a&gt;, the upstream documentation repository where all the actual docs content lives, and&amp;nbsp;we need to fork this to our own&amp;nbsp;&lt;em&gt;username/fluent-bit-docs-fork.&amp;nbsp;&lt;/em&gt;This is where our documentation changes will land.&lt;/span&gt;&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; color: #444444; font-family: inherit; font-size: 14px; font-variant-ligatures: normal; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Fork the original docs project using GitHub.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Check out the fork locally, here using my fork as an example.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ git clone git@github.com:eschabell/fluent-bit-docs-fork.git&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Add the upstream website repo.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ git remote add upstream https://github.com/fluent/fluent-bit-docs.git&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]" style="caret-color: rgb(0, 0, 0);"&gt;&lt;span style="font-family: inherit;"&gt;So now we've set up both locally, forking each repository on GitHub, then cloning and adding the upstream remote for each, just as we did in the previous article.&lt;/span&gt;&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]" style="caret-color: rgb(0, 0, 0);"&gt;&lt;span style="caret-color: rgb(68, 68, 68); font-size: 16px;"&gt;&lt;span style="font-family: inherit;"&gt;This is a habit worth building from day one — always sync from upstream before starting any new contribution, This prevents the diverged branch headache that will slow down our pull request later, see below for my example:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; caret-color: rgb(68, 68, 68); color: #444444; font-family: inherit; font-size: 14px; font-variant-ligatures: normal; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Fetch any upstream work done by others.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ git fetch upstream&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Sync local fork with the upstream changes.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ git rebase upstream/master&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Last step, push to your fork's repository.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ git push&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p style="caret-color: rgb(68, 68, 68); font-size: 16px;"&gt;&lt;span style="font-family: inherit;"&gt;Now we are ready to get started with our first change to the Fluent Bit docs.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="caret-color: rgb(68, 68, 68); font-size: 16px; text-align: left;"&gt;&lt;strong&gt;Finding a fix that is needed&lt;/strong&gt;&lt;/h3&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]" style="caret-color: rgb(0, 0, 0); font-size: 16px;"&gt;&lt;span style="font-family: inherit;"&gt;There are two natural ways to find something worth fixing. The first is the GitHub &lt;a href="https://github.com/fluent/fluent-bit-docs/issues" rel="nofollow" target="_blank"&gt;issues list&lt;/a&gt; on the fluent-bit-docs repository. Look for issues tagged with&amp;nbsp;&lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]"&gt;documentation&lt;/code&gt;,&amp;nbsp;&lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]"&gt;help wanted&lt;/code&gt;, or&amp;nbsp;&lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]"&gt;good first issue&lt;/code&gt;. These are explicitly flagged by maintainers as accessible starting points. I'll be honest with you though, we don't have a lot of those. We tend to keep our issues list on the docs site to a minimum.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]" style="caret-color: rgb(0, 0, 0); font-size: 16px;"&gt;The second, and frankly more satisfying, is to discover something yourself. Again, being honest with you, using AI to assist you in this is making this path easier than you might think. Either way, when exploring a plugin page and notice a spelling mistake, a missing configuration option, or just wanting to add an example configuration you've used yourself are all valid ways to get started.&amp;nbsp;&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]" style="caret-color: rgb(0, 0, 0); font-size: 16px;"&gt;Maybe you try to follow an example and find it no longer works with the current version. Sometimes you can discover a mismatch between what the docs describe and what the code in your fluent-bit-fork actually does (or your AI explorations reveal). That kind of gap is a real contribution waiting to happen. Cross-referencing the docs against the code is exactly the kind of work maintainers appreciate and rarely have enough time to do themselves.&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]" style="caret-color: rgb(0, 0, 0); font-size: 16px;"&gt;Either way, a nice-to-have habit worth building: open a GitHub issue on fluent-bit-docs&amp;nbsp;&lt;em&gt;before&lt;/em&gt;&amp;nbsp;starting the work. Describe what you found and what you plan to fix. It takes just a few minutes, gives maintainers visibility, allows you to ask any questions you might have, and means your PR can reference fixing a specific issue number when you submit it.&amp;nbsp;&lt;/p&gt;&lt;h3 style="caret-color: rgb(68, 68, 68); font-size: 16px;"&gt;&lt;strong&gt;Start with a branch&lt;/strong&gt;&lt;/h3&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;Once you have found something to fix, it should be noted that the common practice is to never work directly on our main branch. Every change, no matter how small, gets its own branch. The branch name should be descriptive enough to focus on the changes you are making. I personally always use my name to preface all branches as it makes it easier to find in larger listings of branches for bigger projects.&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;Below is an example of a real branch I was working on recently in the Fluent Bit docs project.&lt;/p&gt;&lt;/div&gt;&lt;div class="separator" style="caret-color: rgb(68, 68, 68); clear: both; font-family: Inter, system-ui, -apple-system, sans-serif; font-size: 16px;"&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; font-family: inherit; font-size: 14px; font-variant-ligatures: normal; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&amp;nbsp;Starting in our forked master.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;$ git checkout -b erics_processors_tda_fixes &lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;Switched to a new branch 'erics_processors_tda_fixes'&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; caret-color: rgb(68, 68, 68); color: #444444; font-family: Inter, system-ui, -apple-system, sans-serif; font-size: 16px; font-variant-ligatures: normal;"&gt;&lt;span face="-webkit-standard" style="caret-color: rgb(0, 0, 0); color: black; font-size: medium;"&gt;Note this is also listing the path the the file I'm working on during this fix. Another standard way of working that I like to apply.&lt;/span&gt;&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; caret-color: rgb(68, 68, 68); color: #444444; font-size: 16px; font-variant-ligatures: normal;"&gt;&lt;span style="font-family: inherit;"&gt;Now make the actual documentation changes. The fluent-bit-docs repository uses Markdown files organized by topic area. Find the relevant file, make your edit, and use the structure and conventions you see in the surrounding content as your guide. The project has a specific style and voice — mirror it rather than going off on your own. Keep the change focused. One file per commit (and if possible, per PR) is a better habit than bundling five things together, especially when you are starting out.&lt;/span&gt;&lt;span face="-webkit-standard" style="caret-color: rgb(0, 0, 0); color: black; font-size: medium;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h3 style="caret-color: rgb(68, 68, 68); font-size: 16px;"&gt;&lt;strong&gt;Testing documentation changes&lt;/strong&gt;&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; caret-color: rgb(68, 68, 68); color: #444444; font-size: 16px; font-variant-ligatures: normal;"&gt;&lt;span style="font-family: inherit;"&gt;The docs project uses Vale for prose linting, which checks style consistency and catches common documentation issues before they reach the reviewers. Run it locally before committing so you are not finding out about style violations in CI after the PR is already open.&lt;/span&gt;&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; font-variant-ligatures: normal;"&gt;&lt;span&gt;&lt;span style="color: #444444; font-family: inherit;"&gt;&lt;span style="caret-color: rgb(68, 68, 68);"&gt;The following shows a run that basically passes, but has a few suggestions mentioned. It's common to find them outside the. applied changes, and if you do, it's not a bad habit to &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #444444;"&gt;&lt;span style="caret-color: rgb(68, 68, 68);"&gt;try&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #444444; font-family: inherit;"&gt;&lt;span style="caret-color: rgb(68, 68, 68);"&gt;&amp;nbsp;and fix them with the changes you are making to this file.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;# Testing docs changes uses Vale to parse against our project rules.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;$ vale pipeline/processors/tda.md&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;pipeline/processors/tda.md
 65:1   suggestion  Spelling check: 'x_t'?                                                  FluentBit.Spelling
 65:12  suggestion  Spelling check: 'x_t'?                                                  FluentBit.Spelling
 91:27  suggestion  Spelling check: 'x_i'?                                                  FluentBit.Spelling
 94:18  suggestion  Spelling check: 'x_i'?                                                  FluentBit.Spelling
 94:24  suggestion  Spelling check: 'x_j'?                                                  FluentBit.Spelling
 156:4  suggestion  'Interpreting Betti numbers' should use sentence-style capitalization.  FluentBit.Headings

✔ 0 errors, 0 warnings and 6 suggestions in 1 file.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;# Once you have completed all fixes, the Vale test should run as follows.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;$ vale pipeline/processors/tda.md&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: black; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;✔ 0 errors, 0 warnings and 0 suggestions in 1 file.&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="caret-color: rgb(68, 68, 68); color: #444444; font-size: 16px;"&gt;This is the docs equivalent of making sure the unit tests pass before you commit code — it shows respect for the reviewers' time and signals that you know the contribution process.&lt;/p&gt;&lt;h3 style="caret-color: rgb(68, 68, 68); font-size: 16px;"&gt;&lt;strong&gt;Committing changes&lt;/strong&gt;&lt;/h3&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;Before committing, take a moment to compose a proper commit message. This is not optional and it is not a formality. A good commit message tells the story of&amp;nbsp;&lt;em&gt;what&lt;/em&gt;&amp;nbsp;changed and&amp;nbsp;&lt;em&gt;why&lt;/em&gt;, and it is the permanent record you are attaching your name to.&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;The format to follow: a short subject line (under 72 characters) describing the change, a blank line, then a bullet list in the body covering specifically what was modified and the reason behind each change. Note that a good habit is to indicate the file change location in the first line as shown.&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;# A good commit message.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;docs: pipeline: processors: tda: doc validation fixes

  - Fix sentence-case heading (TDA title)
  - Merge hard-wrapped paragraph lines for GitBook rendering
  - Add LaTeX math delimiters to R^{mD} notation
  - Fix MD060 table column alignment in parameters and metrics tables
  - Sort configuration parameters table alphabetically.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  Fixes issue #2999.&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="caret-color: rgb(68, 68, 68); color: #444444; font-size: 16px;"&gt;&lt;span style="background-color: white;"&gt;The last line in the commit is used to point to the issue that this change is addressing. If you tag your commit message with the issue number, it will auto-close the issue on the merge of this docs PR into the master branch. The following is the workflow for adding, committing, and pushing your changes.&lt;/span&gt;&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); color: #444444; font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;# When ready to submit our changes.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;$ git add pipeline/processors/tda.md&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;# Commit the changes using a signed commit (assumes GPG set up).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;$ git commit -S&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;# Push the changes to our repository&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;$ git push&amp;nbsp;&lt;/span&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;--set-upstream origin erics_processors_tda_fixes&lt;/span&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;  &lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="caret-color: rgb(68, 68, 68); color: #444444; font-size: 16px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white;"&gt;Now we open a pull request against&amp;nbsp;&lt;/span&gt;&lt;i style="background-color: white;"&gt;fluent/fluent-bit-docs&lt;/i&gt;&lt;span style="background-color: white;"&gt;&amp;nbsp;from the GitHub UI. In the pull request description it should automatically fill with your commit message details. Be sure to explicitly request a review — do not assume the PR will be picked up automatically, and make sure to tag a reviewer. If for some reason it's not possible to request a review through the UI, then feel free to post a comment after submitting the PR and ask me (@eschabell) to review as I'm always happy to help.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style="caret-color: rgb(68, 68, 68); font-size: 16px;"&gt;AI good habits for contributors&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="caret-color: rgb(68, 68, 68); color: #444444; font-size: 16px;"&gt;&lt;span style="font-family: inherit;"&gt;This section is worth paying close attention to, because AI tooling is now part of many developers' daily workflow and if used carelessly in an open source context it can create real problems and broken trust with core project maintainers.&lt;/span&gt;&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="caret-color: rgb(68, 68, 68); color: #444444; font-size: 16px;"&gt;&lt;span style="font-family: inherit;"&gt;Here are my personal ground rules for working with AI assistance on open source projects and how I work with Fluent Bit projects.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Use your local fork filesystem&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="caret-color: rgb(68, 68, 68); color: #444444; font-size: 16px;"&gt;&lt;span style="font-family: inherit;"&gt;Configure your AI tool to work against your local fork checkouts — not a downloaded copy to&amp;nbsp;&lt;i&gt;/tmp&lt;/i&gt;&amp;nbsp;or any other ephemeral scratch directory. This is important because your working directory is already version-controlled. Every change the AI proposes is immediately visible via git diff, which means you always know exactly what changed before you decide to commit anything. It also saves on token usage and bandwidth speeding up the AI results to your queries.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Never let AI modify without your approval&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="caret-color: rgb(68, 68, 68); color: #444444; font-size: 16px;"&gt;&lt;span style="font-family: inherit;"&gt;I always set a personal rule:&amp;nbsp;&lt;i&gt;no line of code or documentation changes without your explicit review and approval, line by line&lt;/i&gt;. AI tools should propose changes and you accept, reject, or modify them. This is not just good open source hygiene — it is how you learn the codebase and the project's conventions. The Fluent Bit docs and website have a specific voice and structure. Furthermore, you are putting your name (signing the commits) on any changes you are pushing, so you might want to make sure you agree with each line that is being modified in your name.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Never let AI touch git&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="caret-color: rgb(68, 68, 68); color: #444444; font-size: 16px;"&gt;&lt;span style="font-family: inherit;"&gt;This one is non-negotiable for me in git interactions with my upstream repositories. AI does not commit, does not push, does not fork, and does not open pull requests in my inner developer loop. I do all of that manually. Commits are attribution. When you sign a commit with your name and email, you are asserting that you wrote or have the right to submit that content. In a CNCF project operating under a DCO (Developer Certificate of Origin), this is a legal and community trust matter, not a formality. Keep your hands on the wheel for all git operations and you will also understand the processes and retain your skills.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Check for tests when adding new code&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="caret-color: rgb(68, 68, 68); color: #444444; font-size: 16px;"&gt;&lt;span style="font-family: inherit;"&gt;This one is more for code based repositories, but good to know as background information here. If your contribution goes beyond a documentation change and into actual code — a plugin, a configuration example, a script — check whether the Fluent Bit fork has existing test patterns for that area. Follow them. If you are adding testable behavior, add tests. Ask in the PR or issue if you are unsure what test coverage is expected. Maintainers would rather answer that question up front than request changes after review.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Always provide a proper commit message&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="caret-color: rgb(68, 68, 68); color: #444444; font-size: 16px;"&gt;&lt;span style="font-family: inherit;"&gt;Every commit should have a clear, structured message. At minimum: a short subject line describing what changed, followed by a list in the body describing why and what specifically was modified. It must be signed or it will fail on DCO sign-off &amp;nbsp;in the CI/CD process. Check the contributing guide for the expected standard. A good commit message is also your own paper trail — if a maintainer asks why you changed something, your commit history should answer the question. Remember, you are signing this, not your AI tooling.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Nice to have: open an issue before a PR&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="caret-color: rgb(68, 68, 68); color: #444444; font-size: 16px;"&gt;&lt;span style="font-family: inherit;"&gt;For anything beyond a trivially obvious contribution, the best practice is to open a GitHub issue first. Describe what you want to write or fix, get a signal from the maintainers that it is welcome, then do the work and open the PR referencing that you are fixing that issue.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="caret-color: rgb(68, 68, 68); color: #444444; font-family: Inter, system-ui, -apple-system, sans-serif; font-size: 16px; margin: 0px; position: relative;"&gt;More in the series&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="caret-color: rgb(68, 68, 68); color: #444444; font-size: 16px;"&gt;&lt;span style="font-family: inherit;"&gt;In this article we explored step-by-step what it takes to make our first documentation contribution to the Fluent Bit docs project — from setting up our fork, testing Vale locally, and submitting a pull request. Finally we tried to help with establishing good habits around AI tooling along the way.&lt;/span&gt;&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="caret-color: rgb(68, 68, 68); color: #444444; font-size: 16px;"&gt;&lt;span style="font-family: inherit;"&gt;There will be more in this series as you continue to learn how to configure, run, manage, and master the use of Fluent Bit in the wild. Get started with Fluent Bit today using&amp;nbsp;&lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit/" rel="nofollow" target="_blank"&gt;this&amp;nbsp;online free workshop&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s72-c-rw/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>Mastering Fluent Bit: Beginners Guide for Contributing to our CNCF Project Website</title><link>http://www.schabell.org/2026/05/mastering-fluentbit-beginners-guide-for-contributing-to-our-cncf-project-website.html</link><category>Cloud</category><category>Cloud Data</category><category>Cloud Native</category><category>Containers</category><category>Fluent Bit</category><category>Mastering Fluent Bit</category><category>Observability</category><pubDate>Wed, 6 May 2026 07:00:00 +0200</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-696249066206627669</guid><description>&lt;div class="separator" style="clear: both;"&gt;&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s960/Mastering%20Fluent%20Bit%20Blog%20Series.png" style="clear: left; display: inline; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s320/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="320" /&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;This series is a general purpose getting started guide for those of us wanting to learn about the Cloud Native Computing Foundation (CNCF) project Fluent Bit.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Each article in this series addresses a single topic by providing insights into what the topic is, why we are interested in exploring that topic, where to get started with the topic, and how to get hands-on with learning about the topic as it relates to the Fluent Bit project.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;The idea is that each article can stand on its own, but that they also lead down a path that slowly increases our abilities to implement solutions with Fluent Bit telemetry pipelines.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Let's take a look at the topic of this article, contributing to the &lt;a href="https://fluentbit.io" rel="nofollow" target="_blank"&gt;Fluent Bit project website&lt;/a&gt;. This article will be a hands-on exploration of how to get started contributing blog articles to the Fluent Bit project website, something that is very accessible to newcomers and a great way to become part of the community.&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;All examples in this article have been done on OSX and are assuming the reader is able to convert the actions shown here to their own local machines.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;Contributing to the Fluent Bit website?&lt;/h3&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;Before diving into the hands-on steps, let's understand why contributing to the Fluent Bit website matters and why it's a great starting point for those of us new to contributing to a CNCF project.&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;The Fluent Bit project website is where the community shares knowledge, tutorials, and updates with the world. Contributing a blog article means you are directly adding value to the project — helping other developers learn, discover use cases, and get hands-on experience with Fluent Bit telemetry pipelines. No deep knowledge of C is required, no need to wrestle with complex build pipelines. Just ideas, a bit of Hugo familiarity, and a willingness to follow the contribution process.&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;As a CNCF graduated project, Fluent Bit has an active and welcoming community. Getting your name into the contributor history by writing a blog article is a genuinely meaningful step into open source participation.&lt;/p&gt;&lt;h3&gt;Where to get started&lt;/h3&gt;&lt;p&gt;The Fluent Bit website lives at &lt;a href="https://github.com/fluent/fluent-bit-website" rel="nofollow" target="_blank"&gt;fluent/fluent-bit-website&lt;/a&gt; on GitHub. Before we touch a single line, there are two repositories we need to understand and keep straight in our heads throughout this process.&lt;/p&gt;&lt;p&gt;The first is &lt;a href="https://github.com/fluent/fluent-bit-website" rel="nofollow" target="_blank"&gt;fluent/fluent-bit-website&lt;/a&gt;, the upstream canonical repository owned by the Fluent community. We never push directly to this one.&lt;/p&gt;&lt;p&gt;The second is &lt;i&gt;your-username/fluent-bit-website-fork&lt;/i&gt;, a personal fork of the repository where all our work happens before it goes upstream via a pull request. Note it's been renamed to add the &lt;b&gt;-fork&lt;/b&gt;&amp;nbsp;to the repository name, a standard practice to easily identify forked projects.&lt;/p&gt;&lt;p&gt;Forking the repository on GitHub, then we clone our fork locally, and finally, we add the upstream remote so we can always sync our local copy with what the community is doing directly from our command line.&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; caret-color: rgb(68, 68, 68); color: #444444; font-family: inherit; font-size: 14px; font-variant-ligatures: normal; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Fork the original website using GitHub.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Check out the fork locally, here using my fork as an example.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ git clone git@github.com:eschabell/fluent-bit-website-fork.git&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Add the upstream website repo.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ git remote add upstream https://github.com/fluent/fluent-bit-website.git&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It's a habit worth building from day one — always sync from upstream before starting any new contribution, This prevents the diverged branch headache that will slow down our pull request later, see below for my example:&lt;/p&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; caret-color: rgb(68, 68, 68); color: #444444; font-family: inherit; font-size: 14px; font-variant-ligatures: normal; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Fetch any upstream work done by others.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ git fetch upstream&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Sync local fork with the upstream changes.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ git rebase upstream/main&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Last step, push to your fork's repository.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ git push&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With our fork cloned, verify the site builds locally. The Fluent Bit website uses &lt;a href="https://gohugo.io" rel="nofollow" target="_blank"&gt;Hugo&lt;/a&gt;, so install it (an exercise left to the reader), then run the Hugo server and open a browser to confirm the site renders before making any changes.&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; font-variant-ligatures: normal; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Start your local copy of the website on http://localhost:9999&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ hugo server -D -p 9999&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;Watching for config changes in .../fluent-bit-website-fork/config.toml
Start building sites …
hugo v0.161.1
                  │ EN
──────────────────┼─────
 Pages            │ 337
 Paginator pages  │   0
 Non-page files   │   0
 Static files     │ 315
 Processed images │   0
 Aliases          │   1
 Cleaned          │   0

Built in 319 ms
Environment: "development"
Serving pages from disk
Running in Fast Render Mode.
Web Server is available at //localhost:9999/ (bind address 127.0.0.1)
Press Ctrl+C to stop&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If all goes well we should see this on &lt;i&gt;http://localhost:9999&lt;/i&gt;&amp;nbsp;on your local machine:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEh4gQ0RCWq3TUezKlEP26Iavg_zAsSO6zBa3C4cnqW-9XsuwaKuVmZqp_oupLZ3KnE2PEn7ujvBa47cNQYdcCxuZdqHZqwbBduDT0DB9ZMsXQhuMm96D9EHd-9DXnNanJGqzLhcIpbBfYjIs7ih-ADpaHe2ZqQ_uwLk8nu6GwSRechELPj_ac61GVgjCU4" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="1450" data-original-width="2754" height="336" src="https://blogger.googleusercontent.com/img/a/AVvXsEh4gQ0RCWq3TUezKlEP26Iavg_zAsSO6zBa3C4cnqW-9XsuwaKuVmZqp_oupLZ3KnE2PEn7ujvBa47cNQYdcCxuZdqHZqwbBduDT0DB9ZMsXQhuMm96D9EHd-9DXnNanJGqzLhcIpbBfYjIs7ih-ADpaHe2ZqQ_uwLk8nu6GwSRechELPj_ac61GVgjCU4=w640-h336" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;Now we are ready to get started with our first change to the Fluent Bit website, maybe submitting an article?&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3&gt;How to contribute our first article&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; font-variant-ligatures: normal;"&gt;The Fluent Bit website is a Hugo site, which means every blog article is a &lt;i&gt;Markdown&lt;/i&gt; file with a &lt;i&gt;YAML&lt;/i&gt; &lt;i&gt;&lt;a href="https://gohugo.io/content-management/front-matter/" rel="nofollow" target="_blank"&gt;front matter&lt;/a&gt;&lt;/i&gt; block at the top. This header is not optional — Hugo uses it to generate the page metadata, listing views, author information, dates, and tags. Getting the front matter right is the first practical task. It covers fields like title, date, author, tags, and any project-specific fields the site uses.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; font-variant-ligatures: normal;"&gt;This is a sample from the Fluent Bit latest release announcement blog, found under &lt;i&gt;content/announcements/v5.0/&lt;/i&gt;:&lt;/p&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; caret-color: rgb(68, 68, 68); color: #444444; font-family: inherit; font-size: 14px; font-variant-ligatures: normal; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;---&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;title: 'v5.0.6'
description: 'Next generation Telemetry Agent for Logs, Metrics and Traces.'
url: "/announcements/v5.0.6/"
release_date: 2026-05-21
publishdate: 2026-05-21
ver: v5.0.6
herobg: "/images/hero@2x.jpg"
latestVer: true
---&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; font-variant-ligatures: normal;"&gt;The fastest way to get this right is not to try and write it from memory. Instead, we open the blog content directory (&lt;i&gt;content/posts/&lt;/i&gt;) in our local fork checkout and find a recently merged article to use as your reference. Mirror its file naming convention, the directory placement, and the front matter fields. Read a few existing articles to understand the tone and content that fits the Fluent Bit blog — tutorials, integration guides, project updates, and community spotlights are all examples of what works well there.&lt;/p&gt;&lt;h3&gt;Writing our article&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; font-variant-ligatures: normal;"&gt;With front matter understood, we need to write our article in a Markdown file locally and use the Hugo server to preview it as we work. The audience is the Fluent Bit community — developers, operators, and platform engineers — so assume technical literacy but do not assume deep Fluent Bit expertise, especially for introductory topics.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Submitting our changes&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; font-variant-ligatures: normal;"&gt;Once the article is written and previewed correctly, here is the process to follow to submit your changes to the website project for maintainer review. Create a new branch off the synced fork — we never want to work directly on our main branch. Commit your new file with a clear, descriptive commit message. Push to your fork as shown below.&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;# Work on a branch.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;$ git checkout -b erics_my_new_article&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;# When ready to submit our changes.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;$ git add content/posts/my-new-fb-article.md&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;# Commit the changes using a signed commit (assumes GPG set up).&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;$ git commit -S&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;# Push the changes to our repository&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;$ git push&amp;nbsp;&lt;/span&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;--set-upstream origin erics_my_new_article&lt;/span&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;  &lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;span style="background-color: white; caret-color: rgb(68, 68, 68);"&gt;Now we open a pull request against&amp;nbsp;&lt;/span&gt;&lt;i style="background-color: white; caret-color: rgb(68, 68, 68);"&gt;fluent/fluent-bit-website&lt;/i&gt;&lt;span style="background-color: white;"&gt;&lt;span style="caret-color: rgb(68, 68, 68);"&gt;&amp;nbsp;from the GitHub UI. In the pull request description, explain what the article covers and why it is a good fit for the blog. Then explicitly request a review — do not assume the PR will be picked up automatically, and make sure to tag a reviewer. If for some reason it's not possible to request a review through the UI, then feel free to post a comment after submitting the PR and ask me (@eschabell) to review as I'm always happy to help.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;AI good habits for contributors&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;This section is worth paying close attention to, because AI tooling is now part of many developers' daily workflow and if used carelessly in an open source context it can create real problems and broken trust with core project maintainers.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Here are my personal ground rules for working with AI assistance on open source projects and how I work with Fluent Bit projects.&lt;/p&gt;&lt;h4 style="text-align: left;"&gt;Use your local fork filesystem&lt;/h4&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Configure your AI tool to work against your local fork checkouts — not a downloaded copy to &lt;i&gt;/tmp&lt;/i&gt; or any other ephemeral scratch directory. This is important because your working directory is already version-controlled. Every change the AI proposes is immediately visible via git diff, which means you always know exactly what changed before you decide to commit anything. It also saves on token usage and bandwidth speeding up the AI results to your queries.&lt;/p&gt;&lt;h4 style="text-align: left;"&gt;Never let AI modify without your approval&lt;/h4&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;I always set a personal rule: &lt;i&gt;no line of code or documentation changes without your explicit review and approval, line by line&lt;/i&gt;. AI tools should propose changes and you accept, reject, or modify them. This is not just good open source hygiene — it is how you learn the codebase and the project's conventions. The Fluent Bit docs and website have a specific voice and structure. Furthermore, you are putting your name (signing the commits) on any changes you are pushing, so you might want to make real sure you agree with each line that is being modified in your name.&lt;/p&gt;&lt;h4 style="text-align: left;"&gt;Never let AI touch git&lt;/h4&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;This one is non-negotiable for me in git interactions with my upstream repositories. AI does not commit, does not push, does not fork, and does not open pull requests in my inner developer loop. I do all of that manually. Commits are attribution. When you sign a commit with your name and email, you are asserting that you wrote or have the right to submit that content. In a CNCF project operating under a DCO (Developer Certificate of Origin), this is a legal and community trust matter, not a formality. Keep your hands on the wheel for all git operations and you will also understand the processes and retain your skills.&lt;/p&gt;&lt;h4 style="text-align: left;"&gt;Check for tests when adding new code&lt;/h4&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;This one is more for code based repositories, but good to know as background information here. If your contribution goes beyond a blog article and into actual code — a plugin, a configuration example, a script — check whether the Fluent Bit fork has existing test patterns for that area. Follow them. If you are adding testable behavior, add tests. Ask in the PR or issue if you are unsure what test coverage is expected. Maintainers would rather answer that question up front than request changes after review.&lt;/p&gt;&lt;h4 style="text-align: left;"&gt;Always provide a proper commit message&lt;/h4&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Every commit should have a clear, structured message. At minimum: a short subject line describing what changed, followed by a list in the body describing why and what specifically was modified. It must be signed or it will fail on DCO sign-off &amp;nbsp;in the CI/CD process. Check the contributing guide for the expected standard. A good commit message is also your own paper trail — if a maintainer asks why you changed something, your commit history should answer the question. Remember, you are signing this, not your AI tooling.&lt;/p&gt;&lt;h4 style="text-align: left;"&gt;Nice to have: open an issue before a PR&lt;/h4&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;This is more for code repositories than for the website project, but good background information. For anything beyond a trivially obvious contribution, the best practice is to open a GitHub issue first. Describe what you want to write or fix, get a signal from the maintainers that it is welcome, then do the work and open the PR referencing that you are fixing that issue.&lt;/p&gt;&lt;h3&gt;More in the series&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;In this article we explored step-by-step what it takes to make our first article contribution to the Fluent Bit project website — from setting up our fork and getting Hugo running locally, to configuring a blog article and submitting a pull request. Finally we tried to help with establishing good habits around AI tooling along the way.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;There will be more in this series as you continue to learn how to configure, run, manage, and master the use of Fluent Bit in the wild. Get started with Fluent Bit today using &lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit/" rel="nofollow" target="_blank"&gt;this&amp;nbsp;online free workshop&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s72-c/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>A New Chapter: Joining SUSE as Technical Advocacy Lead</title><link>http://www.schabell.org/2026/05/a-new-chapter-joining-suse-as-technoloy-advocacy-lead.html</link><category>AppDev</category><category>Cloud</category><category>Cloud Data</category><category>Cloud Native</category><category>Containers</category><category>event</category><category>Fluent Bit</category><category>Linux</category><category>Mastering Fluent Bit</category><category>Meetup</category><category>Observability</category><category>openSUSE</category><category>OpenTelemetry</category><category>Perses</category><category>Prometheus</category><category>Publishing</category><category>Workshops</category><pubDate>Fri, 1 May 2026 07:00:00 +0200</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-136957426833215121</guid><description>&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMKdTGA7yJqVAE5nS0Pn9YOzKJZdMsVXCUfIxgtpDRspbnjJJFiJaUu7VTLArC-sJKv4IgT2bSZB3nK1zbd5kkCYOnminIt2OGzYp_-98U8PgX7TeEQOaLasalM9_p49ozHAkmUFL-0K__vphu_uwDjrhsPjNRrQu4DXlVXjRrFYGTyEkUeEqk0c6GybM/s170/SUSE_Logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="156" data-original-width="170" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMKdTGA7yJqVAE5nS0Pn9YOzKJZdMsVXCUfIxgtpDRspbnjJJFiJaUu7VTLArC-sJKv4IgT2bSZB3nK1zbd5kkCYOnminIt2OGzYp_-98U8PgX7TeEQOaLasalM9_p49ozHAkmUFL-0K__vphu_uwDjrhsPjNRrQu4DXlVXjRrFYGTyEkUeEqk0c6GybM/s1600/SUSE_Logo.jpg" width="170" /&gt;&lt;/a&gt;&lt;/div&gt;There are moments in your career where the path forward becomes surprisingly clear. After years of building, shipping, and advocating in the open source and cloud native ecosystem, I find myself at one of those moments.&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Today I'm excited to share that I've joined &lt;a href="https://www.suse.com" rel="nofollow" target="_blank"&gt;SUSE&lt;/a&gt; as Technical Advocacy Lead — and I couldn't be more energized about what lies ahead.&lt;/p&gt;&lt;p&gt;Let me back up a bit, because getting here is a story worth telling.&lt;/p&gt;&lt;span&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;h3 style="text-align: left;"&gt;The Chronosphere Chapter Closes&lt;/h3&gt;&lt;p&gt;Most of you who follow this blog know that for the past few years I've been doing what I love most: building technical advocacy teams, creating hands-on content, and helping developers navigate the world of observability. My time at &lt;a href="https://chronosphere.io" rel="nofollow" target="_blank"&gt;Chronosphere&lt;/a&gt; was a whirlwind of Fluent Bit, Perses, OpenTelemetry, Prometheus, and &lt;a href="https://eschabell.gitlab.io/speakerhub/" rel="nofollow" target="_blank"&gt;more conference stages&lt;/a&gt; than I can count. We built something genuinely good there — a team that cared deeply about community, about making the hard stuff accessible, and about doing the work rather than just talking about it.&lt;/p&gt;&lt;p&gt;Then came the acquisition by &lt;a href="https://www.paloaltonetworks.com/company/press/2026/palo-alto-networks-completes-chronosphere-acquisition--unifying-observability-and-security-for-the-ai-era" rel="nofollow" target="_blank"&gt;Palo Alto Networks (PANW)&lt;/a&gt;, and with it the kind of organizational pivot that signals a company's priorities are shifting. PANW is a security company first, and that changes everything about how a technical advocacy function fits into the picture. There was nothing wrong with the outcome — acquisitions are part of the tech landscape — but for me it meant it was time to start looking at what came next.&lt;/p&gt;&lt;p&gt;That's a different kind of crossroads than most people talk about. It's not about being unhappy or burned out. It's about knowing what kind of work you do best, where you add real value, and having the self-awareness to admit when the environment no longer fits. I've been fortunate enough in this career to know the difference.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Taking the Break (And Actually Taking It)&lt;/h3&gt;&lt;p&gt;Before jumping into anything new, I made a deliberate choice to step back for three months to look for something new I really wanted to do. I want to be honest about this: I did not treat that break the way a lot of people treat them. I stopped measuring my days by travel (last year I was on the road for +140 days), conference submissions, &lt;a href="https://eschabell.gitlab.io/workshops-site/" rel="nofollow" target="_blank"&gt;workshops&lt;/a&gt;, and &lt;a href="https://www.schabell.org" rel="nofollow" target="_blank"&gt;article output&lt;/a&gt;. I worked on the open source project Fluent Bit. I played a lot of golf. I went back to some of the things that remind me why I got into this world in the first place while researching possible new adventures.&lt;/p&gt;&lt;p&gt;When you've been running at full speed for years — &lt;a href="https://eschabell.gitlab.io/speakerhub/" rel="nofollow" target="_blank"&gt;speaking&lt;/a&gt;, &lt;a href="https://www.schabell.org" rel="nofollow" target="_blank"&gt;publishing&lt;/a&gt;, &lt;a href="https://bsky.app/profile/schabell.org" rel="nofollow" target="_blank"&gt;socializing&lt;/a&gt;, building &lt;a href="https://eschabell.gitlab.io/workshops-site/" rel="nofollow" target="_blank"&gt;hands-on workshops&lt;/a&gt;, evangelizing across communities — you can lose track of what fuels you versus what drains you. That break gave me the reset I didn't know I needed. I came back genuinely curious again. Hungry for the right reasons.&lt;/p&gt;&lt;p&gt;Three months sounds like a long time when you're a person who typically has six blog posts scheduled in advance. Trust me, it went fast, and I'd recommend it to anyone navigating a transition.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Why SUSE?&lt;/h3&gt;&lt;p&gt;When I started looking at what was next, I had a simple filter: I wanted to be somewhere with deep open source roots, genuine community investment, and a team I already trusted. SUSE checked all three boxes in a way that made the decision feel less like a job search and more like coming home.&lt;/p&gt;&lt;p&gt;The open source credentials speak for themselves. SUSE has been at the center of the Linux and enterprise open source world for decades. This is not a company that added an open source strategy as an afterthought or a marketing play. It runs all the way through the culture. And for someone who has spent the better part of their career operating at the intersection of community and technology, that matters more than most people realize.&lt;/p&gt;&lt;p&gt;But honestly? What tipped the scales was the people.&lt;/p&gt;&lt;p&gt;When I started having conversations with the team, I kept running into old friends. People I'd shared stages with, collaborated on projects with, and grabbed beers with at KubeCon hallway tracks over the years. The open source world is small in the best possible way — you get to know who is real and who is performing, who does the work and who just talks about it. The people at SUSE who I already knew were always the ones doing the work. That is not a coincidence; it says something about the culture that attracts and keeps them.&lt;/p&gt;&lt;p&gt;It felt less like a job interview and more like a reunion of friends hanging out in a pub.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;The Role: Technical Advocacy Lead&lt;/h3&gt;&lt;p&gt;The title is Technical Advocacy Lead, and I'll tell you what that means to me in practice.&lt;/p&gt;&lt;p&gt;I'll be working with a team of very senior technology advocates — people who have deep expertise, strong opinions about how things should be done, and the kind of track record that means they don't need to be told what good looks like. My job, something I'm always trying to insist on, is player-coaching. I always try to be more of a guide while remaining hands-on in the open source technologies that we all know and love. There is always so much to do and learn, new technology arriving on the scene as old ones depart. What's not to love about learning and sharing with others?&lt;/p&gt;&lt;p&gt;I've led advocacy teams before, and what I've learned is that the most important thing you can do for a team of strong individual contributors is get out of their way — strategically. Guiding the direction, building the frameworks for their production, and removing the friction. Let the experts be experts and share that with the world.&lt;/p&gt;&lt;p&gt;What does the work look like in practice? The four pillars I've lived by for years still apply: speaking, publishing, socializing, and hands-on content generation. If you've been reading this blog, you know that's exactly how I operate. Conference talks that go deep on real technical problems. Blog series that walk you through the details rather than hand-waving past them. Workshops where you actually get your hands dirty. Community conversations that happen at hallway tracks and meetup tables as much as on stage.&lt;/p&gt;&lt;p&gt;That framework doesn't change. The technology stack and the problems we're solving alongside the community will evolve, and I'm looking forward to getting deep on them all.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;What's Coming on This Blog&lt;/h3&gt;&lt;p&gt;One thing that won't change: this blog. I've been writing here for nearly two decades — no ads, no clickbait, no ulterior motive beyond sharing what I'm learning and working on with anyone who finds it useful. That continues.&lt;/p&gt;&lt;p&gt;You can expect content to start reflecting the world I'm operating in at SUSE. That means Linux, open source infrastructure, cloud native ecosystems, AI, and whatever technical problems are worth working through in public. The Mastering Fluent Bit series isn't going anywhere either — that work belongs to the community and I'll keep contributing to it.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Ready to Go&lt;/h3&gt;&lt;p&gt;Three months of rest. A role that fits. A team I'm genuinely excited to work with. A company built on values I share. I've been doing this long enough to recognize when the conditions are right. The conditions are right.&lt;/p&gt;&lt;p&gt;If you're heading to an event in the coming months and want to connect, find me on the usual channels. And if you're working on something interesting in the open source or cloud native space and want to collaborate, reach out — that's always been how the best work gets started.&lt;/p&gt;&lt;p&gt;Here's to the next chapter. Let's build something worth talking about.&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMKdTGA7yJqVAE5nS0Pn9YOzKJZdMsVXCUfIxgtpDRspbnjJJFiJaUu7VTLArC-sJKv4IgT2bSZB3nK1zbd5kkCYOnminIt2OGzYp_-98U8PgX7TeEQOaLasalM9_p49ozHAkmUFL-0K__vphu_uwDjrhsPjNRrQu4DXlVXjRrFYGTyEkUeEqk0c6GybM/s72-c/SUSE_Logo.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>Installing openSUSE Tumbleweed on MacBook Pro 13 inch (late 2011)</title><link>http://www.schabell.org/2026/02/installing-opensuse-tumbleweed-on-macbook-pro-13-inch-late-2011.html</link><category>Linux</category><category>Macbook</category><category>openSUSE</category><pubDate>Thu, 12 Feb 2026 07:00:00 +0100</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-126116441582213372</guid><description>&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEhWRAq_vccYOsg6XNaiheiwmg9VFK8B49VrKhP4uDj86XV6rLbzNr_jmU1fOTcQiPv1Y3JhOe_faAjCmIsk6BJ0bHRYrj6juukIvB7wYpWi9r4JwiTWoLyisMZYohbUH15MV6yI2UbmYqHT7piEUzAfzZmOLCwaw1KU8dWBpw_BejsqoypXEX5TpVcs5ck" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="754" data-original-width="1752" height="138" src="https://blogger.googleusercontent.com/img/a/AVvXsEhWRAq_vccYOsg6XNaiheiwmg9VFK8B49VrKhP4uDj86XV6rLbzNr_jmU1fOTcQiPv1Y3JhOe_faAjCmIsk6BJ0bHRYrj6juukIvB7wYpWi9r4JwiTWoLyisMZYohbUH15MV6yI2UbmYqHT7piEUzAfzZmOLCwaw1KU8dWBpw_BejsqoypXEX5TpVcs5ck" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p style="text-align: left;"&gt;It's been awhile since I looked at my old Macbook Pro 13 inch from late 2011, with 125GB SSD and 8GB RAM. I've been on occasion posting articles about how to install Linux distributions on it and thought I'd give &lt;a href="https://get.opensuse.org/tumbleweed/?type=desktop" rel="nofollow" target="_blank"&gt;openSUSE&lt;/a&gt; a try this time.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;This is a machine I've taken on trips around the world and back in the day ran many sessions, workshops, and demos sharing all that developer goodness.&lt;/p&gt;&lt;p&gt;Below are the steps and adjustments needed to get openSUSE working on these laptops in no time.&lt;/p&gt;&lt;p&gt;The first step is to pick between the two options that are available to us for the desktop. I've chosen &lt;a href="https://get.opensuse.org/tumbleweed/?type=desktop" rel="nofollow" target="_blank"&gt;openSUSE Tumbleweed&lt;/a&gt;, which has the promise of "You install it once and enjoy it forever. No longer do you have to worry every six months about massive system upgrades that risk bricking your system."&lt;/p&gt;&lt;p&gt;The second step is to get an USB stick big enough to hold the &lt;a href="https://get.opensuse.org/tumbleweed/?type=desktop#download" rel="nofollow" target="_blank"&gt;openSUSE Tumbleweed&lt;/a&gt; iso image. Note we are not worried about version numbers, as you "...get frequent updates that not only address vulnerabilities or squash bugs, but reflect latest features and developments, such as fresh kernels, fresh drivers and recent desktop environment versions."&lt;/p&gt;&lt;span&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;I am a bit command line oriented so I just downloaded the offline 64-bit version offered as shown here:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjAwWsX3NQYqzy_V9Mo2tj7LM0xjZKtY3zeFsSKPliMhL16kB7X5J_nT1myfoYQNiR5swgk8bzlejiPTmhLKaW0Kd7xwVYrjETUibWm-fZA1bWFsjtRPqzTTzEzgPf8dbDfKclqvIN5VEc1hSaZ20U8tHZ3HcUAz9CvhYHba4sXkF8bvk3-vRjrm77AYOg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="410" data-original-width="1170" height="224" src="https://blogger.googleusercontent.com/img/a/AVvXsEjAwWsX3NQYqzy_V9Mo2tj7LM0xjZKtY3zeFsSKPliMhL16kB7X5J_nT1myfoYQNiR5swgk8bzlejiPTmhLKaW0Kd7xwVYrjETUibWm-fZA1bWFsjtRPqzTTzEzgPf8dbDfKclqvIN5VEc1hSaZ20U8tHZ3HcUAz9CvhYHba4sXkF8bvk3-vRjrm77AYOg=w640-h224" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;This iso image needs to be written onto the USB stick we have so I've used a modern MacBook and the terminal to run &lt;i&gt;diskutil list&lt;/i&gt;&amp;nbsp;which shows me the USB is disk4:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEhaswUEVvij2QaAk5qz14ti4PQn1BvFcZQES4b8O9UlsB0M_9_idvmFxvwvbFrIN_8Lx7_8pzMUxAUQoPe7-_lX8L2O_QOvl3QP8GfD4ZL83uJ8K1k629xwt3Hl3rVPCRLPa_gIOH4-9v7uMBJITTEblzvIdm4Ur-7Rt9G0DrycNrgHRDpJ2x9ekAA64dQ" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="318" data-original-width="1350" height="150" src="https://blogger.googleusercontent.com/img/a/AVvXsEhaswUEVvij2QaAk5qz14ti4PQn1BvFcZQES4b8O9UlsB0M_9_idvmFxvwvbFrIN_8Lx7_8pzMUxAUQoPe7-_lX8L2O_QOvl3QP8GfD4ZL83uJ8K1k629xwt3Hl3rVPCRLPa_gIOH4-9v7uMBJITTEblzvIdm4Ur-7Rt9G0DrycNrgHRDpJ2x9ekAA64dQ=w640-h150" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;Now make sure it's not mounted with&amp;nbsp;&lt;i&gt;diskutil unmountDisk /dev/disk4&lt;/i&gt;&amp;nbsp;and then run the following which shows not progress bar but takes quite awhile to complete the iso write to the USB stick so be patient:&lt;br /&gt;&lt;/p&gt;&lt;pre class="wp-block-preformatted" style="background-attachment: scroll; background-color: whitesmoke; background-image: none; background-position: 0px 0px; background-repeat: repeat; border: 1px solid rgba(0, 0, 0, 0.1); box-sizing: border-box; color: #3a3a3a; font-size: 16px; font-variant-ligatures: normal; line-height: 1.7; margin-bottom: 1.333em; margin-top: 1.333em; outline: medium; overflow-wrap: normal; overflow: auto hidden; padding: 1.3333em; word-break: break-all;"&gt;sudo sh -c "cat PATH_TO/openSUSE-Tumbleweed-VERSION-Media.iso &amp;gt; /dev/rdisk4"&lt;/pre&gt;&lt;p&gt;Once finished you can remove the USB device and move over to the old MacBook.&lt;/p&gt;&lt;div&gt;&lt;h3 style="text-align: left;"&gt;Installing on Macbook Pro 13 inch (late 2011)&lt;/h3&gt;&lt;p&gt;Insert the USB device you created above, there is a port on the left side for this, (re-)start your Macbook Pro and be sure to hold down the &lt;i&gt;Option (or alt) key&lt;/i&gt;, just to the left of the &lt;i&gt;CMD key&lt;/i&gt;. This opens a menu of options to start this machine from and we'll need to use the &lt;i&gt;EFI option&lt;/i&gt; as that's our USB image. Here you see I have the original macbook OSX setup installed.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgm3MQ4cmJ3gwnXxheo1hHPIcoqAgasuAKbPGHZo2Cr2_59bjcuHaql0N7YrJwlo_Wf6kVkbua_I5xQidE_aJWGKogy8msMcEQMAm2ZBJw-Ut_17t2Vd7YNsx_CwUd8MHaPOG4sND-kRjz9jlMHT7UpHAJkV5ldnPb09SXuCCqNhxPja9fe8-tIi7B1n9E" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="5712" data-original-width="4284" height="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEgm3MQ4cmJ3gwnXxheo1hHPIcoqAgasuAKbPGHZo2Cr2_59bjcuHaql0N7YrJwlo_Wf6kVkbua_I5xQidE_aJWGKogy8msMcEQMAm2ZBJw-Ut_17t2Vd7YNsx_CwUd8MHaPOG4sND-kRjz9jlMHT7UpHAJkV5ldnPb09SXuCCqNhxPja9fe8-tIi7B1n9E=w480-h640" width="480" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Now it's booting from the device and you just can follow the normal installation. It really helps if you have a network cable connection you can plug your Macbook Pro into as the broadcom wifi device does not work out of the box.&amp;nbsp;&lt;/p&gt;&lt;p&gt;First select from the boot menu the &lt;i&gt;Installation&lt;/i&gt; option to install openSUSE Tumbleweed:&lt;/p&gt;&lt;div&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjJet65LyEwISZtjViRZ0M--R2DEyoglsmIG_jUN4SSx86J5VUC3QYGEikMjlh_-VC0j_hxfUrlkBycPWxXHe0drzroEAIJPwhYMcZcx4wUN7DhSugbQRKll0z5gghD3cDnCbSeGMX_75hQRxlPHm9qD2htt6MRG0yiY8Iare1a7eyc6sFWO441OhvONlg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="4032" data-original-width="3024" height="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEjJet65LyEwISZtjViRZ0M--R2DEyoglsmIG_jUN4SSx86J5VUC3QYGEikMjlh_-VC0j_hxfUrlkBycPWxXHe0drzroEAIJPwhYMcZcx4wUN7DhSugbQRKll0z5gghD3cDnCbSeGMX_75hQRxlPHm9qD2htt6MRG0yiY8Iare1a7eyc6sFWO441OhvONlg=w480-h640" width="480" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;The installer will run through a bunch of checks as it works towards the partitioning of the disk.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjOHaBVVQSGfA0GPM2aY5pRd7i9_Nh3SHTRmF309YvCZoRUZ_0bJKEvC5QrmKGO1Fys_cO25eE1s7ugufjV_YZtrUEQ4ql2h3NZYRGxsO4zsJ4O1AHZOGIQUHril6cClWGClZKjlvWBjVc-BtWlCo1xYDjFr2iAOznNtr19z0WDRt543y95bdPXsfvt-TM" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="5712" data-original-width="4284" height="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEjOHaBVVQSGfA0GPM2aY5pRd7i9_Nh3SHTRmF309YvCZoRUZ_0bJKEvC5QrmKGO1Fys_cO25eE1s7ugufjV_YZtrUEQ4ql2h3NZYRGxsO4zsJ4O1AHZOGIQUHril6cClWGClZKjlvWBjVc-BtWlCo1xYDjFr2iAOznNtr19z0WDRt543y95bdPXsfvt-TM=w480-h640" width="480" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;It asks what type of system you want to install, I chose here the Gnome Desktop, feel free to explore any of the desktops you prefer.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEhwz_BxcuIlwm14juztPep5Ob3PssZF2iUU8EhNdyRAIVFnO31PuJGJ4_pokRXPTC_2zktU_WCYI3_ZF5S7lkn4WC4D8IIxS-aJSIcrZpByU8PQ4P8MtlSd91nqW7FmVOFadU0SH0fcDlkIzmR3VPrq0bBgPocGp7tlrhoXGmJT_ihiQM92SC9g1mAAiXY" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="4032" data-original-width="3024" height="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEhwz_BxcuIlwm14juztPep5Ob3PssZF2iUU8EhNdyRAIVFnO31PuJGJ4_pokRXPTC_2zktU_WCYI3_ZF5S7lkn4WC4D8IIxS-aJSIcrZpByU8PQ4P8MtlSd91nqW7FmVOFadU0SH0fcDlkIzmR3VPrq0bBgPocGp7tlrhoXGmJT_ihiQM92SC9g1mAAiXY=w480-h640" width="480" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;After this you end up at the disk phase where you are able to look at the partitioner tool. I always chose to leave the recovery HD and remove the OSX partition, then dividing that up into a /, /boot, /boot/efi, and swap partitions. If you wan to explore, then open the &lt;i&gt;Expert Partitioner&lt;/i&gt; on the bottom of the screen (exercise left to you who knows what you are doing).&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEj7wyhfWDH3SzLpvCK3Il-22i-EsxmBe7j5NDzH0HPqnME_sCA6tt-MW7C8Gz2GcXMitxSGkGB5Fk-txjcm_DQP2vjIcJ-jhegJY9wfm_jBDVetYvQKmv5xcrW_vSpIxAUWh4Pb07F55EXmvd8J5vRF8cffn-er7cYeNttLbEzFNIh27UaegDR2AU6Q5H4" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="5712" data-original-width="4284" height="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEj7wyhfWDH3SzLpvCK3Il-22i-EsxmBe7j5NDzH0HPqnME_sCA6tt-MW7C8Gz2GcXMitxSGkGB5Fk-txjcm_DQP2vjIcJ-jhegJY9wfm_jBDVetYvQKmv5xcrW_vSpIxAUWh4Pb07F55EXmvd8J5vRF8cffn-er7cYeNttLbEzFNIh27UaegDR2AU6Q5H4=w480-h640" width="480" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;As I've done this before on this MacBook I can just jump ahead and accept whatever the defaults are here by clicking on the &lt;i&gt;Next&lt;/i&gt;&amp;nbsp;button on the bottom right.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEhNMrD-SK0cjj08ORtdcSpSgOr8JNlkAgOqPnPnqHjOTzVoGsW5C506wwM_-AOE9o7pRz-TUkwl8xrfQnaw1qfVfDKIIxbYPK5FbWI2kehNauEWPGhHCO6bVhKgWPSKLqA-ah7sfMdxMtMw6oaUNePV8FY6L2FlfEUnKdBHvlws4KBg7yAbjsMKmDyFOvc" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="4284" data-original-width="5712" height="480" src="https://blogger.googleusercontent.com/img/a/AVvXsEhNMrD-SK0cjj08ORtdcSpSgOr8JNlkAgOqPnPnqHjOTzVoGsW5C506wwM_-AOE9o7pRz-TUkwl8xrfQnaw1qfVfDKIIxbYPK5FbWI2kehNauEWPGhHCO6bVhKgWPSKLqA-ah7sfMdxMtMw6oaUNePV8FY6L2FlfEUnKdBHvlws4KBg7yAbjsMKmDyFOvc=w640-h480" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;Next up, setting your timezone.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEh4r85f8PXdNna5Xc_88OdCdDBvrfvUUHRo00zUPN7__EwOdwSJtHovGql9l0piW61ZmIjhoUeoaRBS9L81hXOzRbKU6hEnqFYxLOlvlnhUO26jq-wBA85AIVPxn7fczxBIRBGFpkNElL6CPpem2tqAn3HDGe-38J_b8IU0VTMsLqrT2Kjxp5TWYeXdlW8" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="4284" data-original-width="5712" height="480" src="https://blogger.googleusercontent.com/img/a/AVvXsEh4r85f8PXdNna5Xc_88OdCdDBvrfvUUHRo00zUPN7__EwOdwSJtHovGql9l0piW61ZmIjhoUeoaRBS9L81hXOzRbKU6hEnqFYxLOlvlnhUO26jq-wBA85AIVPxn7fczxBIRBGFpkNElL6CPpem2tqAn3HDGe-38J_b8IU0VTMsLqrT2Kjxp5TWYeXdlW8=w640-h480" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;And your user.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEh5E4QLRMe1UK7ksDso3FQa89KsvRaXLrpq5N6P2MrmFrtFF_O3rBA2xPnDVKYr8ykoj17yt_g8Tpni9DpATWlc_0ubG8yxQk-HENwQ3pCsTLbd5Yb4KMdZX-GjF6lsdLnepLzCItRgc2srGN14DIrdUWRIwnem6A8LqCPvGAt9kNhrkqkeBaqGHNmYWt0" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="4284" data-original-width="5712" height="480" src="https://blogger.googleusercontent.com/img/a/AVvXsEh5E4QLRMe1UK7ksDso3FQa89KsvRaXLrpq5N6P2MrmFrtFF_O3rBA2xPnDVKYr8ykoj17yt_g8Tpni9DpATWlc_0ubG8yxQk-HENwQ3pCsTLbd5Yb4KMdZX-GjF6lsdLnepLzCItRgc2srGN14DIrdUWRIwnem6A8LqCPvGAt9kNhrkqkeBaqGHNmYWt0=w640-h480" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;Finally you can review all the things that are about to happen on this machine if you approve and click on the &lt;i&gt;Next&lt;/i&gt;&amp;nbsp;button.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEg6D8EGGiR7MQhqw27rns396TSWVdrbrV7NB1Z6wfRvToPiy1dVMp3cHE-xEHiRVHcCtUpvfXFDVoHUoUj8iRiKR39k0fIPB86L1Ad5pJ0uRGHSXJ5REThaAKjAstzmzBda90YjVu3xZi6FXyyxiws4teVoQV4vaQXiHUdsy_w1LyiUdOk8i8PCOoclOJ4" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="4284" data-original-width="5712" height="480" src="https://blogger.googleusercontent.com/img/a/AVvXsEg6D8EGGiR7MQhqw27rns396TSWVdrbrV7NB1Z6wfRvToPiy1dVMp3cHE-xEHiRVHcCtUpvfXFDVoHUoUj8iRiKR39k0fIPB86L1Ad5pJ0uRGHSXJ5REThaAKjAstzmzBda90YjVu3xZi6FXyyxiws4teVoQV4vaQXiHUdsy_w1LyiUdOk8i8PCOoclOJ4=w640-h480" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;Now you get to enjoy all the installation unfolding before your very eyes.&lt;p&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgwpII61MOhDsHms8NUfJWChGY4HAp3B4Jjdws9uccmKeUdg3ztS9BwgZtzPrNRX0kkR5-_89dp_q7csiZWN1R6XCkFan4CKeBUCsHCTqjdnDlLHIlO-W3FSyP7PePEHYd-H44fV-vH67c2qHK8sqPy1AcJRERpHvfy2nbXXZxRNmJ63ilTKil4chyPFRk" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="4284" data-original-width="5712" height="480" src="https://blogger.googleusercontent.com/img/a/AVvXsEgwpII61MOhDsHms8NUfJWChGY4HAp3B4Jjdws9uccmKeUdg3ztS9BwgZtzPrNRX0kkR5-_89dp_q7csiZWN1R6XCkFan4CKeBUCsHCTqjdnDlLHIlO-W3FSyP7PePEHYd-H44fV-vH67c2qHK8sqPy1AcJRERpHvfy2nbXXZxRNmJ63ilTKil4chyPFRk=w640-h480" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;Once you've completed the installer, you should see user login, something like the following.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEga8tq-Y-OofaX4_cA9g0pra6gXJtwwYgpb_NEOrreP_O8XiXMKCC4--Z11kfu64i7ufAEdi6UoUFoUCoiF6NcdGqYZ3RCMuS1UMzycyrTVdeWaYF8s3FMRdhGZDqwrS4p2W52ZVSbHJphQpTAg1OhtfxCbrFuABtBeBBKPtgT6aAToFJ4csEKRORUsslY" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="4284" data-original-width="5712" height="480" src="https://blogger.googleusercontent.com/img/a/AVvXsEga8tq-Y-OofaX4_cA9g0pra6gXJtwwYgpb_NEOrreP_O8XiXMKCC4--Z11kfu64i7ufAEdi6UoUFoUCoiF6NcdGqYZ3RCMuS1UMzycyrTVdeWaYF8s3FMRdhGZDqwrS4p2W52ZVSbHJphQpTAg1OhtfxCbrFuABtBeBBKPtgT6aAToFJ4csEKRORUsslY=w640-h480" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;After logging in you will see the introduction to openSUSE. You've done it!&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgdakJYc_lnHulGWkfF2ah4QyYHk97CZoj9pCjFthistGMG2wnwVMSK56ONq0u04x5Z1k69ZM9wopcTRd5y7tO_X_kDt-_Pcupupz-npiVFEvNJ66dUuDIZSqNxUi0UjmFFxi043HmOhPziuLoH-TiBD6-V5MBSv5DaJL28d5oRYMfVVqKXEqfYoaTXJ5c" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="4284" data-original-width="5712" height="480" src="https://blogger.googleusercontent.com/img/a/AVvXsEgdakJYc_lnHulGWkfF2ah4QyYHk97CZoj9pCjFthistGMG2wnwVMSK56ONq0u04x5Z1k69ZM9wopcTRd5y7tO_X_kDt-_Pcupupz-npiVFEvNJ66dUuDIZSqNxUi0UjmFFxi043HmOhPziuLoH-TiBD6-V5MBSv5DaJL28d5oRYMfVVqKXEqfYoaTXJ5c=w640-h480" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;This is just the basic starting point, we need to now update the packages, add a repository for the wireless drivers and development kernels, and install them before this is completed.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Updating the installation&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;This part is best done on the command line to ensure each step of the process is run without problems. Log in and open a terminal to start (note, our user password we setup is what you use for &lt;i&gt;root&lt;/i&gt; when asked by &lt;i&gt;sudo&lt;/i&gt;). We need to use the&amp;nbsp;&lt;i&gt;zypper &lt;/i&gt;package manager to refresh and update all the packages from the installer.&lt;/p&gt;&lt;pre class="wp-block-preformatted" style="background-attachment: scroll; background-color: whitesmoke; background-image: none; background-position: 0px 0px; background-repeat: repeat; border: 1px solid rgba(0, 0, 0, 0.1); box-sizing: border-box; color: #3a3a3a; font-size: 16px; font-variant-ligatures: normal; line-height: 1.7; margin-bottom: 1.333em; margin-top: 1.333em; outline: medium; overflow-wrap: normal; overflow: auto hidden; padding: 1.3333em; word-break: break-all;"&gt;sudo zypper refresh&lt;/pre&gt;&lt;pre class="wp-block-preformatted" style="background-attachment: scroll; background-color: whitesmoke; background-image: none; background-position: 0px 0px; background-repeat: repeat; border: 1px solid rgba(0, 0, 0, 0.1); box-sizing: border-box; color: #3a3a3a; font-size: 16px; font-variant-ligatures: normal; line-height: 1.7; margin-bottom: 1.333em; margin-top: 1.333em; outline: medium; overflow-wrap: normal; overflow: auto hidden; padding: 1.3333em; word-break: break-all;"&gt;sudo zypper dist-upgrade&lt;/pre&gt;&lt;p&gt;This will pull a bunch of new updated packages and install them. For the next part, fixing the wifi device, we need to install a new repository. The easiest way to do this is fine the YaST2 application in the menus and click on the &lt;i&gt;Add &lt;/i&gt;button on the bottom right.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEivOWAqTGlXayFDbA0C7f9mRbgf57la2uCDVV0wIydD1h1-pPfgjWoqE3zCdxHp6NWEp-5bdxUMOTBHcgLJWusrvXRcYrhW6NgEpFjgh3PaVBiI3PFeyH-tvo1gKqfjbhEkoUGqOLRCOrxgCFyIJpbn7j-wSRh63bMh0LO9K5pgzwQp9OtGkqBPKeJI2Es" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="3024" data-original-width="4032" height="480" src="https://blogger.googleusercontent.com/img/a/AVvXsEivOWAqTGlXayFDbA0C7f9mRbgf57la2uCDVV0wIydD1h1-pPfgjWoqE3zCdxHp6NWEp-5bdxUMOTBHcgLJWusrvXRcYrhW6NgEpFjgh3PaVBiI3PFeyH-tvo1gKqfjbhEkoUGqOLRCOrxgCFyIJpbn7j-wSRh63bMh0LO9K5pgzwQp9OtGkqBPKeJI2Es=w640-h480" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;This opens the list of available repositories and we want to select from the &lt;i&gt;Community Repositories &lt;/i&gt;as shown.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEiom6yglSQunrD-hod61aRlVEIbOKVTPEPhZHjshUwqrMyNgT-w54nbGhMLs2ST5ISOOeSkfSoZ65q2kBEeMvTI8jKuQDrjxZr1jnWZU4mikbVuhDDo6DF7HZ1Sb4q53LMDzJv2qJu0EX3EeL6l4gINL0OZYUdl_TAdVXWpNIQTcRPz7M64vfTJpKpxD9E" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="3024" data-original-width="4032" height="480" src="https://blogger.googleusercontent.com/img/a/AVvXsEiom6yglSQunrD-hod61aRlVEIbOKVTPEPhZHjshUwqrMyNgT-w54nbGhMLs2ST5ISOOeSkfSoZ65q2kBEeMvTI8jKuQDrjxZr1jnWZU4mikbVuhDDo6DF7HZ1Sb4q53LMDzJv2qJu0EX3EeL6l4gINL0OZYUdl_TAdVXWpNIQTcRPz7M64vfTJpKpxD9E=w640-h480" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;Next select the &lt;i&gt;Packman &lt;/i&gt;repository as shown and click on &lt;i&gt;OK &lt;/i&gt;to install.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgqHqwUUIATAElwFeHPtmTIkoKbYKqt3g6dFsTxVFamwTdM6zoVNxfytUtrv0Oz_wBiAsIMBO6iGGad259ZXYBbfVpQrdL_oeCBiUSuWsbW-NnkVKA3dTjMalH49SFla-bTAMN3LJ153O_MfcEErmfqzQjuOwKBRkTNlnSiKVqC5fThGoSXu8BrFmnDgyI" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="4284" data-original-width="5712" height="480" src="https://blogger.googleusercontent.com/img/a/AVvXsEgqHqwUUIATAElwFeHPtmTIkoKbYKqt3g6dFsTxVFamwTdM6zoVNxfytUtrv0Oz_wBiAsIMBO6iGGad259ZXYBbfVpQrdL_oeCBiUSuWsbW-NnkVKA3dTjMalH49SFla-bTAMN3LJ153O_MfcEErmfqzQjuOwKBRkTNlnSiKVqC5fThGoSXu8BrFmnDgyI=w640-h480" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;Once that completes we can move on to fixing the wifi device.&lt;p&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Wifi setup&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Now the only thing missing is a wifi driver so there are a few things to be done that require that network cable to be connected as we install the development packages for the kernel we are running and then build the &lt;i&gt;broadcom&lt;/i&gt; driver for that kernel.&lt;/p&gt;&lt;p&gt;Back to the terminal command line, install the following packages from the new repository we just added.&lt;/p&gt;&lt;pre class="wp-block-preformatted" style="background-attachment: scroll; background-color: whitesmoke; background-image: none; background-position: 0px 0px; background-repeat: repeat; border: 1px solid rgba(0, 0, 0, 0.1); box-sizing: border-box; color: #3a3a3a; font-size: 16px; font-variant-ligatures: normal; line-height: 1.7; margin-bottom: 1.333em; margin-top: 1.333em; outline: medium; overflow-wrap: normal; overflow: auto hidden; padding: 1.3333em; word-break: break-all;"&gt;sudo zypper install broadcom-wl broadcom-wl-kmp-default kernel-devel&lt;/pre&gt;&lt;p style="text-align: left;"&gt;You will be warned about +30 packages that are going to be installed, but that's what we want. Note that the &lt;i&gt;kmp-default&lt;/i&gt;&amp;nbsp;suffix is openSUSE's convention for kernel module packages built against the default kernel. Tumbleweed handles the kernel module build automatically as part of the package install.&lt;/p&gt;&lt;p style="text-align: left;"&gt;The following shows the installation of packages.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgE2nfwc70N00eeKbbQ0cOT57h7wn6e55MvgVmlh9WrPX8YK6wTsfD4dFxD-pNvUwd5VxCbZmN-URhdn4xf8kNqTnWK_kT54EAqrXvAiao8EwhzU5yywrmCZ1I4FhPBiOxBUXXeuWZ9brxiL53hWrhUDQkkl4iXeT6t3arWCi_r1pmRc-7mE6ve2EzRids" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="4284" data-original-width="5712" height="480" src="https://blogger.googleusercontent.com/img/a/AVvXsEgE2nfwc70N00eeKbbQ0cOT57h7wn6e55MvgVmlh9WrPX8YK6wTsfD4dFxD-pNvUwd5VxCbZmN-URhdn4xf8kNqTnWK_kT54EAqrXvAiao8EwhzU5yywrmCZ1I4FhPBiOxBUXXeuWZ9brxiL53hWrhUDQkkl4iXeT6t3arWCi_r1pmRc-7mE6ve2EzRids=w640-h480" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;Now we want to trigger a rebuild (should be automatic, but better to be safe), so we need to install &lt;i&gt;dams &lt;/i&gt;and&lt;i&gt; lsmod&amp;nbsp;&lt;/i&gt;as follows.&lt;/p&gt;&lt;pre class="wp-block-preformatted" style="background-attachment: scroll; background-color: whitesmoke; background-image: none; background-position: 0px 0px; background-repeat: repeat; border: 1px solid rgba(0, 0, 0, 0.1); box-sizing: border-box; color: #3a3a3a; font-size: 16px; font-variant-ligatures: normal; line-height: 1.7; margin-bottom: 1.333em; margin-top: 1.333em; outline: medium; overflow-wrap: normal; overflow: auto hidden; padding: 1.3333em; word-break: break-all;"&gt;# Install dkms and lsmod
sudo zypper install dkms lsmod&lt;/pre&gt;&lt;p&gt;Now trigger the rebuild and verify.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre class="wp-block-preformatted" style="background-attachment: scroll; background-color: whitesmoke; background-image: none; background-position: 0px 0px; background-repeat: repeat; border: 1px solid rgba(0, 0, 0, 0.1); box-sizing: border-box; color: #3a3a3a; font-size: 16px; font-variant-ligatures: normal; line-height: 1.7; margin-bottom: 1.333em; margin-top: 1.333em; outline: medium; overflow-wrap: normal; overflow: auto hidden; padding: 1.3333em; word-break: break-all;"&gt;# Trigger DKMS rebuild (usually automatic, but to force it)
sudo dkms autoinstall

# Verify
lsmod | grep wl&lt;/pre&gt;&lt;p&gt;If you don't see the models, it might be because you need to reboot the system to load the kernel. Once you've done that you can set up your wireless connection in openSUSE Tumbleweed in the top right drop down menu.&lt;/p&gt;&lt;p&gt;Pretty straight forward once you have the right device drivers, so hope you enjoyed this update to the latest openSUSE Tumbleweed on your old Macbook Pro 13 inch from late 2011!&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/a/AVvXsEhWRAq_vccYOsg6XNaiheiwmg9VFK8B49VrKhP4uDj86XV6rLbzNr_jmU1fOTcQiPv1Y3JhOe_faAjCmIsk6BJ0bHRYrj6juukIvB7wYpWi9r4JwiTWoLyisMZYohbUH15MV6yI2UbmYqHT7piEUzAfzZmOLCwaw1KU8dWBpw_BejsqoypXEX5TpVcs5ck=s72-c" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>OpenSearchCon EU - Fluent Bit &amp; OpenSearch: The Power Couple of Open Source Observability</title><link>http://www.schabell.org/2026/02/opensearchcon-eu-fluentbit-opensearch-power-couple-opensource-observablity.html</link><category>Cloud</category><category>Cloud Native</category><category>conference</category><category>Fluent Bit</category><category>Observability</category><category>OpenSearch</category><category>Workshops</category><pubDate>Wed, 4 Feb 2026 07:00:00 +0100</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-4125024671665220960</guid><description>&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9grRpUwcossI4TQ6K0YdtiuKdJeJBS1wJTWpxi6nbx2WxTuhyphenhyphen1Ww9c8FN7kTg8V3rueJrP9Zo7odfDqetBj1HtzrfEHXsId887FKo1Chvu0mBAiQjsU1mqCPCgnne4J253JXWBEO26LjGi8UpfH7dEul4T_O4ow82_vN_yWRKGprSyC1nd4HHyk2P9Tk/s1156/Screenshot%202026-02-12%20at%2009.20.09.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="236" data-original-width="1156" height="65" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9grRpUwcossI4TQ6K0YdtiuKdJeJBS1wJTWpxi6nbx2WxTuhyphenhyphen1Ww9c8FN7kTg8V3rueJrP9Zo7odfDqetBj1HtzrfEHXsId887FKo1Chvu0mBAiQjsU1mqCPCgnne4J253JXWBEO26LjGi8UpfH7dEul4T_O4ow82_vN_yWRKGprSyC1nd4HHyk2P9Tk/s320/Screenshot%202026-02-12%20at%2009.20.09.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;After my &lt;a href="https://opensearch.org/blog/the-magic-of-open-source-real-time-problem-solving-at-the-opensearch-booth/" rel="nofollow" target="_blank"&gt;adventures with the OpenSearch maintainers and developers&lt;/a&gt; in their booth at KubeCon NA this year, I was excited to share the results of our adventures at their OpenSearchCon EU event.&lt;p&gt;&lt;/p&gt;&lt;p&gt;So with full enthusiasm I submitted a session about the observability power couple that is &lt;a href="https://fluentbit.io" rel="nofollow" target="_blank"&gt;Fluent Bit&lt;/a&gt; and &lt;a href="https://opensearch.org" rel="nofollow" target="_blank"&gt;OpenSearch&lt;/a&gt; when used together. This would provide the attendees with a good overview of what the CNCF graduated project Fluent Bit, an end-to-end observability pipeline, can do for them.&amp;nbsp;&lt;/p&gt;&lt;p&gt;To complement and visualize your pipeline telemetry data, OpenSearch was added to the mix and we worked hard to provide a streamlined demo project providing the hands-on experience of setting up the entire integration.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Let's look at the session and supporting hands-on learning content we are providing.&lt;/p&gt;&lt;span&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;First off, the session was accepted as you can see in the image below:&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3S30dcAxK9F7q4-oN0tETvKqC3VdjR6bOL6hGfCfNwrW_0KIPoZSKYYkNb-ZMYac4Mr9Gio3Mxhlvf59AnezqBYoy803wQwV8RcnPblugty2TbTNK19MWF9FjJQ5hX182fnN_YUKMMpEqe1niFg5dMcHcihzfEhX6NRCW_W_u5c5I89gPuC9R5OK4Djc/s1904/Screenshot%202026-02-12%20at%2009.07.22.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="826" data-original-width="1904" height="278" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3S30dcAxK9F7q4-oN0tETvKqC3VdjR6bOL6hGfCfNwrW_0KIPoZSKYYkNb-ZMYac4Mr9Gio3Mxhlvf59AnezqBYoy803wQwV8RcnPblugty2TbTNK19MWF9FjJQ5hX182fnN_YUKMMpEqe1niFg5dMcHcihzfEhX6NRCW_W_u5c5I89gPuC9R5OK4Djc/w640-h278/Screenshot%202026-02-12%20at%2009.07.22.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p style="text-align: left;"&gt;The session as it was submitted is described below and will be given on Friday, 17 April 2026 in Prague:&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;&lt;a href="https://opensearchconeu2026.sched.com/event/2Giy8/fluent-bit-opensearch-the-power-couple-of-open-source-observability-patrick-stephens-fluent-bit-maintainer?iframe=no&amp;amp;w=100%25&amp;amp;sidebar=yes&amp;amp;bg=no" rel="nofollow" target="_blank"&gt;Fluent Bit &amp;amp; OpenSearch: The Power Couple of Open Source Observability&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;i&gt;In the world of cloud-native observability, the "Golden Signal" is only as valuable as the pipeline that carries it. To build a truly vendor-neutral, scalable observability stack, look to Fluent Bit for high-performance telemetry routing and OpenSearch for robust search and analytics. This session dives into why these two projects form the "Power Couple" of the open-source ecosystem. One excels at being a lightweight, sub-millisecond processor at the edge, the other providing the distributed backend required to make sense of that data.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;What we will cover:&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;i&gt;The "Why" Behind the Pairing: An exploration of how Fluent Bit’s low-resource footprint perfectly complements OpenSearch’s high-performance indexing.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Streamlined Integration: Practical demonstrations of configuring the Fluent Bit OpenSearch output plugin.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Zero to Dashboard: A walkthrough of the developer workflow—from containerized deployment using Podman to visualizing live telemetry in OpenSearch Dashboards.&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Attendees will walk away with an understanding of the advantages to this couple and access to a free online hands-on workshop: &lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit" rel="nofollow" target="_blank"&gt;https://o11y-workshops.gitlab.io/workshop-fluentbit&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;When: 17 April 2026, 16:30-17:10 in room Bohemia 1 by Patrick Stephens&lt;/i&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;As you can see this session is supported by a free online hands-on workshop, specifically the following lab for this specific session where we can repeat what we see in this session as an attendee:&amp;nbsp;&lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit/#/11" rel="nofollow" target="_blank"&gt;https://o11y-workshops.gitlab.io/workshop-fluentbit/#/11&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit/#/11" imageanchor="1" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" data-original-height="904" data-original-width="2336" height="248" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiuthv3vNx6wHIxafxQc1g5HxuTli0mN25JCE-gQzlg3woyLEmfOOgFkSOUm7seB4v6NpqGnR7cGTBvPrWoUybnS0OLzyuFPQJUeiSRSa11nCqxcT2mInwPgeII8QIxUfl6PeRqesJFdBAlnaSlC0sZEIx6KvufAIZu57cje7g41XNnQgAAxJB73R2qlI/w640-h248/Screenshot%202026-02-12%20at%2009.48.00.png" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;Also of note, I am personally unable to attend this event and I really do not like to back out of anything I have previously committed to. The only solution was to find another Fluent Bit maintainer and friend of mine to take over and crush the delivery of this session. This could only be &lt;a href="https://www.linkedin.com/in/patrickjkstephens/" rel="nofollow" target="_blank"&gt;Patrick Stephens&lt;/a&gt;, a fellow Fluent Bit Maintainer who's an excellent speaker in his own right.&amp;nbsp;&lt;/p&gt;&lt;p style="text-align: left;"&gt;You can find the rest of the schedule online, but don't miss Patrick and this hands-on integration session with Fluent Bit telemetry pipelines and OpenSearch visualization backend. A special thanks to Pat for helping out!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9grRpUwcossI4TQ6K0YdtiuKdJeJBS1wJTWpxi6nbx2WxTuhyphenhyphen1Ww9c8FN7kTg8V3rueJrP9Zo7odfDqetBj1HtzrfEHXsId887FKo1Chvu0mBAiQjsU1mqCPCgnne4J253JXWBEO26LjGi8UpfH7dEul4T_O4ow82_vN_yWRKGprSyC1nd4HHyk2P9Tk/s72-c/Screenshot%202026-02-12%20at%2009.20.09.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>KubeCon EU 2026 - From Hallucinations to Hardware: Diagnosing LLM Failures</title><link>http://www.schabell.org/2026/01/kubecon-eu-2026-from-hallucinations-to-hardware-diagnosing-llm-failures.html</link><category>Cloud</category><category>Cloud Native</category><category>conference</category><category>Containers</category><category>Observability</category><category>OpenTelemetry</category><category>Prometheus</category><pubDate>Sat, 31 Jan 2026 07:00:00 +0100</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-3440106473195310331</guid><description>&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjMfW2dO543nX7Z22swBdbhT6P-Nrf80-060aReJ20oGRj7cYKZHLYw_M7ROXg9xG9iMbQhyF3l9tK2nc26IANwcVul8BAtEHTLtN2Fu0mFlG_E_-bLrt0xyGkYOASoUONtHIQL-vM65oWGEWaBeavAq5K4-4O3lbwiInh4ZaOjo1AcZSY3z_hHC2ClY4U" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="816" data-original-width="1830" height="143" src="https://blogger.googleusercontent.com/img/a/AVvXsEjMfW2dO543nX7Z22swBdbhT6P-Nrf80-060aReJ20oGRj7cYKZHLYw_M7ROXg9xG9iMbQhyF3l9tK2nc26IANwcVul8BAtEHTLtN2Fu0mFlG_E_-bLrt0xyGkYOASoUONtHIQL-vM65oWGEWaBeavAq5K4-4O3lbwiInh4ZaOjo1AcZSY3z_hHC2ClY4U" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;I'm excited to share that a talk I submitted, with my good friend&amp;nbsp;&lt;a href="https://colocatedeventseu2026.sched.com/speaker/ryan.peirce" rel="nofollow" target="_blank"&gt;Ryan Peirce&lt;/a&gt;, was accepted&amp;nbsp;to Cloud Native AI &amp;amp; Kubeflow Day!&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;In case you were still unaware, KubeCon + CloudNativeCon is the flagship conference of the Cloud Native Computing Foundation (CNCF), gathering adopters and technologists from leading open source and cloud native communities. The event brings together the entire cloud native ecosystem for education, collaboration, and networking opportunities.&lt;/p&gt;&lt;p&gt;Every year this event features multiple co-located events, and we're excited to be presenting at &lt;a href="https://colocatedeventseu2026.sched.com/overview/type/Cloud+Native+AI+%2B+Kubeflow+Day" rel="nofollow" target="_blank"&gt;Cloud Native AI &amp;amp; Kubeflow Day&lt;/a&gt;, which focuses on the intersection of cloud native technologies and artificial intelligence workloads.&lt;/p&gt;&lt;p&gt;Below are all the details of our session at the time of this writing.&lt;/p&gt;&lt;span&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;On Monday, 23 March in Amsterdam, &lt;a href="https://www.linkedin.com/in/ryanpeirce/" rel="nofollow" target="_blank"&gt;Ryan&lt;/a&gt;&amp;nbsp;will be taking the stage to demonstrate real-world troubleshooting of LLM-powered applications for the following session.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;&lt;i&gt;&lt;a href="https://colocatedeventseu2026.sched.com/event/2DY71/from-hallucinations-to-hardware-diagnosing-llm-failures-eric-d-schabell-ryan-peirce-chronosphere" rel="nofollow" target="_blank"&gt;From Hallucinations to Hardware: Diagnosing LLM Failures&lt;/a&gt;&lt;/i&gt;&lt;/h3&gt;&lt;p&gt;&lt;i&gt;Generative AI apps can hallucinate—or fail—at the worst possible times. In this live demo session, we'll interact with an LLM-powered application designed to surface both entertaining hallucinations and real-world GPU performance issues. Using open source tools like Prometheus, OTel, NVIDIA DCGM, and OpenInference, we'll troubleshoot problems in real time and trace them from user experience down to infrastructure. See how observability gives engineers and SREs the visibility they need to keep AI systems reliable.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Time: 15:20-15:45&lt;/i&gt;&lt;/p&gt;&lt;p&gt;This is a hands-on, live demonstration session where he will be working with a real LLM-powered application. He has intentionally designed it to showcase both the amusing side of AI hallucinations and the serious infrastructure challenges that can impact production systems. The session will walk through the complete troubleshooting journey, from identifying user-facing issues all the way down to GPU performance bottlenecks.&lt;/p&gt;&lt;p&gt;Ryan will be leveraging a powerful stack of open source observability tools including Prometheus for metrics collection, OpenTelemetry for distributed tracing, NVIDIA DCGM for GPU telemetry, and OpenInference for LLM-specific observability. This combination provides the comprehensive visibility needed to diagnose and resolve issues in modern AI infrastructure.&lt;/p&gt;&lt;p&gt;For engineers and SREs working with AI systems, this session will demonstrate practical approaches to maintaining reliability in production environments. The live demo format means you'll see real troubleshooting workflows in action rather than theoretical examples.&lt;/p&gt;&lt;p&gt;Be sure to check the&amp;nbsp;&lt;a href="https://colocatedeventseu2026.sched.com/overview/type/Cloud+Native+AI+%2B+Kubeflow+Day" rel="nofollow" target="_blank"&gt;Cloud Native AI &amp;amp; Kubeflow Day&lt;/a&gt;&amp;nbsp;schedule for the exact time and location of the session as the time can be adjusted leading up to the co-located event.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Don't miss this session as Ryan is an amazing rock star on stage and his live demo is jaw dropping!&lt;/p&gt;&lt;p&gt;&lt;i&gt;(Note that in the session URL you will see my name listed [&lt;/i&gt;from-hallucinations-to-hardware-diagnosing-llm-failures-eric-d-schabell-ryan-peirce&lt;i&gt;], but I will not be on stage. Ryan was kind enough to cover for me as I won't be available to present on that day. Thanks Ryan!)&lt;/i&gt;&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/a/AVvXsEjMfW2dO543nX7Z22swBdbhT6P-Nrf80-060aReJ20oGRj7cYKZHLYw_M7ROXg9xG9iMbQhyF3l9tK2nc26IANwcVul8BAtEHTLtN2Fu0mFlG_E_-bLrt0xyGkYOASoUONtHIQL-vM65oWGEWaBeavAq5K4-4O3lbwiInh4ZaOjo1AcZSY3z_hHC2ClY4U=s72-c" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>Mastering Fluent Bit: Developers Guide to Forwarding Metrics with Prometheus Remote Write</title><link>http://www.schabell.org/2026/01/mastering-fluentbit-dev-guide-forwarding-metrics-with-prometheus-remote-write.html</link><category>Cloud</category><category>Cloud Data</category><category>Cloud Native</category><category>Containers</category><category>Fluent Bit</category><category>Mastering Fluent Bit</category><category>Observability</category><category>Prometheus</category><pubDate>Tue, 27 Jan 2026 07:00:00 +0100</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-2169879002694809084</guid><description>&lt;div class="separator" style="clear: both;"&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s960/Mastering%20Fluent%20Bit%20Blog%20Series.png" style="clear: left; display: inline !important; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s320/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="320" /&gt;&lt;/a&gt;&amp;nbsp;&lt;span style="font-family: inherit;"&gt;This series is a general purpose getting started guide for those of us wanting to learn about the Cloud Native Computing Foundation (CNCF) project Fluent Bit.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Each article in this series addresses a single topic by providing insights into what the topic is, why we are interested in exploring that topic, where to get started with the topic, and how to get hands-on with learning about the topic as it relates to the Fluent Bit project.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;The idea is that each article can stand on its own, but that they also lead down a path that slowly increases our abilities to implement solutions with Fluent Bit telemetry pipelines.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Let's take a look at the topic of this article, integrating Fluent Bit with Prometheus. In case you missed the previous article, check out the&amp;nbsp;&lt;a href="https://www.schabell.org/2026/01/mastering-fluent-bit-developers-guide.html" rel="nofollow" target="_blank"&gt;developer guide to monitoring health metrics with Prometheus&lt;/a&gt;&amp;nbsp;where you explore how to monitor the health of your telemetry data pipelines.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;This article will complete our hands-on exploration of Prometheus integration, helping developers leverage Fluent Bit's powerful metrics capabilities. We'll look at the final pattern for integrating Fluent Bit with Prometheus in your observability infrastructure.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;All examples in this article have been done on OSX and are assuming the reader is able to convert the actions shown here to their own local machines.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;Integrating with Prometheus?&lt;/h3&gt;&lt;p&gt;Before diving into the hands-on examples, let's understand why Prometheus integration matters for Fluent Bit users. Prometheus is the de facto standard for metrics collection and monitoring in cloud native environments. It's another CNCF graduated project that provides a time-series database optimized for operational monitoring. The combination of Fluent Bit's lightweight, high-throughput telemetry pipeline with Prometheus's battle-tested metrics storage creates a powerful observability solution.&lt;/p&gt;&lt;p&gt;Fluent Bit provides several ways to integrate with Prometheus, the first of which we &lt;a href="https://www.schabell.org/2026/01/mastering-fluentbit-developers-guide-to-routing-metrics-to-prometheus.html" rel="nofollow" target="_blank"&gt;covered in the first article&lt;/a&gt;. &amp;nbsp;In &lt;a href="https://www.schabell.org/2026/01/mastering-fluent-bit-developers-guide.html" rel="nofollow" target="_blank"&gt;the second article&lt;/a&gt; we explored Fluent Bit monitoring itself and exposing internal pipeline metrics, giving you visibility into the health and performance of your telemetry infrastructure. Understanding how your telemetry pipeline is performing is critical for maintaining reliable observability.&lt;/p&gt;&lt;p&gt;In this third and final article, we integrate with Prometheus using Fluent Bit as a metrics proxy, scraping metrics from various sources and forwarding them to Prometheus. This is particularly useful when we need to aggregate metrics from multiple sources or transform them before they reach Prometheus.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Let's dive into this final pattern, forwarding telemetry pipeline metrics to Prometheus with remote write.&lt;/p&gt;&lt;h3&gt;Where to get started&lt;/h3&gt;&lt;p&gt;You should have explored the previous articles in this series to install and get started with Fluent Bit on your developer local machine, either using&amp;nbsp;&lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-from-source.html" rel="nofollow" target="_blank"&gt;the source code&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-and-configuring-using-contianer-images.html" rel="nofollow" target="_blank"&gt;container images&lt;/a&gt;. Links at the end of this article will point you to a free hands-on workshop that lets you explore more of Fluent Bit in detail.&lt;/p&gt;&lt;p&gt;You can verify that you have a functioning installation by testing your Fluent Bit, either using a source installation or a container installation as shown below:&lt;/p&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; caret-color: rgb(68, 68, 68); color: #444444; font-family: inherit; font-size: 14px; font-variant-ligatures: normal; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run -ti ghcr.io/fluent/fluent-bit:4.2.2 -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;...&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;[0] dummy.0: [[1753105021.031338000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105022.033205000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105023.032600000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105024.033517000, {}], {"message"=&amp;gt;"dummy"}]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;&lt;span style="caret-color: rgb(0, 0, 0); color: black; font-family: inherit;"&gt;Let's explore&amp;nbsp;the Prometheus integration pattern for forwarding Fluent Bit metrics that will help you with your observability infrastructure.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;How to integrate with Prometheus&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;See&amp;nbsp;&lt;a href="https://www.schabell.org/2025/07/mastering-fluent-bit-developer-guide-to-service-section-config.html" rel="nofollow" target="_blank"&gt;this article for details&lt;/a&gt;&amp;nbsp;about the service section of the configurations used in the rest of this article, but for now we plan to focus on our Fluent Bit pipeline and specifically the Prometheus integration capabilities that can be of great help in managing metrics in your observability stack.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;Below in the figure you see the phases of a telemetry pipeline. Metrics collected by input plugins flow through the pipeline and can be routed to Prometheus-compatible outputs.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAkRj9pAJSFxsBPRxG0Ad_V5v60b6-bxfl-NeEcIj33FgRbUnfrJo8cAzKkbA0uMl2qNn9mBEsREJskZieB7E5CWeh2JZhq4iyB3ft06MwyXBrshIQOC1ybGBT9NqRunYBHCcJgbagmUmcAyESV8N6Ju3rKJ00_HonsqxAkOPh-AdJLAfvegDkGlxguoc/s2204/fb-pipeline.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="658" data-original-width="2204" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAkRj9pAJSFxsBPRxG0Ad_V5v60b6-bxfl-NeEcIj33FgRbUnfrJo8cAzKkbA0uMl2qNn9mBEsREJskZieB7E5CWeh2JZhq4iyB3ft06MwyXBrshIQOC1ybGBT9NqRunYBHCcJgbagmUmcAyESV8N6Ju3rKJ00_HonsqxAkOPh-AdJLAfvegDkGlxguoc/w640-h192/fb-pipeline.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;Understanding how metrics flow through Fluent Bit's pipeline is essential for effective Prometheus integration. Input plugins collect metrics, which then pass through filters for transformation, before being routed to output plugins that deliver metrics to Prometheus.&lt;/p&gt;&lt;h3&gt;Forwarding metrics using Prometheus remote write&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;The final integration pattern demonstrates using Fluent Bit as a metrics proxy that scrapes existing Prometheus endpoints and forwards metrics using the Prometheus remote write protocol. This pattern is useful when you need to aggregate metrics from multiple sources, transform metrics before they reach Prometheus, or push metrics to remote Prometheus backends.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;The &lt;b&gt;&lt;i&gt;&lt;a href="https://docs.fluentbit.io/manual/data-pipeline/inputs/prometheus-scrape-metrics" rel="nofollow" target="_blank"&gt;prometheus_scrape&lt;/a&gt;&lt;/i&gt;&lt;/b&gt; input plugin allows Fluent Bit to collect metrics from any Prometheus-compatible endpoint. The &lt;b&gt;&lt;i&gt;&lt;a href="https://docs.fluentbit.io/manual/data-pipeline/outputs/prometheus-remote-write" rel="nofollow" target="_blank"&gt;prometheus_remote_write&lt;/a&gt;&lt;/i&gt;&lt;/b&gt; output plugin then pushes these metrics to a Prometheus server or compatible backend using the remote write API.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;Let's create a configuration that scrapes metrics from a local application (we'll simulate this with HashiCorp Vault's metrics endpoint format) and forwards them using remote write:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on

pipeline:
  inputs:
    # Scrape metrics from an application's Prometheus endpoint
    - name: prometheus_scrape
      host: 127.0.0.1
      port: 8200
      tag: app_metrics
      metrics_path: /v1/sys/metrics
      scrape_interval: 10s

    # Also collect host metrics
    - name: node_exporter_metrics
      tag: host_metrics
      scrape_interval: 5

  outputs:
    # Forward all metrics to Prometheus using remote write
    - name: prometheus_remote_write
      match: '*'
      host: prometheus-server.example.com
      port: 9090
      uri: /api/v1/write
      add_label:
        - datacenter us-west-2
        - cluster production&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;This configuration demonstrates a powerful pattern where Fluent Bit acts as a metrics aggregator. It scrapes application metrics from a Prometheus endpoint, collects host metrics using the node exporter plugin, and forwards everything to a central Prometheus server using the remote write protocol. The custom labels datacenter and cluster are added to all metrics, providing organizational context for querying.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;For environments where you need secure remote write with authentication, the configuration would look like this:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on

pipeline:
  inputs:
    - name: node_exporter_metrics
      tag: host_metrics
      scrape_interval: 5

    - name: fluentbit_metrics
      tag: pipeline_metrics
      scrape_interval: 2

  outputs:
    - name: prometheus_remote_write
      match: '*'
      host: prometheus.example.com
      port: 443
      uri: /api/v1/write
      tls: on
      tls.verify: on
      http_user: ${PROMETHEUS_USERNAME}
      http_passwd: ${PROMETHEUS_PASSWORD}
      add_label:
        - service my-application
        - environment production&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;This configuration securely pushes metrics to a remote Prometheus server using TLS and HTTP basic authentication. The credentials are read from environment variables, following security best practices. Both host metrics and Fluent Bit pipeline metrics are collected and forwarded together.&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;Let's examine a more advanced scenario where we scrape metrics from multiple sources and use tagging to route them appropriately:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on

pipeline:
  inputs:
    # Scrape Redis metrics
    - name: prometheus_scrape
      host: redis-server
      port: 9121
      tag: redis_metrics
      metrics_path: /metrics
      scrape_interval: 15s

    # Scrape PostgreSQL metrics
    - name: prometheus_scrape
      host: postgres-server
      port: 9187
      tag: postgres_metrics
      metrics_path: /metrics
      scrape_interval: 15s

    # Collect host metrics
    - name: node_exporter_metrics
      tag: node_metrics
      scrape_interval: 10

  outputs:
    # Send infrastructure metrics to operations Prometheus
    - name: prometheus_remote_write
      match: node_metrics
      host: ops-prometheus.internal
      port: 9090
      uri: /api/v1/write
      add_label:
        - team operations
        - tier infrastructure

    # Send application metrics to development Prometheus
    - name: prometheus_remote_write
      match: '*_metrics'
      host: dev-prometheus.internal
      port: 9090
      uri: /api/v1/write
      add_label:
        - team development
        - tier application&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;This configuration demonstrates Fluent Bit's routing capabilities applied to metrics &lt;i&gt;before&lt;/i&gt;&amp;nbsp;they are sent to the Prometheus backend. Infrastructure metrics (from &lt;i&gt;node_exporter_metrics&lt;/i&gt;) are routed to an operations Prometheus instance, while application metrics (Redis and PostgreSQL) are routed to a development team's Prometheus instance. Each destination receives appropriately labeled metrics for easy filtering and organization.&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;The Prometheus remote write protocol also supports compression for efficient network usage. You can enable compression by adding the compress parameter:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;outputs:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;    - name: prometheus_remote_write
      match: '*'
      host: prometheus-server.example.com
      port: 9090
      uri: /api/v1/write
      &lt;b&gt;compress: gzip&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;This is particularly useful when pushing metrics over high-latency or bandwidth-constrained networks.&lt;/p&gt;&lt;div&gt;It's left to the reader to explore their metrics telemetry data with their own Prometheus instance and to browse through the collected metrics telemetry data. A primer to do this if you need help can be found in this hands-on free online&amp;nbsp;&lt;a href="https://o11y-workshops.gitlab.io/workshop-prometheus/" rel="nofollow" target="_blank"&gt;Prometheus workshop&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;More in the series&lt;/h3&gt;&lt;p&gt;In this article you explored the final of three powerful patterns for integrating Fluent Bit with Prometheus: forwarding metrics with Fluent Bit to Prometheus. This article is based on this&amp;nbsp;&lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit" rel="nofollow" target="_blank"&gt;online free workshop&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;There will be more in this series as you continue to learn how to configure, run, manage, and master the use of Fluent Bit in the wild.&amp;nbsp;&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s72-c/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>Mastering Fluent Bit: Developers Guide to Monitoring Health Metrics with Prometheus </title><link>http://www.schabell.org/2026/01/mastering-fluent-bit-developers-guide.html</link><category>Cloud</category><category>Cloud Data</category><category>Cloud Native</category><category>Containers</category><category>Fluent Bit</category><category>Mastering Fluent Bit</category><category>Observability</category><category>Prometheus</category><pubDate>Tue, 20 Jan 2026 07:00:00 +0100</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-3109473606307454566</guid><description>&lt;div class="separator" style="clear: both;"&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s960/Mastering%20Fluent%20Bit%20Blog%20Series.png" style="clear: left; display: inline; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s320/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="320" /&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;This series is a general purpose getting started guide for those of us wanting to learn about the Cloud Native Computing Foundation (CNCF) project Fluent Bit.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Each article in this series addresses a single topic by providing insights into what the topic is, why we are interested in exploring that topic, where to get started with the topic, and how to get hands-on with learning about the topic as it relates to the Fluent Bit project.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;The idea is that each article can stand on its own, but that they also lead down a path that slowly increases our abilities to implement solutions with Fluent Bit telemetry pipelines.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Let's take a look at the topic of this article, integrating Fluent Bit with Prometheus. In case you missed the previous article, check out the&amp;nbsp;&lt;a href="https://www.schabell.org/2026/01/mastering-fluentbit-developers-guide-to-routing-metrics-to-prometheus.html" rel="nofollow" target="_blank"&gt;developer guide to routing&amp;nbsp;metrics to Prometheus&lt;/a&gt; where you explore how to collect and direct metrics telemetry data to your Prometheus instance.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;This article will continue our hands-on exploration of Prometheus integration, helping developers leverage Fluent Bit's powerful metrics capabilities. We'll look at the second of three essential patterns for integrating Fluent Bit with Prometheus in your observability infrastructure.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;All examples in this article have been done on OSX and are assuming the reader is able to convert the actions shown here to their own local machines.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;Integrating with Prometheus?&lt;/h3&gt;&lt;p&gt;Before diving into the hands-on examples, let's understand why Prometheus integration matters for Fluent Bit users. Prometheus is the de facto standard for metrics collection and monitoring in cloud native environments. It's another CNCF graduated project that provides a time-series database optimized for operational monitoring. The combination of Fluent Bit's lightweight, high-throughput telemetry pipeline with Prometheus's battle-tested metrics storage creates a powerful observability solution.&lt;/p&gt;&lt;p&gt;Fluent Bit provides several ways to integrate with Prometheus, the first of which we covered in the previous article. &amp;nbsp;In this article we'll explore Fluent Bit monitoring itself and exposing internal pipeline metrics, giving you visibility into the health and performance of your telemetry infrastructure. Understanding how your telemetry pipeline is performing is critical for maintaining reliable observability.&lt;/p&gt;&lt;p&gt;The third and final way to integrate with Prometheus is to use Fluent Bit can act as a metrics proxy, scraping metrics from various sources and forwarding them to Prometheus. This is particularly useful when you need to aggregate metrics from multiple sources or transform them before they reach Prometheus. This will be explored in a future article.&lt;/p&gt;&lt;p&gt;Let's dive into the second pattern, exposing internal telemetry pipeline metrics to Prometheus.&lt;/p&gt;&lt;h3&gt;Where to get started&lt;/h3&gt;&lt;p&gt;You should have explored the previous articles in this series to install and get started with Fluent Bit on your developer local machine, either using&amp;nbsp;&lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-from-source.html" rel="nofollow" target="_blank"&gt;the source code&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-and-configuring-using-contianer-images.html" rel="nofollow" target="_blank"&gt;container images&lt;/a&gt;. Links at the end of this article will point you to a free hands-on workshop that lets you explore more of Fluent Bit in detail.&lt;/p&gt;&lt;p&gt;You can verify that you have a functioning installation by testing your Fluent Bit, either using a source installation or a container installation as shown below:&lt;/p&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; caret-color: rgb(68, 68, 68); color: #444444; font-family: inherit; font-size: 14px; font-variant-ligatures: normal; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run -ti ghcr.io/fluent/fluent-bit:4.2.2 -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;...&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;[0] dummy.0: [[1753105021.031338000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105022.033205000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105023.032600000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105024.033517000, {}], {"message"=&amp;gt;"dummy"}]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;&lt;span style="caret-color: rgb(0, 0, 0); color: black; font-family: inherit;"&gt;Let's explore&amp;nbsp;the Prometheus integration pattern for monitoring Fluent Bit metrics that will help you with your observability infrastructure.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;How to integrate with Prometheus&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;See&amp;nbsp;&lt;a href="https://www.schabell.org/2025/07/mastering-fluent-bit-developer-guide-to-service-section-config.html" rel="nofollow" target="_blank"&gt;this article for details&lt;/a&gt;&amp;nbsp;about the service section of the configurations used in the rest of this article, but for now we plan to focus on our Fluent Bit pipeline and specifically the Prometheus integration capabilities that can be of great help in managing metrics in your observability stack.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;Below in the figure you see the phases of a telemetry pipeline. Metrics collected by input plugins flow through the pipeline and can be routed to Prometheus-compatible outputs.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAkRj9pAJSFxsBPRxG0Ad_V5v60b6-bxfl-NeEcIj33FgRbUnfrJo8cAzKkbA0uMl2qNn9mBEsREJskZieB7E5CWeh2JZhq4iyB3ft06MwyXBrshIQOC1ybGBT9NqRunYBHCcJgbagmUmcAyESV8N6Ju3rKJ00_HonsqxAkOPh-AdJLAfvegDkGlxguoc/s2204/fb-pipeline.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="658" data-original-width="2204" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAkRj9pAJSFxsBPRxG0Ad_V5v60b6-bxfl-NeEcIj33FgRbUnfrJo8cAzKkbA0uMl2qNn9mBEsREJskZieB7E5CWeh2JZhq4iyB3ft06MwyXBrshIQOC1ybGBT9NqRunYBHCcJgbagmUmcAyESV8N6Ju3rKJ00_HonsqxAkOPh-AdJLAfvegDkGlxguoc/w640-h192/fb-pipeline.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;Understanding how metrics flow through Fluent Bit's pipeline is essential for effective Prometheus integration. Input plugins collect metrics, which then pass through filters for transformation, before being routed to output plugins that deliver metrics to Prometheus.&lt;/p&gt;&lt;h3&gt;Monitoring telemetry pipeline health&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;The second integration pattern focuses on monitoring the health and performance of your Fluent Bit instance. Understanding how your telemetry pipeline is performing is critical for maintaining reliable observability infrastructure. Fluent Bit provides the fluentbit_metrics input plugin that exposes internal pipeline metrics.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;The Fluent Bit Metrics plugin collects valuable information about your pipeline including uptime, input plugin throughput, output plugin performance, buffer usage, and error counts. These metrics help you answer questions like: Is my pipeline processing data fast enough? Are there any backpressure issues? How much memory is my pipeline consuming?&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;To demonstrate this pattern, let's create a configuration file called&amp;nbsp;&lt;b&gt;&lt;i&gt;fluent-bit.yaml&lt;/i&gt;&lt;/b&gt;&amp;nbsp;that exposes internal Fluent Bit metrics:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on

pipeline:
  inputs:
    # Simulate application logs for the pipeline to process
    - name: dummy
      tag: app.logs
      dummy: '{"message":"Application log entry","level":"info"}'

    # Collect Fluent Bit internal metrics
    - name: fluentbit_metrics
      tag: internal_metrics
      scrape_interval: 2

  outputs:
    # Send application logs to stdout
    - name: stdout
      match: app.logs
      format: json_lines

    # Expose internal metrics for Prometheus
    - name: prometheus_exporter
      match: internal_metrics
      host: 0.0.0.0
      port: 2022
      add_label:
        - instance fluent-bit-dev
        - component telemetry-pipeline&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;This configuration demonstrates a realistic scenario where Fluent Bit is processing application logs while simultaneously exposing its own internal metrics. The &lt;b&gt;&lt;i&gt;&lt;a href="https://docs.fluentbit.io/manual/data-pipeline/inputs/fluentbit-metrics" rel="nofollow" target="_blank"&gt;fluentbit_metrics&lt;/a&gt;&lt;/i&gt;&lt;/b&gt; input plugin collects metrics about the pipeline itself, and these are exposed on a separate port (2022) from any host metrics we might be collecting.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's run this configuration as follows:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.2.2&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Note: For container deployments collecting linux host metrics, you need
# to mount the host's /proc and /sys filesystems:
# $ podman run --rm -v /proc:/host/proc:ro -v /sys:/host/sys:ro -p 2021:2021 fb&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;{"date":1768901032.490993,"message":"Application log entry","level":"info"}
{"date":1768901033.490052,"message":"Application log entry","level":"info"}
{"date":1768901034.488256,"message":"Application log entry","level":"info"}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;Our console output shows the generated log message and in the background, being staged on the endpoint for a Prometheus instance to scrap are our Fluent Bit instance metrics.&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;Now verify the metrics are being tagged with custom labels by opening a browser window to&amp;nbsp;&lt;i style="font-weight: bold;"&gt;http://localhost:2022/metrics&lt;/i&gt;&amp;nbsp;and we should see the following:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# HELP fluentbit_uptime Number of seconds that Fluent Bit has been running.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# TYPE fluentbit_uptime counter
fluentbit_uptime{instance="fluent-bit-dev",component="telemetry-pipeline",hostname="Erics-MacBook-Pro.local"} 126
# HELP fluentbit_logger_logs_total Total number of logs
# TYPE fluentbit_logger_logs_total counter
fluentbit_logger_logs_total{instance="fluent-bit-dev",component="telemetry-pipeline",message_type="error"} 0
fluentbit_logger_logs_total{instance="fluent-bit-dev",component="telemetry-pipeline",message_type="warn"} 0
fluentbit_logger_logs_total{instance="fluent-bit-dev",component="telemetry-pipeline",message_type="info"} 14
fluentbit_logger_logs_total{instance="fluent-bit-dev",component="telemetry-pipeline",message_type="debug"} 0
fluentbit_logger_logs_total{instance="fluent-bit-dev",component="telemetry-pipeline",message_type="trace"} 0
# HELP fluentbit_routing_logs_records_total Total log records routed from input to output
# TYPE fluentbit_routing_logs_records_total counter
fluentbit_routing_logs_records_total{instance="fluent-bit-dev",component="telemetry-pipeline",input="dummy.0",output="stdout.0"} 125
# HELP fluentbit_routing_logs_bytes_total Total bytes routed from input to output (logs)
# TYPE fluentbit_routing_logs_bytes_total counter&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;These metrics provide valuable insights into your pipeline's health. The &lt;i&gt;fluentbit_uptime&lt;/i&gt; counter tells you how long your instance has been running. The &lt;i&gt;fluentbit_input_records_total&lt;/i&gt; and &lt;i&gt;fluentbit_input_bytes_total&lt;/i&gt; counters show throughput for each input plugin. The &lt;i&gt;fluentbit_output_records_total&lt;/i&gt;, &lt;i&gt;fluentbit_output_retries_total&lt;/i&gt;, and &lt;i&gt;fluentbit_output_errors_total&lt;/i&gt; counters help you monitor output plugin performance and detect delivery issues.&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;To integrate this with Prometheus, add a scrape configuration to your Prometheus configuration file&amp;nbsp;&lt;i style="font-weight: bold;"&gt;prometheus.yml&amp;nbsp;&lt;/i&gt;as follows:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;scrape_configs:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;  - job_name: 'fluent-bit-health-metrics'
    static_configs:
      - targets: ['localhost:2022']
    scrape_interval: 10s&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;This configuration tells Prometheus to scrape the Fluent Bit metrics endpoint every 10 seconds. The metrics will then be available for querying in Prometheus and can be visualized in the Prometheus console or using&amp;nbsp;&lt;a href="https://perses.dev" rel="nofollow" target="_blank"&gt;the Perses project&lt;/a&gt;&amp;nbsp;for dashboards.&amp;nbsp;&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;With these metrics in Prometheus, you can create alerts for scenarios like high retry rates (indicating backpressure or destination issues), zero input records (indicating data collection problems), or high memory usage.&amp;nbsp;&lt;/p&gt;&lt;div&gt;It's left to the reader to explore their metrics telemetry data with their own Prometheus instance and to browse through the collected metrics telemetry data. A primer to do this if you need help can be found in this hands-on free online&amp;nbsp;&lt;a href="https://o11y-workshops.gitlab.io/workshop-prometheus/" rel="nofollow" target="_blank"&gt;Prometheus workshop&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;More in the series&lt;/h3&gt;&lt;p&gt;In this article you explored the second of three powerful patterns for integrating Fluent Bit with Prometheus: monitoring Fluent Bit health metrics. In the following article we will continue onwards to look at scraping and forwarding Prometheus metrics with remote write. This article is based on this&amp;nbsp;&lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit" rel="nofollow" target="_blank"&gt;online free workshop&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;There will be more in this series as you continue to learn how to configure, run, manage, and master the use of Fluent Bit in the wild. Next up, forwarding Prometheus metrics.&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s72-c/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>Mastering Fluent Bit: Developers Guide to Routing Metrics to Prometheus </title><link>http://www.schabell.org/2026/01/mastering-fluentbit-developers-guide-to-routing-metrics-to-prometheus.html</link><category>Cloud</category><category>Cloud Data</category><category>Cloud Native</category><category>Containers</category><category>Fluent Bit</category><category>Mastering Fluent Bit</category><category>Observability</category><category>Prometheus</category><pubDate>Thu, 8 Jan 2026 07:00:00 +0100</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-4499896549274457189</guid><description>&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s960/Mastering%20Fluent%20Bit%20Blog%20Series.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s320/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;This series is a general purpose getting started guide for those of us wanting to learn about the Cloud Native Computing Foundation (CNCF) project Fluent Bit.&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;Each article in this series addresses a single topic by providing insights into what the topic is, why we are interested in exploring that topic, where to get started with the topic, and how to get hands-on with learning about the topic as it relates to the Fluent Bit project.&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;The idea is that each article can stand on its own, but that they also lead down a path that slowly increases our abilities to implement solutions with Fluent Bit telemetry pipelines.&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;Let's take a look at the topic of this article, integrating Fluent Bit with Prometheus. In case you missed the previous article, check out the &lt;a href="https://www.schabell.org/2025/12/mastering-fluentbit-developer-guide-to-telemetry-pipeline-routing.html" rel="nofollow" target="_blank"&gt;developer guide to telemetry pipeline routing&lt;/a&gt; where you explore how to direct telemetry data to different destinations based on tags, patterns, and conditions.&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;This article will be a hands-on exploration of Prometheus integration that helps you as a developer leverage Fluent Bit's powerful metrics capabilities. We'll look at the first of three essential patterns for integrating Fluent Bit with Prometheus in your observability infrastructure.&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;All examples in this article have been done on OSX and are assuming the reader is able to convert the actions shown here to their own local machines.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Integrating with Prometheus?&lt;/h3&gt;&lt;p&gt;Before diving into the hands-on examples, let's understand why Prometheus integration matters for Fluent Bit users. Prometheus is the de facto standard for metrics collection and monitoring in cloud native environments. It's another CNCF graduated project that provides a time-series database optimized for operational monitoring. The combination of Fluent Bit's lightweight, high-throughput telemetry pipeline with Prometheus's battle-tested metrics storage creates a powerful observability solution.&lt;/p&gt;&lt;p&gt;Fluent Bit provides several ways to integrate with Prometheus. You can expose metrics endpoints that Prometheus can scrape (pull model), push metrics directly to Prometheus using the remote write protocol, or even scrape existing Prometheus endpoints and route those metrics through your telemetry pipeline. This flexibility allows Fluent Bit to act as a metrics aggregator, forwarder, or even a replacement for dedicated metrics agents in resource-constrained environments.What is Prometheus Integration?&lt;/p&gt;&lt;p&gt;There are several compelling reasons to integrate Fluent Bit with Prometheus in your infrastructure. First, Fluent Bit can collect system-level metrics using its built-in Node Exporter Metrics plugin, eliminating the need to deploy a separate Prometheus Node Exporter. This reduces resource usage and simplifies your deployment.&lt;/p&gt;&lt;p&gt;Second, Fluent Bit can monitor itself and expose internal pipeline metrics, giving you visibility into the health and performance of your telemetry infrastructure. Understanding how your telemetry pipeline is performing is critical for maintaining reliable observability. This will be covered in a future article.&lt;/p&gt;&lt;p&gt;Third, Fluent Bit can act as a metrics proxy, scraping metrics from various sources and forwarding them to Prometheus. This is particularly useful when you need to aggregate metrics from multiple sources or transform them before they reach Prometheus. This will be explored in a future article.&lt;/p&gt;&lt;p&gt;Let's dive into the first pattern, collecting system-level metrics using its built-in Node Exporter Metrics plugin.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Where to get started&lt;/h3&gt;&lt;p&gt;You should have explored the previous articles in this series to install and get started with Fluent Bit on your developer local machine, either using &lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-from-source.html" rel="nofollow" target="_blank"&gt;the source code&lt;/a&gt; or &lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-and-configuring-using-contianer-images.html" rel="nofollow" target="_blank"&gt;container images&lt;/a&gt;. Links at the end of this article will point you to a free hands-on workshop that lets you explore more of Fluent Bit in detail.&lt;/p&gt;&lt;p&gt;You can verify that you have a functioning installation by testing your Fluent Bit, either using a source installation or a container installation as shown below:&lt;/p&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; caret-color: rgb(68, 68, 68); color: #444444; font-family: inherit; font-size: 14px; font-variant-ligatures: normal; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run -ti ghcr.io/fluent/fluent-bit:4.2.2 -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;...&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;[0] dummy.0: [[1753105021.031338000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105022.033205000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105023.032600000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105024.033517000, {}], {"message"=&amp;gt;"dummy"}]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;&lt;span style="caret-color: rgb(0, 0, 0); color: black; font-family: inherit;"&gt;Let's explore&amp;nbsp;the three Prometheus integration patterns that will help you with your observability infrastructure.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;How to integrate with Prometheus&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;See &lt;a href="https://www.schabell.org/2025/07/mastering-fluent-bit-developer-guide-to-service-section-config.html" rel="nofollow" target="_blank"&gt;this article for details&lt;/a&gt; about the service section of the configurations used in the rest of this article, but for now we plan to focus on our Fluent Bit pipeline and specifically the Prometheus integration capabilities that can be of great help in managing metrics in your observability stack.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;Below in the figure you see the phases of a telemetry pipeline. Metrics collected by input plugins flow through the pipeline and can be routed to Prometheus-compatible outputs.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAkRj9pAJSFxsBPRxG0Ad_V5v60b6-bxfl-NeEcIj33FgRbUnfrJo8cAzKkbA0uMl2qNn9mBEsREJskZieB7E5CWeh2JZhq4iyB3ft06MwyXBrshIQOC1ybGBT9NqRunYBHCcJgbagmUmcAyESV8N6Ju3rKJ00_HonsqxAkOPh-AdJLAfvegDkGlxguoc/s2204/fb-pipeline.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="658" data-original-width="2204" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAkRj9pAJSFxsBPRxG0Ad_V5v60b6-bxfl-NeEcIj33FgRbUnfrJo8cAzKkbA0uMl2qNn9mBEsREJskZieB7E5CWeh2JZhq4iyB3ft06MwyXBrshIQOC1ybGBT9NqRunYBHCcJgbagmUmcAyESV8N6Ju3rKJ00_HonsqxAkOPh-AdJLAfvegDkGlxguoc/w640-h192/fb-pipeline.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;Understanding how metrics flow through Fluent Bit's pipeline is essential for effective Prometheus integration. Input plugins collect metrics, which then pass through filters for transformation, before being routed to output plugins that deliver metrics to Prometheus.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;&lt;span style="caret-color: rgb(0, 0, 0); color: black; font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;Now let's look at the first of three most useful Prometheus integration patterns that developers will want to know about.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Routing metrics through Fluent Bit to Prometheus&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;The first integration pattern involves collecting host-level metrics using Fluent Bit's built-in &lt;a href="https://docs.fluentbit.io/manual/data-pipeline/inputs/node-exporter-metrics" rel="nofollow" target="_blank"&gt;&lt;i&gt;Node Exporter Metrics&lt;/i&gt;&lt;/a&gt; plugin and exposing them for Prometheus to scrape. This pattern is incredibly valuable because it allows you to collect system metrics without deploying a separate &lt;i&gt;Prometheus Node Exporter&lt;/i&gt; agent.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;The &lt;i&gt;Node Exporter Metrics&lt;/i&gt; input plugin implements a subset of the collectors available in the original &lt;i&gt;Prometheus Node Exporter&lt;/i&gt;. It collects CPU statistics, memory usage, disk I/O, network interface statistics, filesystem information, and more. The beauty of this approach is that all these metrics flow through Fluent Bit's pipeline, where you can transform, filter, and route them as needed.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal;"&gt;To demonstrate this pattern, let's create a configuration file called &lt;b&gt;&lt;i&gt;fluent-bit.yaml&lt;/i&gt;&lt;/b&gt; that collects host metrics and exposes them through a Prometheus endpoint:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on

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_label:
        - app fluent-bit
        - environment development&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;    # testing output to console&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;    - name: stdout
      match: node_metrics
      format: json_lines&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Our configuration uses the &lt;b&gt;&lt;i&gt;node_exporter_metrics&lt;/i&gt;&lt;/b&gt; input plugin to collect system metrics every two seconds. The &lt;b&gt;&lt;i&gt;prometheus_exporter&lt;/i&gt;&lt;/b&gt; output plugin then exposes these metrics on port 2021 in a format that Prometheus can scrape. We've also added the custom labels &lt;b&gt;&lt;i&gt;app&lt;/i&gt;&lt;/b&gt; and &lt;i&gt;&lt;b&gt;environment&lt;/b&gt;&lt;/i&gt; that will be attached to all metrics, making it easier to filter and query them in Prometheus.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's run this configuration as follows:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.2.2&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# Note: For container deployments collecting linux host metrics, you need
# to mount the host's /proc and /sys filesystems:
# $ podman run --rm -v /proc:/host/proc:ro -v /sys:/host/sys:ro -p 2021:2021 fb&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;[2026/01/19 15:25:47.115361000] [ warn] [input:node_exporter_metrics:node_exporter_metrics.0] calling IORegistryEntryGetChildEntry is failed
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="0",mode="user"} = 25039.200000000001
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="0",mode="system"} = 9067.2999999999993
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="0",mode="nice"} = 0
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="0",mode="idle"} = 48662.790000000001
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="1",mode="user"} = 23096.860000000001
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="1",mode="system"} = 7764.7299999999996
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="1",mode="nice"} = 0
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="1",mode="idle"} = 52016.459999999999
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="2",mode="user"} = 20056.130000000001
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="2",mode="system"} = 6364.9700000000003
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="2",mode="nice"} = 0
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="2",mode="idle"} = 56597.839999999997
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="3",mode="user"} = 17696.98
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="3",mode="system"} = 5385.8999999999996
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="3",mode="nice"} = 0
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="3",mode="idle"} = 60055.519999999997
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="4",mode="user"} = 412.75
2026-01-19T14:25:47.114513143Z node_cpu_seconds_total{cpu="4",mode="system"} = 116.18000000000001&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;Note that the warning entry is an OSX specific issue with the &lt;i&gt;node_exporter_metrics&lt;/i&gt; input plugin. The &lt;i&gt;node_exporter_metrics&lt;/i&gt; plugin tries to collect system metrics similar to &lt;i&gt;Prometheus Node Exporter&lt;/i&gt;. On OSX, it uses Apple's IOKit framework to access hardware information through the IORegistry (a hierarchical database of hardware devices).&amp;nbsp;&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;Our console output for testing shows all the available metrics about this machine that are being collected every 1s. This gives us something to work with and query once it's sent to a Prometheus backend.&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;Now verify the metrics are being tagged with custom labels by opening a browser window to &lt;i style="font-weight: bold;"&gt;http://localhost:2021/metrics&lt;/i&gt;&amp;nbsp;and we should see the following:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit; font-size: 14px;"&gt;# HELP node_cpu_seconds_total Seconds the CPUs spent in each mode.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="0",mode="user"} 25095.049999999999
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="0",mode="system"} 9092.3299999999999
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="0",mode="nice"} 0
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="0",mode="idle"} 48874.290000000001
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="1",mode="user"} 23145.150000000001
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="1",mode="system"} 7784.9700000000003
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="1",mode="nice"} 0
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="1",mode="idle"} 52240.839999999997
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="2",mode="user"} 20091.23
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="2",mode="system"} 6379.5500000000002
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="2",mode="nice"} 0
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="2",mode="idle"} 56841.639999999999
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="3",mode="user"} 17723.43
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="3",mode="system"} 5396.7299999999996
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="3",mode="nice"} 0
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="3",mode="idle"} 60312.18
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="4",mode="user"} 412.89999999999998
node_cpu_seconds_total{app="fluent-bit",environment="development",cpu="4",mode="system"} 116.25&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;Notice how the metrics include our custom labels &lt;i&gt;app="fluent-bit"&lt;/i&gt; and &lt;i&gt;environment="development"&lt;/i&gt;. These labels are automatically added to every metric by the Prometheus exporter output plugin, making it easy to identify and filter metrics in your Prometheus queries.&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;To integrate this with Prometheus, add a scrape configuration to your Prometheus configuration file&amp;nbsp;&lt;i style="font-weight: bold;"&gt;prometheus.yml &lt;/i&gt;as follows:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit; font-size: 14px;"&gt;scrape_configs:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;  - job_name: 'fluent-bit-node-metrics'
    static_configs:
      - targets: ['localhost:2021']
    scrape_interval: 10s&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;This configuration tells Prometheus to scrape the Fluent Bit metrics endpoint every 10 seconds. The metrics will then be available for querying in Prometheus and can be visualized in the Prometheus console or using &lt;a href="https://perses.dev" rel="nofollow" target="_blank"&gt;the Perses project&lt;/a&gt; for dashboards.&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;The &lt;i&gt;Node Exporter Metrics&lt;/i&gt; plugin supports numerous collectors including CPU, disk I/O, filesystem, load average, memory, network interface, and more. You can selectively enable or disable collectors based on your monitoring needs, and set individual scrape intervals for each collector type.&lt;/p&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;It's left to the reader to run their own Prometheus instance with this configuration and to explore the collected metrics telemetry data. A primer to do this if you need help can be found in this hands-on free online &lt;a href="https://o11y-workshops.gitlab.io/workshop-prometheus/" rel="nofollow" target="_blank"&gt;Prometheus workshop&lt;/a&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style="text-align: left;"&gt;More in the series&lt;/h3&gt;&lt;p style="text-align: left;"&gt;In this article you explored the first of three powerful patterns for integrating Fluent Bit with Prometheus: collecting and exposing host metrics. In the following article we will continue onwards to look at monitoring Fluent Bit's internal pipeline health and using Fluent Bit as a metrics proxy with remote write capabilities. This article is based on this &lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit" rel="nofollow" target="_blank"&gt;online free workshop&lt;/a&gt;.&lt;/p&gt;&lt;p style="text-align: left;"&gt;There will be more in this series as you continue to learn how to configure, run, manage, and master the use of Fluent Bit in the wild. Next up, we'll explore monitoring Fluent Bit's internal pipeline health.&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s72-c/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>DevOpsCon Amsterdam 2026: It’s my docs, and I will cry if I want to! </title><link>http://www.schabell.org/2026/01/devopscon-ams-2026-its-my-docs-cry-if-want-to.html</link><category>AppDev</category><category>Cloud</category><category>Cloud Native</category><category>conference</category><category>Fluent Bit</category><category>Observability</category><pubDate>Mon, 5 Jan 2026 07:00:00 +0100</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-7426093541944584487</guid><description>&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgvex9RYbrB87MeCaMsE2DAXrV1aoRf05i_MJNO_ZA42qGjeAXQtRAz5NJYdOpUKdOZIqtA1aBdky2uOP6PhMXgA4VwSqzGf23XJQs7v-8R3EvArGP9sLB-hYiri94H5INdcMWbIGkR0sjAf3-A-0b-6s99hmdT0dhAD23XMicA8wxDi-8BG-N3Hkp7DmU" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="725" data-original-width="933" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEgvex9RYbrB87MeCaMsE2DAXrV1aoRf05i_MJNO_ZA42qGjeAXQtRAz5NJYdOpUKdOZIqtA1aBdky2uOP6PhMXgA4VwSqzGf23XJQs7v-8R3EvArGP9sLB-hYiri94H5INdcMWbIGkR0sjAf3-A-0b-6s99hmdT0dhAD23XMicA8wxDi-8BG-N3Hkp7DmU" width="309" /&gt;&lt;/a&gt;&lt;/div&gt;My last DevOpsCon event was in Munich, so when I saw they were expanding and visiting my home country in Amsterdam, Netherlands I could not resist. I submitted a few things and the one that was selected is a talk I'm going to be testing based on my experiences over the last year as a maintainer on the &lt;a href="https://fluentbit.io" rel="nofollow" target="_blank"&gt;Fluent Bit&lt;/a&gt; CNCF project.&lt;p&gt;&lt;/p&gt;&lt;p&gt;I will be on-site at the Van der Valk Hotel Amsterdam-Amstel for &lt;a href="https://devopscon.io/amsterdam/" rel="nofollow" target="_blank"&gt;DevOpsCon Amsterdam&lt;/a&gt; from 20-24 April 2026. They will have networking, sessions, and hands-on workshops available for all who attend.&lt;/p&gt;&lt;p&gt;Below you'll find my talk details and the schedule.&lt;/p&gt;&lt;span&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;My talk was added to the Observability &amp;amp; Reliability track and is scheduled for Wednesday, 22 April 2026 at the time of this writing.&amp;nbsp;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;&lt;a href="https://devopscon.io/monitoring-observability/documentation-observability-fluent-bit-docs-project/" rel="nofollow" target="_blank"&gt;&lt;i&gt;It’s my docs, and I will cry if I want to!&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p style="text-align: left;"&gt;&lt;i&gt;&lt;b&gt;(Surviving and reviving documentation in a decade-old open source project)&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;i&gt;Documentation is often the unsung hero — or the forgotten relic — of open source software. After ten years of development, Fluent Bit, a high-performance logging and metrics processor, has grown into a complex ecosystem of plugins, integrations, and configuration options. Meanwhile, its documentation has struggled to keep pace. In this talk, I’ll share the journey of inheriting and maintaining a decade’s worth of documentation debt in the Fluent Bit Docs project. We’ll explore what happens when docs evolve slower than code, the challenges of balancing accuracy with accessibility, and how technical debt in docs is just as real (and painful) as in code.&amp;nbsp;&lt;/i&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiQz_BhV-TpxFyp_0r0GOMEa7r5FjmC2fn4_1ecxV7rHg969coOI3htSaPkVFfojuxThuh6vx2o31nqtRsk-GWsxAaMprHvBgxp26fUU71nT4XicxKZKVEg6-YtvLQJKOWkGEDJOG46nm2AG174QWpxaGkCiF6yhc-fhGj-lTuhWoE0GAxYMi90xdhS9g/s1622/Screenshot%202026-02-12%20at%2014.37.37.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" data-original-height="1104" data-original-width="1622" height="218" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiQz_BhV-TpxFyp_0r0GOMEa7r5FjmC2fn4_1ecxV7rHg969coOI3htSaPkVFfojuxThuh6vx2o31nqtRsk-GWsxAaMprHvBgxp26fUU71nT4XicxKZKVEg6-YtvLQJKOWkGEDJOG46nm2AG174QWpxaGkCiF6yhc-fhGj-lTuhWoE0GAxYMi90xdhS9g/s320/Screenshot%202026-02-12%20at%2014.37.37.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;I’ll share my experiences with:&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;i&gt;Auditing and triaging outdated documentation at scale (getting started)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Building collaboration between developers, contributors, and users (trying to!)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Modernizing doc structure and tooling without burning it all down (step-by-baby-step)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Restoring your sanity — and maybe even your love for docs (the ongoing rewards!)&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;Whether you’re a doc maintainer, an open source contributor, or just someone who’s cried over a barebones README, this talk will commiserate and (hopefully) motivate you to never fear a docs challenge again!&lt;/i&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Looking forward to seeing you there and getting feedback on what you think of this topic!&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/a/AVvXsEgvex9RYbrB87MeCaMsE2DAXrV1aoRf05i_MJNO_ZA42qGjeAXQtRAz5NJYdOpUKdOZIqtA1aBdky2uOP6PhMXgA4VwSqzGf23XJQs7v-8R3EvArGP9sLB-hYiri94H5INdcMWbIGkR0sjAf3-A-0b-6s99hmdT0dhAD23XMicA8wxDi-8BG-N3Hkp7DmU=s72-c" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>2025 Year in Review: Community, Contribution, and Changes</title><link>http://www.schabell.org/2025/12/2025-year-in-review.html</link><category>Cloud</category><category>Cloud Data</category><category>Cloud Native</category><category>conference</category><category>Containers</category><category>DevOps</category><category>event</category><category>Fluent Bit</category><category>Jaeger</category><category>Meetup</category><category>O11y Guide</category><category>Observability</category><category>OpenTelemetry</category><category>Perses</category><category>Prometheus</category><category>PromLens</category><category>PromQL</category><category>Publishing</category><category>Workshops</category><pubDate>Wed, 31 Dec 2025 07:00:00 +0100</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-2310961446293477115</guid><description>&lt;p&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEi82uV9gY-MhQ8QF2-5uSNIoITM8ZANSeo9OqM6WZq0f2ioaozBTxoHHgxKFp75ITIO9wXGtCtNarf-hBvnXs6n2UraEN2JRp1AvnC9Up2sJwVebuC9CiTBYMR012YgvRA25MwjvAbtDakCeOSUk9jNYUM_ruZD65Ne8e8KG1vo4Phx7t2VKgW-JTF49NY" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="980" data-original-width="1225" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEi82uV9gY-MhQ8QF2-5uSNIoITM8ZANSeo9OqM6WZq0f2ioaozBTxoHHgxKFp75ITIO9wXGtCtNarf-hBvnXs6n2UraEN2JRp1AvnC9Up2sJwVebuC9CiTBYMR012YgvRA25MwjvAbtDakCeOSUk9jNYUM_ruZD65Ne8e8KG1vo4Phx7t2VKgW-JTF49NY" width="300" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: inherit;"&gt;As we ease into the last few days of 2025, I like to close out this one last task: reflecting back on all the fun, challenges, and travel over the past year. While it takes a bit of research to gather all the facts and figures, it’s a rewarding effort. I’ve been sharing on this site for two decades now—no ads, no ulterior motives—just an honest effort to communicate with the world.&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p data-path-to-node="4"&gt;This year, the focus for me and my teams remained on the four pillars of our role:&amp;nbsp;&lt;span data-index-in-node="83" data-path-to-node="4"&gt;speaking, publishing, socializing, and hands-on content generation.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-path-to-node="4"&gt;While 2024 was about observability (o11y) taking center stage, 2025 was the year we put those theories into practice, accelerated our momentum, and stated to gain serious traction in the wild.&amp;nbsp;&lt;/p&gt;&lt;p data-path-to-node="4"&gt;Read on to find out more!&lt;/p&gt;&lt;span&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;p style="text-align: left;"&gt;This was my third full year working for Chronosphere, an observability vendor that has really started to blossom. I remember when I started here, nobody knew who we were. Now it's a common occurrence to run into existing customers and to hear people say, "Chronosphere, I've heard of that!"&lt;/p&gt;&lt;h3 data-path-to-node="11"&gt;Travel and Events&lt;/h3&gt;&lt;p style="text-align: left;"&gt;Travel and speaking at events around the world is a major focus of what I do. I'm teaching, sharing, and freely contributing to both open source projects and to the general public knowledge around observability technologies.&amp;nbsp;&lt;/p&gt;&lt;p style="text-align: left;"&gt;As you can see in the attached figure, I had 17 trips to 36 cities and 8 countries with the following destinations:&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgw_qPKFnrhTlyDT0I2OHLRZJ5i9n1yfjmKRcc_5DGqYNjFMduH_52u4DK1ZV5IPnG9SiW8OUjf4dYCvzH0p7IQiqihD6jNVveq3NdblykxJZ4M4kWIxHr6aBa0fdsz0W61TZq1ZVjyxB4-jGesZLUQb3kh4yrvAoUNtIdIYffT-6tNeaRXLi6GjNGUCQY" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img alt="" data-original-height="498" data-original-width="724" height="220" src="https://blogger.googleusercontent.com/img/a/AVvXsEgw_qPKFnrhTlyDT0I2OHLRZJ5i9n1yfjmKRcc_5DGqYNjFMduH_52u4DK1ZV5IPnG9SiW8OUjf4dYCvzH0p7IQiqihD6jNVveq3NdblykxJZ4M4kWIxHr6aBa0fdsz0W61TZq1ZVjyxB4-jGesZLUQb3kh4yrvAoUNtIdIYffT-6tNeaRXLi6GjNGUCQY" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Portland, OR&lt;/li&gt;&lt;li&gt;Salt Lake City, UT&lt;/li&gt;&lt;li&gt;Spain&lt;/li&gt;&lt;li&gt;Las Vegas, NV&lt;/li&gt;&lt;li&gt;London, UK (2&lt;/li&gt;&lt;li&gt;Glasgow, Scotland&lt;/li&gt;&lt;li&gt;Boston, MA&lt;/li&gt;&lt;li&gt;New York City, NY&lt;/li&gt;&lt;li&gt;Washington DC&lt;/li&gt;&lt;li&gt;Raleigh, NC&lt;/li&gt;&lt;li&gt;Oklahoma City, OK&lt;/li&gt;&lt;li&gt;Manchester, UK&lt;/li&gt;&lt;li&gt;Dublin, Ireland&lt;/li&gt;&lt;li&gt;Atlanta, GA&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;Some of the events:&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;SREDay London&lt;/li&gt;&lt;li&gt;Devoxx UK&lt;/li&gt;&lt;li&gt;Cloud Native Rejekts EU&lt;/li&gt;&lt;li&gt;KubeCon EU&lt;/li&gt;&lt;li&gt;Cloud Native Los Angeles&lt;/li&gt;&lt;li&gt;Tech Meetup Glasgow&lt;/li&gt;&lt;li&gt;Cloud Native London&lt;/li&gt;&lt;li&gt;Red Hat Summit NA&lt;/li&gt;&lt;li&gt;SRECon EU&lt;/li&gt;&lt;li&gt;All Things Open&lt;/li&gt;&lt;li&gt;Cloud Native Rejects NA&lt;/li&gt;&lt;li&gt;KubeCon NA&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p style="text-align: left;"&gt;If 2024 was about &lt;i&gt;strategic travel&lt;/i&gt;, 2025 was about being where the community is. The travel schedule was relentless but incredibly rewarding. From London to Atlanta, the message remained clear: observability is the backbone of modern operations.&lt;/p&gt;&lt;h3 data-path-to-node="5"&gt;Publishing&lt;/h3&gt;&lt;div&gt;I’ve continued to preach the open-source gospel as a Cloud Native Computing Foundation (CNCF) Ambassador. My team spent 2025 bridging the gap between metrics, events, traces, logs, and dashboards.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjn-7qphSLyink3aSm-R3TBvXcAXB6AAycWHnLlmWKGgkHGI7tTznXpo9Zq6BPgUJj2y-1Oxy-vgp1cd18UYi0Dwv_yTjbd8UntfgmbIzU1OubSpwSbH72D3fr2NAwDvbCWRFVhbRSxCR7wDrI_D8pGPjEF82sVmYiRDedQhxQVZyoP67_Z-XP7D3VOfuI" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img data-original-height="632" data-original-width="2010" height="126" src="https://blogger.googleusercontent.com/img/a/AVvXsEjn-7qphSLyink3aSm-R3TBvXcAXB6AAycWHnLlmWKGgkHGI7tTznXpo9Zq6BPgUJj2y-1Oxy-vgp1cd18UYi0Dwv_yTjbd8UntfgmbIzU1OubSpwSbH72D3fr2NAwDvbCWRFVhbRSxCR7wDrI_D8pGPjEF82sVmYiRDedQhxQVZyoP67_Z-XP7D3VOfuI=w400-h126" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="caret-color: rgb(68, 68, 68); font-family: inherit;"&gt;This year &lt;a href="https://www.schabell.org" rel="nofollow" target="_blank"&gt;my blog&lt;/a&gt; turned 20 years in production!&amp;nbsp;&lt;/span&gt;The reach of our content in 2025 exceeded all expectations. Sharing knowledge is only half the battle; ensuring it reaches the right people is the other half. This year, my blog surpassed&amp;nbsp;&lt;span data-index-in-node="170" data-path-to-node="9"&gt;900,000 views&lt;/span&gt;, a testament to the community's growing hunger for cloud-native and observability insights. &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span style="caret-color: rgb(68, 68, 68); font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="caret-color: rgb(68, 68, 68); font-family: inherit;"&gt;I topped out in Oct - Nov at 205k views. At the time of this writing it's around 4.7 million views and I'm happy to see that it has such value for so many visitors as that's always been the goal.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;span style="font-family: inherit;"&gt;This blog offers free content (see the license at the footer of this blog) and without any advertising. It's about learning and not about earning. I've published 37 articles here this year on a large range of topics, but mostly focused on cloud native observability. &amp;nbsp;I've also continued to find syndication with&amp;nbsp;&lt;a href="https://dzone.com/authors/eschabell" rel="nofollow" target="_blank"&gt;DZone&lt;/a&gt;, posting 16 articles in featured posts.&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="https://o11y-workshops.gitlab.io" rel="nofollow" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img data-original-height="665" data-original-width="1351" height="198" src="https://blogger.googleusercontent.com/img/a/AVvXsEjivGjzZEEEAxOPwF-KvR_1hwFcnT9QP5PrRX3KNjZI98maMzBtb0bP1FMr3_ZsL57DS4LkraigEaB6IVM5dTqTkaOMUzpkxUoaldLNL-rOkQ9ZdO8D5UvVkSOpjin2p65wNaEngt5Zz1cv_kZT1ZmHJ6eP0Xh56_XPC0y_SHVMIV5zWclt-Isd5gRwk0E=w400-h198" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;b data-index-in-node="0" data-path-to-node="7,2,0"&gt;&lt;/b&gt;&lt;/p&gt;&lt;h3 data-path-to-node="11"&gt;Workshops and hands-on content&lt;/h3&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;This was the &lt;i&gt;&lt;a href="https://o11y-workshops.gitlab.io" rel="nofollow" target="_blank"&gt;Year of the Workshop&lt;/a&gt;&lt;/i&gt;. We focused heavily on Fluent Bit telemetry pipelines, Prometheus, OpenTelemetry, and Perses visualization.&amp;nbsp;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2L-aNshwz64ncMYaaZ0q0fPmyFgR2aEVA9rL_zdmINDfyD4_MDvybYFIie8FTEIG0_xOxbkDofBYRfdsHOzn8mPSSXYTzNOBOIuNYgTTWqxzHhkcRWraio5PsJODkLSIuxrak8D3ziNBTNfRjXPlCw6gkghmVKKcoYOWvzKoPwVdTdEnyzD1j9hd21NA/s2466/qrcode-o11y-workshops.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" data-original-height="2466" data-original-width="2000" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2L-aNshwz64ncMYaaZ0q0fPmyFgR2aEVA9rL_zdmINDfyD4_MDvybYFIie8FTEIG0_xOxbkDofBYRfdsHOzn8mPSSXYTzNOBOIuNYgTTWqxzHhkcRWraio5PsJODkLSIuxrak8D3ziNBTNfRjXPlCw6gkghmVKKcoYOWvzKoPwVdTdEnyzD1j9hd21NA/w163-h200/qrcode-o11y-workshops.png" width="163" /&gt;&lt;/a&gt;&lt;/div&gt;I personally shifted my focus from Perses to Fluent Bit and have since become a maintainer. I'm working extensively on &lt;a href="https://docs.fluentbit.io/manual/" rel="nofollow" target="_blank"&gt;the docs project&lt;/a&gt;, some on the website, and have even managed to start contributing code to the main Fluent Bit project. Good to be back hands on with open source projects, where I have my roots.&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p data-path-to-node="12"&gt;This was the year I also started working with AI in my coding, using vibe coding as it's known. This has been a fun journey and it definitely has accelerated both my coding and my production. It has not gone on without a few bumps in the road, but that's the fun of learning new things!&lt;/p&gt;&lt;h3 data-path-to-node="14"&gt;The Fairway Journey&lt;/h3&gt;&lt;p data-path-to-node="15"&gt;While the tech world moved fast, I made sure my time on the grass kept pace. 2025 was the first full year of focus for my golf game. I logged an incredible&amp;nbsp;&lt;span data-index-in-node="143" data-path-to-node="15"&gt;123 rounds&lt;/span&gt;, taking my clubs to&amp;nbsp;&lt;span data-index-in-node="174" data-path-to-node="15"&gt;Spain, Florida, North Carolina, and Oregon&lt;/span&gt;. All that practice paid off—I started the year at a 9.4, but I’m closing out 2025 with my&amp;nbsp;&lt;span data-index-in-node="307" data-path-to-node="15"&gt;handicap down to a 5.6&lt;/span&gt;.&amp;nbsp;&lt;/p&gt;&lt;p data-path-to-node="15"&gt;The goal is not for me to get to scratch, I just enjoy a nice time and want to hit the ball rather regularly where I aim it. This is the realization that life is moving along and that I'm not going upwards in any sports I choose to play, but slowly declining.&amp;nbsp;&lt;/p&gt;&lt;p data-path-to-node="15"&gt;It's a natural evolution and I think golf is the one game I can play for a very, very long time and the enjoyment will not diminish no matter the handicap.&amp;nbsp;&lt;/p&gt;&lt;h3 data-path-to-node="18"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgHAimKssWIva_YU7Hy_fB37uEqRyJEuRzeY1f4IA7n3JaO5eMXyVzg7KzjFYrfEBj8zThfXoc_jgSNugaG0RudlVEWmjS3qRHqVbtPYgqt4EqMHV5cA6KwvJek2i7M_mW2JhpNB37lBCdp5H3mM_OQ2ICyI-fB_0bS2Q2ycnoBfvWlfTSbO3yZVypShXg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img alt="" data-original-height="5712" data-original-width="4284" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEgHAimKssWIva_YU7Hy_fB37uEqRyJEuRzeY1f4IA7n3JaO5eMXyVzg7KzjFYrfEBj8zThfXoc_jgSNugaG0RudlVEWmjS3qRHqVbtPYgqt4EqMHV5cA6KwvJek2i7M_mW2JhpNB37lBCdp5H3mM_OQ2ICyI-fB_0bS2Q2ycnoBfvWlfTSbO3yZVypShXg" width="180" /&gt;&lt;/a&gt;&lt;/div&gt;What's next?&lt;/h3&gt;&lt;p data-path-to-node="12"&gt;Finally, the year wrapped up with&amp;nbsp;&lt;a href="https://www.paloaltonetworks.com/company/press/2025/palo-alto-networks-to-acquire-chronosphere--next-gen-observability-leader--for-the-ai-era" rel="nofollow" target="_blank"&gt;some major news&lt;/a&gt;!&lt;/p&gt;&lt;p data-path-to-node="12"&gt;I do not know how this will change work and my 2026 plans, but I'm very excited for this next chapter. I am looking forward to helping scale Chronosphere's reach next year.&lt;/p&gt;&lt;h3 data-path-to-node="18"&gt;Thanks for the Journey&lt;/h3&gt;&lt;p data-path-to-node="19"&gt;This journey would be nothing without our readers, listeners, watchers, and those providing feedback. I thank you from the bottom of my heart. I’m already looking forward to 2026 and the new challenges it will bring.&lt;/p&gt;&lt;p data-path-to-node="20"&gt;Happy holidays and end of the year to you and your families as you transition into 2026, I'm looking forward to seeing you all online and in person next year!&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/a/AVvXsEi82uV9gY-MhQ8QF2-5uSNIoITM8ZANSeo9OqM6WZq0f2ioaozBTxoHHgxKFp75ITIO9wXGtCtNarf-hBvnXs6n2UraEN2JRp1AvnC9Up2sJwVebuC9CiTBYMR012YgvRA25MwjvAbtDakCeOSUk9jNYUM_ruZD65Ne8e8KG1vo4Phx7t2VKgW-JTF49NY=s72-c" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>Mastering Fluent Bit: Developer Guide to Telemetry Pipeline Routing</title><link>http://www.schabell.org/2025/12/mastering-fluent-bit-developer-guide-to-telemetry-pipeline-routing.html</link><category>Cloud</category><category>Cloud Data</category><category>Cloud Native</category><category>Containers</category><category>Fluent Bit</category><category>Mastering Fluent Bit</category><category>Observability</category><pubDate>Wed, 3 Dec 2025 07:00:00 +0100</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-4932527457001577652</guid><description>&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4ntAHGgfC4WGIz6LJ1ahBJibbv6SqlC4ZS9SG8OYW_RONjqt-IkaEyuDS4YBdkUjWewB8qYWb3G7LLcZwlFnfTriZwYBfOJfi-89cP4ko4hiIriQpaFQKkyQoN9eRrWTy0TgpPniB-a2nND85MpGjRjE0wzKe8rfi0eg6ZnCYXJxreiP3caSSLfZrWYY/s960/Mastering%20Fluent%20Bit%20Blog%20Series.png" style="clear: left; display: inline; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4ntAHGgfC4WGIz6LJ1ahBJibbv6SqlC4ZS9SG8OYW_RONjqt-IkaEyuDS4YBdkUjWewB8qYWb3G7LLcZwlFnfTriZwYBfOJfi-89cP4ko4hiIriQpaFQKkyQoN9eRrWTy0TgpPniB-a2nND85MpGjRjE0wzKe8rfi0eg6ZnCYXJxreiP3caSSLfZrWYY/s320/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="320" /&gt;&lt;/a&gt;This series is a general purpose getting started guide for those of us wanting to learn about the Cloud Native Computing Foundation (CNCF) project Fluent Bit.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Each article in this series addresses a single topic by providing insights into what the topic is, why we are interested in exploring that topic, where to get started with the topic, and how to get hands-on with learning about the topic as it relates to the Fluent Bit project.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;The idea is that each article can stand on its own, but that they also lead down a path that slowly increases our abilities to implement solutions with Fluent Bit telemetry pipelines.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Let's take a look at the topic of this article, using Fluent Bit routing for developers. In case you missed the previous article, check out &lt;a href="https://www.schabell.org/2025/11/mastering-fluentbit-top-3-telemetry-pipeline-filters-for-developers.html" rel="nofollow" target="_blank"&gt;the top three telemetry pipeline filters&lt;/a&gt; where you explore the most useful filters for manipulating and controlling your telemetry data.&lt;/p&gt;&lt;p&gt;This article will be a hands-on exploration of routing patterns that help you as a developer building sophisticated telemetry pipelines. We'll look at how to direct telemetry data to different destinations based on tags, patterns, and conditions in your Fluent Bit configurations.&lt;/p&gt;&lt;span&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;All examples in this article have been done on OSX and are assuming the reader is able to convert the actions shown here to their own local machines.&lt;/p&gt;&lt;p&gt;You should have explored the previous articles in this series to install and get started with Fluent Bit on your developer local machine, either using &lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-from-source.html" rel="nofollow" target="_blank"&gt;the source code&lt;/a&gt; or &lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-and-configuring-using-contianer-images.html" rel="nofollow" target="_blank"&gt;container images&lt;/a&gt;. Links at the end of this article will point you to a free hands-on workshop that lets you explore more of Fluent Bit in detail.&lt;/p&gt;&lt;p&gt;You can verify that you have a functioning installation by testing your Fluent Bit, either using a source installation or a container installation as shown below:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; caret-color: rgb(68, 68, 68); color: #444444; font-family: inherit; font-size: 14px; font-variant-ligatures: normal; orphans: 2; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run -ti ghcr.io/fluent/fluent-bit:4.2.0 -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;...&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;[0] dummy.0: [[1753105021.031338000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105022.033205000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105023.032600000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105024.033517000, {}], {"message"=&amp;gt;"dummy"}]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words" style="background-color: white; color: #444444; font-variant-ligatures: normal; orphans: 2; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2;"&gt;&lt;span style="caret-color: rgb(0, 0, 0); color: black; font-family: inherit;"&gt;Let's explore how routing works in Fluent Bit and why it's essential for building production-ready telemetry pipelines.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Understanding routing in telemetry pipelines&lt;/h3&gt;&lt;p&gt;See &lt;a href="https://www.schabell.org/2025/07/mastering-fluent-bit-developer-guide-to-service-section-config.html" rel="nofollow" target="_blank"&gt;this article for details&lt;/a&gt; about the service section of the configurations used in the rest of this article, but for now we plan to focus on our Fluent Bit pipeline and specifically the routing capabilities that let us direct telemetry data to appropriate destinations.&lt;/p&gt;&lt;p&gt;Below in the figure you see the phases of a telemetry pipeline. Routing happens throughout the pipeline but is most evident in the final output phase, where we decide which processed events go to which destinations.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8tJQQv8Ajm7I-jnhpp0xemB2ETtl3PTjIgNq_MDF27kPuOy0olPwFV-ogWk-Sp_C4Y1-P4bjRW2DRUsepBVqzIID57qv-5cGmY3FiDC1CmeDfUu_2aSYuyh-3cGfPWzl-XB1GcaEu_xXwx79cXiOHjhJGP3IS_pKe3wpMIe2W3G-9PC-urE1T8_78nfU/s960/DIAGRAMS%20-%20Monitoring%20Architecture%20Diagrams.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8tJQQv8Ajm7I-jnhpp0xemB2ETtl3PTjIgNq_MDF27kPuOy0olPwFV-ogWk-Sp_C4Y1-P4bjRW2DRUsepBVqzIID57qv-5cGmY3FiDC1CmeDfUu_2aSYuyh-3cGfPWzl-XB1GcaEu_xXwx79cXiOHjhJGP3IS_pKe3wpMIe2W3G-9PC-urE1T8_78nfU/w640-h360/DIAGRAMS%20-%20Monitoring%20Architecture%20Diagrams.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Routing in Fluent Bit determines which events flow to which outputs, and there are two primary routing approaches available to developers:&lt;/p&gt;&lt;h4 style="text-align: left;"&gt;Tag-based routing&lt;/h4&gt;&lt;p&gt;Every event in Fluent Bit carries a tag, and outputs use the &lt;i&gt;match&lt;/i&gt; parameter to subscribe to events with specific tags. Tags are simple strings that act as identifiers for event streams, similar to topics in message queues. This tag-based routing system is the traditional foundation of Fluent Bit's routing capabilities.&lt;/p&gt;&lt;p&gt;Tags typically follow a hierarchical naming convention like &lt;i&gt;app.frontend.logs&lt;/i&gt; or &lt;i&gt;system.metrics.cpu&lt;/i&gt;. This structure makes it easy to create wildcard patterns for flexible matching. The match parameter in outputs supports wildcards: a single asterisk (*) matches any characters at one level, while a double asterisk (**) matches multiple levels of the hierarchy.&lt;/p&gt;&lt;p&gt;For example, a match pattern of &lt;i&gt;app.*&lt;/i&gt; would catch &lt;i&gt;app.logs&lt;/i&gt; and &lt;i&gt;app.metrics&lt;/i&gt;, but not &lt;i&gt;app.frontend.logs&lt;/i&gt;. Meanwhile, &lt;i&gt;app.**&lt;/i&gt; would match all three. This wildcard system provides the flexibility needed for complex routing scenarios while keeping configurations manageable.&lt;/p&gt;&lt;h4 style="text-align: left;"&gt;Conditional routing&lt;/h4&gt;&lt;p&gt;Conditional routing is a newer approach available in Fluent Bit 4.2+ that evaluates individual records and routes them to different outputs based on their content. Unlike tag-based routing which operates on entire data chunks, conditional routing provides per-record routing decisions.&lt;/p&gt;&lt;p&gt;This mechanism uses a routes block defined within input configurations. Each route specifies conditions that determine which records match, and the outputs where matching records should be sent. Conditions can examine any field within the record using comparison operators like equals, greater than, regular expressions, and array membership tests.&lt;/p&gt;&lt;p&gt;Conditional routing is particularly powerful when you need to split logs based on severity levels, route records from different services to dedicated outputs, or implement complex multi-condition routing logic. It provides fine-grained control without requiring filters to modify tags, making your routing configuration more explicit and easier to understand.&lt;/p&gt;&lt;p&gt;The key advantage is that routing decisions are made per-record at the input stage, before any filtering or processing occurs. This enables efficient routing that can send subsets of data to different destinations based on content, without processing or forwarding unnecessary records.&lt;/p&gt;&lt;h4 style="text-align: left;"&gt;Combining routing mechanisms&lt;/h4&gt;&lt;p&gt;In production environments, you rarely send all your telemetry data to a single destination. Different types of logs need different handling. Error logs might go to an alerting system, audit logs to long-term storage, and debug logs might be dropped entirely to save costs.&amp;nbsp;&lt;/p&gt;&lt;p&gt;You can combine both routing approaches in a single configuration. Use tag-based routing for broad categorization by source or input type, and conditional routing for fine-grained decisions based on record content like severity level, error codes, or specific field values. Together, these routing approaches give you complete control over your telemetry pipeline.&lt;/p&gt;&lt;p&gt;Understanding these routing patterns is essential for developers who want to build sophisticated telemetry pipelines that efficiently direct data where it needs to go while minimizing costs and maximizing value.&lt;/p&gt;&lt;p&gt;Now let's look at practical implementations of these routing patterns that developers need to master.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Basic tag-based routing with wildcards&lt;/h3&gt;&lt;p&gt;The traditional routing mechanism in Fluent Bit is the tag-based system. Every input assigns data a human-readable identifier (&lt;i&gt;tag&lt;/i&gt;), and every output uses a &lt;i&gt;match&lt;/i&gt; pattern to select which events it receives. Let's create a configuration that demonstrates basic routing patterns.&lt;/p&gt;&lt;p&gt;First, create a configuration file called &lt;i&gt;fluent-bit.yaml&lt;/i&gt;&amp;nbsp;as follows:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on

pipeline:
  inputs:
    - name: dummy&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit; font-size: 14px;"&gt;      tag: app.frontend.requests&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;      dummy: '{"service":"frontend","level":"info","message":"Request processed"}'&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;    - name: dummy
      tag: app.backend.errors
      dummy: '{"service":"backend","level":"error","message":"Database connection failed"}'
    
    - name: dummy
      tag: system.metrics
      dummy: '{"cpu_usage":75,"memory_usage":60}'&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;
  outputs:
    - name: stdout
      match: app.frontend.*
      format: json_lines
    
    - name: stdout
      match: app.backend.*
      format: json_lines
    
    - name: stdout
      match: system.*
      format: json_lines&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Our configuration creates three different dummy inputs, each with its own tag representing different sources of telemetry data. The tag structure uses a hierarchical naming convention, similar to Java package names or DNS domains, which makes it easy to create wildcard patterns.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;The outputs section shows three stdout outputs, each matching a different tag pattern. The asterisk (*) is a wildcard that matches any characters at that level. This means &lt;i&gt;app.frontend.*&lt;/i&gt; matches any event with a tag starting with &lt;i&gt;app.frontend.&lt;/i&gt;, regardless of what follows.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's run this configuration to see tag-based routing in action:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.2.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;{"date":"2025-12-18 10:15:23.456789","service":"frontend","level":"info","message":"Request processed"}
{"date":"2025-12-18 10:15:24.567890","service":"backend","level":"error","message":"Database connection failed"}
{"date":"2025-12-18 10:15:25.678901","cpu_usage":75,"memory_usage":60}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;Each event is routed to its corresponding output based on the tag match pattern. This basic routing pattern is the foundation for more complex scenarios. Note that we use &lt;i&gt;stdout&lt;/i&gt;&amp;nbsp;for most examples, leaving it to the reader to experiment with other output destinations in their own environment for routing to different destinations.&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;You can also use the double asterisk (**) wildcard to match multiple levels. Let's modify our outputs to demonstrate this:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on

pipeline:
  inputs:
    - name: dummy&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit; font-size: 14px;"&gt;      tag: app.frontend.requests&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;      dummy: '{"service":"frontend","level":"info","message":"Request processed"}'&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;    - name: dummy
      tag: app.backend.errors
      dummy: '{"service":"backend","level":"error","message":"Database connection failed"}'
    
    - name: dummy
      tag: system.metrics
      dummy: '{"cpu_usage":75,"memory_usage":60}'&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;
  outputs:
    - name: stdout
      match: app.**
      format: json_lines&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Running this configuration shows that the single output with &lt;i&gt;app.**&lt;/i&gt; matches both &lt;i&gt;app.frontend.requests&lt;/i&gt; and &lt;i&gt;app.backend.errors&lt;/i&gt;, but not &lt;i&gt;system.metrics&lt;/i&gt;. The double asterisk matches any number of tag levels, making it perfect for catching all events under a hierarchical namespace.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Conditional routing&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;While tag-based routing directs entire chunks of data based on their source, conditional routing evaluates individual records and makes routing decisions based on their content. This feature, available in Fluent Bit 4.2 and greater, uses a routes block within input configurations to define routing rules.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's create a configuration that routes logs to different destinations based on their severity level:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on

pipeline:
  inputs:
    - name: dummy
      tag: app.logs
      dummy: '{"service":"api","level":"ERROR","message":"Failed to connect"}'
      routes:
        logs:
          - name: critical_errors
            condition:
              op: or
              rules:
                - field: "$level"
                  op: eq
                  value: "ERROR"
                - field: "$level"
                  op: eq
                  value: "FATAL"
            to:
              outputs:
                - critical_output
    
    - name: dummy
      tag: app.logs
      dummy: '{"service":"api","level":"INFO","message":"Request completed"}'
      routes:
        logs:
          - name: normal_logs
            condition:
              op: and
              rules:
                - field: "$level"
                  op: eq
                  value: "INFO"
            to:
              outputs:
                - info_output

  outputs:
    - name: stdout
      alias: critical_output
      format: json_lines
    
    - name: stdout
      alias: info_output
      format: json_lines&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;The &lt;i&gt;routes&lt;/i&gt; block is where conditional routing configuration happens. Each route has several key components:&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;name&lt;/b&gt; - A unique identifier for the route&lt;/li&gt;&lt;li&gt;&lt;b&gt;condition&lt;/b&gt; - The logic block that determines which records match&lt;/li&gt;&lt;li&gt;&lt;b&gt;condition.op&lt;/b&gt; - The logical operator (and or or) for combining multiple rules&lt;/li&gt;&lt;li&gt;&lt;b&gt;condition.rules&lt;/b&gt; - An array of rules to evaluate against each record&lt;/li&gt;&lt;li&gt;&lt;b&gt;to.outputs&lt;/b&gt; - The destination outputs (referenced by alias or name) for matching records&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Each rule in the condition.rules array specifies:&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;field&lt;/b&gt;&amp;nbsp;- The field to examine using record accessor syntax (&lt;i&gt;$level&lt;/i&gt;, &lt;i&gt;$service&lt;/i&gt;, etc.)&lt;/li&gt;&lt;li&gt;&lt;b&gt;op&lt;/b&gt; - The comparison operator (&lt;i&gt;eq, neq, gt, lt, gte, lte, regex, not_regex, in, not_in&lt;/i&gt;)&lt;/li&gt;&lt;li&gt;&lt;b&gt;value&lt;/b&gt; - The value to compare against (can be a single value or array for &lt;i&gt;in/not_in&lt;/i&gt; operators)&lt;/li&gt;&lt;li&gt;&lt;b&gt;context&lt;/b&gt; - Optional parameter specifying where to look for the field (&lt;i&gt;body, metadata, otel_resource_attributes&lt;/i&gt;, etc.)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;When a record arrives, Fluent Bit evaluates the conditions for each route in order. Records are sent to outputs whose conditions they match. This allows per-record routing decisions based on the actual content of each log entry.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's run this configuration:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.2.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;{"date":"2025-12-18 10:30:45.123456","service":"api","level":"ERROR","message":"Failed to connect"}
{"date":"2025-12-18 10:30:46.234567","service":"api","level":"INFO","message":"Request completed"}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit; font-size: 14px;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;The &lt;i&gt;ERROR&lt;/i&gt; logs are routed to the &lt;i&gt;critical_output&lt;/i&gt; while &lt;i&gt;INFO&lt;/i&gt; logs go to &lt;i&gt;info_output&lt;/i&gt;, all based on examining the level field in each record.&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;You can also define a default route to catch records that don't match any other conditions:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on

pipeline:
  inputs:
    - name: dummy
      tag: app.logs
      dummy: '{"service":"api","level":"ERROR","message":"Failed to connect"}'
      routes:
        logs:
          - name: error_logs
            condition:
              op: and
              rules:
                - field: "$level"
                  op: eq
                  value: "ERROR"
            to:
              outputs:
                - error_output
          
          - name: default_logs
            condition:
              default: true
            to:
              outputs:
                - default_output

  outputs:
    - name: stdout
      alias: error_output
      format: json_lines
    
    - name: stdout
      alias: default_output
      format: json_lines&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;The route with &lt;i&gt;condition.default: true&lt;/i&gt; acts as a catch-all for any records that don't match the earlier routes.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's create a more complex example that routes based on multiple conditions:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on

pipeline:
  inputs:
    - name: dummy
      tag: app.logs
      dummy: '{"service":"api","level":"ERROR","environment":"production","response_time":6000}'
      routes:
        logs:
          - name: high_priority_errors
            condition:
              op: and
              rules:
                - field: "$level"
                  op: eq
                  value: "ERROR"
                - field: "$environment"
                  op: eq
                  value: "production"
                - field: "$response_time"
                  op: gt
                  value: 5000
            to:
              outputs:
                - critical_output
                - audit_output

          - name: all_other_logs
            condition:
              default: true
            to:
              outputs:
                - general_output

  outputs:
    - name: stdout
      alias: critical_output
      format: json_lines
    
    - name: stdout
      alias: audit_output
      format: json_lines&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;    &lt;/span&gt;&lt;span style="color: #999999; font-family: inherit; font-size: 14.000001px;"&gt;- name: stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size: 14.000001px; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;      alias: general_output
      format: json_lines&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;This configuration uses the &lt;i&gt;and&lt;/i&gt; operator to combine three conditions. Only records that are &lt;i&gt;ERROR&lt;/i&gt; level, from production, &lt;i&gt;AND&lt;/i&gt; have a response time greater than 5000ms will be sent to both the &lt;i&gt;critical_output&lt;/i&gt; and &lt;i&gt;audit_output&lt;/i&gt;. All other records go to &lt;i&gt;general_output&lt;/i&gt;.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's run this configuration:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.2.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;{"date":"2025-12-18 10:45:12.345678","service":"api","level":"ERROR","environment":"production","response_time":6000}
{"date":"2025-12-18 10:45:12.345678","service":"api","level":"ERROR","environment":"production","response_time":6000}
...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;Notice how the high-priority error appears twice in the output because it's being sent to two different outputs (&lt;i&gt;critical_output&lt;/i&gt; and &lt;i&gt;audit_output&lt;/i&gt;).&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;Conditional routing also supports the &lt;i&gt;in&lt;/i&gt; and &lt;i&gt;not_in&lt;/i&gt; operators for matching against arrays of values:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on

pipeline:
  inputs:
    - name: dummy
      tag: app.logs
      dummy: '{"service":"payment","level":"ERROR","message":"Transaction failed"}'
      routes:
        logs:
          - name: critical_services
            condition:
              op: and
              rules:
                - field: "$service"
                  op: in
                  value: ["payment", "authentication", "database"]
            to:
              outputs:
                - critical_output

          - name: standard_logs
            condition:
              default: true
            to:
              outputs:
                - standard_output

  outputs:
    - name: stdout
      alias: critical_output
      format: json_lines
    
    - name: stdout
      alias: standard_output
      format: json_lines&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;This configuration routes logs from critical services (&lt;i&gt;payment&lt;/i&gt;, &lt;i&gt;authentication&lt;/i&gt;, &lt;i&gt;database&lt;/i&gt;) to a dedicated output, while all other services go to standard output. The in operator makes it easy to match against multiple values without creating separate rules for each one.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Advanced routing with regular expressions and nested tags&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's look at advanced routing which we can implement using tag-based fan-out, where a single event is sent to multiple destinations by having multiple outputs with overlapping match patterns:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on

pipeline:
  inputs:
    - name: dummy
      tag: prod.svc.auth.logs
      dummy: '{"service":"auth","environment":"production","level":"ERROR","message":"Token validation failed"}'

  outputs:
    - name: stdout
      match: 'prod.**'
      format: json_lines
      
    - name: stdout
      match_regex: '.*\.auth\..*'
      format: json_lines
    
    - name: stdout
      match: '**.logs'
      format: json_lines&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Running this configuration shows that the single input event matches all three output patterns:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.2.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;{"date":"2025-12-18 11:15:45.567890","service":"auth","environment":"production","level":"ERROR","message":"Token validation failed"}
{"date":"2025-12-18 11:15:45.567890","service":"auth","environment":"production","level":"ERROR","message":"Token validation failed"}
{"date":"2025-12-18 11:15:45.567890","service":"auth","environment":"production","level":"ERROR","message":"Token validation failed"}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;The event appears three times because it matches:&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;i&gt;prod.**&lt;/i&gt; (production environment)&lt;/li&gt;&lt;li&gt;&lt;i&gt;.*\.auth\..*&lt;/i&gt; (auth service)&lt;/li&gt;&lt;li&gt;&lt;i&gt;**.logs&lt;/i&gt; (logs data type)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;This fan-out pattern is essential for implementing multi-destination routing without duplicating configuration or using additional filters.&lt;/p&gt;&lt;h4 style="text-align: left;"&gt;Important routing considerations&lt;/h4&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;When implementing routing in your Fluent Bit pipelines, keep these important points in mind:&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Design tag structure carefully&lt;/b&gt; - Tags are the backbone of your routing strategy. Use hierarchical naming with clear levels that represent environment, service type, service name, and data type. This makes it easy to create flexible match patterns.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Be aware of ordering&lt;/b&gt; - Fluent Bit processes outputs in the order they're defined in the configuration. For most routing scenarios this doesn't matter, but if you're doing advanced processing or using filters that depend on routing results, order can be significant.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Use match patterns efficiently&lt;/i&gt; - While you can create many specific outputs with exact tag matches, it's often more maintainable to use wildcard patterns and fewer outputs. Balance specificity with simplicity.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Consider performance implications&lt;/b&gt; - Every output adds overhead. If you're routing to many destinations, test the performance impact and consider whether you can consolidate outputs or use features like tag-based fan-out more efficiently.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Test your routing logic&lt;/b&gt; - Use the stdout output during development to verify that events are being routed as expected. It's easy to make mistakes with wildcard patterns, and seeing the actual output helps catch routing errors early.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Document your routing patterns&lt;/b&gt; - Complex routing configurations can be difficult to understand months later. Add comments explaining your tag structure and routing logic to help future maintainers.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;This covers the essential routing patterns that developers need to master when building Fluent Bit telemetry pipelines for their applications.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;More in the series&lt;/h3&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;In this article you learned how to implement simple and more sophisticated routing patterns in Fluent Bit using tags, wildcards, and content-based routing. This article is based on this &lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit" rel="nofollow" target="_blank"&gt;online free workshop&lt;/a&gt;, see the lab for advanced telemetry routing.&lt;/p&gt;&lt;p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"&gt;There will be more in this series as you continue to learn how to configure, run, manage, and master the use of Fluent Bit in the wild. Next up, exploring Fluent Bit &lt;a href="https://www.schabell.org/2026/01/mastering-fluentbit-developers-guide-to-routing-metrics-to-prometheus.html" rel="nofollow" target="_blank"&gt;routing metrics telemetry data to Prometheus&lt;/a&gt;.&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4ntAHGgfC4WGIz6LJ1ahBJibbv6SqlC4ZS9SG8OYW_RONjqt-IkaEyuDS4YBdkUjWewB8qYWb3G7LLcZwlFnfTriZwYBfOJfi-89cP4ko4hiIriQpaFQKkyQoN9eRrWTy0TgpPniB-a2nND85MpGjRjE0wzKe8rfi0eg6ZnCYXJxreiP3caSSLfZrWYY/s72-c/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>Mastering Fluent Bit: Top 3 Telemetry Pipeline Filters for Developers</title><link>http://www.schabell.org/2025/11/mastering-fluentbit-top-3-telemetry-pipeline-filters-for-developers.html</link><category>Cloud</category><category>Cloud Data</category><category>Cloud Native</category><category>Containers</category><category>Fluent Bit</category><category>Mastering Fluent Bit</category><category>Observability</category><pubDate>Wed, 26 Nov 2025 07:00:00 +0100</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-7573432245662507263</guid><description>&lt;p&gt;&lt;/p&gt;&lt;p style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="Mastering Fluent Bit Blog Series" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirvNfeP2EQLZDrHRbWIPI-Fyt7WXffVCl7U85phmE5AOCG-YgrGQuxLN4xQLnRRJQJhSim1XD4gdCm1YlLIUknOJt3wYI-jNDaAJRT5hoLE_YCgOP6_g1mYPyp-nQ-b7eXnD91tYtRXO44XIf0AufbzcKM_ir_CcWfokHs_ElfiKRgisOhxGdDUzCsOGY/w400-h225/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="400" /&gt;&lt;/p&gt;&lt;span style="font-family: inherit;"&gt;This series is a general purpose getting started guide for those of us wanting to learn about the Cloud Native Computing Foundation (CNCF) project Fluent Bit.&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Each article in this series addresses a single topic by providing insights into what the topic is, why we are interested in exploring that topic, where to get started with the topic, and how to get hands-on with learning about the topic as it relates to the Fluent Bit project.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;The idea is that each article can stand on its own, but that they also lead down a path that slowly increases our abilities to implement solutions with Fluent Bit telemetry pipelines.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Let's take a look at the topic of this article, using Fluent Bit filters for developers. In case you missed the previous article, check out&amp;nbsp;&lt;a href="https://www.schabell.org/2025/11/mastering-fluentbit-3-tips-for-telemetry-pipeline-multiline-parsers-for-developers.html"&gt;three tips for using telemetry pipeline multiline parsers&lt;/a&gt;&amp;nbsp;where you explore how to handle complex multiline log messages.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;This article will be a hands-on exploration of &lt;i&gt;filters&lt;/i&gt; that help you as a developer testing out your Fluent Bit pipelines. We'll take a look at the top three filters you'll want to know about when building your telemetry pipeline configurations in Fluent Bit.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;All examples in this article have been done on OSX and are assuming the reader is able to convert the actions shown here to their own local machines.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Where to get started&lt;/h3&gt;&lt;p&gt;You should have explored the previous articles in this series to install and get started with Fluent Bit on your developer local machine, either using&amp;nbsp;&lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-from-source.html"&gt;the source code&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-and-configuring-using-contianer-images.html"&gt;container images&lt;/a&gt;. Links at the end of this article will point you to a free hands-on workshop that lets you explore more of Fluent Bit in detail.&lt;/p&gt;&lt;p&gt;You can verify that you have a functioning installation by testing your Fluent Bit, either using a source installation or a container installation as shown below:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; caret-color: rgb(68, 68, 68); color: #444444; font-family: inherit; font-size: 14px; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run -ti ghcr.io/fluent/fluent-bit:4.0.8 -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;...&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;[0] dummy.0: [[1753105021.031338000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105022.033205000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105023.032600000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105024.033517000, {}], {"message"=&amp;gt;"dummy"}]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's look at the top three filters that will help you with your local development testing of Fluent Bit pipelines.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Filtering in a telemetry pipeline&lt;/h3&gt;&lt;p&gt;See&amp;nbsp;&lt;a href="https://www.schabell.org/2025/07/mastering-fluent-bit-developer-guide-to-service-section-config.html"&gt;this article for details&lt;/a&gt;&amp;nbsp;about the service section of the configurations used in the rest of this article, but for now we plan to focus on our Fluent Bit pipeline and specifically the&amp;nbsp;&lt;em&gt;filters&lt;/em&gt;&amp;nbsp;that can be of great help in managing our telemetry data during testing in our inner developer loop.&lt;/p&gt;&lt;p&gt;Below in the figure you see the phases of a telemetry pipeline. The third phase is&amp;nbsp;&lt;em&gt;filter&lt;/em&gt;, which is where we can modify, enrich, or drop records based on specific criteria.&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMy-5Z9oEWRRzYZqma4BJbzZ94dH60ZzzMTtaCGbuQG12Y7knIv7IVA5BG_opufoZl1_OPU4jELEFg6WIHl-O4CeA-PiSqy65i9drf7-jQ4VZ4KKB5FNe1yjbyl26K8DnBb5X25WTIc7T6wMp-vrHgnJb67cYVgUNFZOSaftbuXiVqJslLuo5CkJf-tN8/s960/DIAGRAMS%20-%20Monitoring%20Architecture%20Diagrams.png" imageanchor="1"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMy-5Z9oEWRRzYZqma4BJbzZ94dH60ZzzMTtaCGbuQG12Y7knIv7IVA5BG_opufoZl1_OPU4jELEFg6WIHl-O4CeA-PiSqy65i9drf7-jQ4VZ4KKB5FNe1yjbyl26K8DnBb5X25WTIc7T6wMp-vrHgnJb67cYVgUNFZOSaftbuXiVqJslLuo5CkJf-tN8/w640-h360/DIAGRAMS%20-%20Monitoring%20Architecture%20Diagrams.png" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Filters in Fluent Bit are powerful tools that operate on records after they've been parsed but before they reach their destination. Unlike processors that work on raw data streams, filters work on structured records, giving you the ability to manipulate individual fields, add metadata, remove sensitive information, or exclude records entirely based on conditions.&lt;/p&gt;&lt;p&gt;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. Each available filter can be used to match, exclude, or enrich your logs with specific metadata. Fluent Bit supports many filters, and understanding the most useful ones will dramatically improve your development experience.&lt;/p&gt;&lt;p&gt;Now let's look at the most interesting filters that developers will want to know more about.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;1. Modify filter&lt;/h3&gt;&lt;p&gt;One of the most versatile filters for telemetry pipelines that developers will encounter is the Modify filter. The Modify filter allows you to change records using rules and conditions, giving you the power to add new fields, rename existing ones, remove unwanted data, and conditionally manipulate your telemetry based on specific criteria.&lt;/p&gt;&lt;p&gt;To provide an example we start by creating a test configuration file called&amp;nbsp;&lt;em&gt;fluent-bit.yaml&lt;/em&gt;&amp;nbsp;that demonstrates the Modify filter's capabilities:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on

pipeline:
  inputs:
    - name: dummy
      tag: app.logs&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;      dummy: '{"environment":"dev","level":"info","message":"Application started","memory_mb":512}'

  filters:
    - name: modify
      match: '*'
      add:
        - service_name my-application
        - version 1.2.3
        - processed true
      rename:
        - environment env
        - memory_mb mem_usage
      remove:
        - level

  outputs:
    - name: stdout
      match: '*'
      format: json_lines&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Our configuration uses the&amp;nbsp;&lt;em&gt;modify&lt;/em&gt;&amp;nbsp;filter with several different operations. The&amp;nbsp;&lt;em&gt;add&lt;/em&gt;&amp;nbsp;operation inserts new fields into the record. This is extremely useful for adding metadata that your observability backend expects, such as service names, versions, or deployment information. The&amp;nbsp;&lt;em&gt;rename&lt;/em&gt;&amp;nbsp;operation changes field names to match your preferred naming conventions or to comply with backend requirements. The&amp;nbsp;&lt;em&gt;remove&lt;/em&gt;&amp;nbsp;operation strips out fields you don't want to send to your destination, which can reduce storage costs and improve query performance.&lt;/p&gt;&lt;p&gt;Let's run this configuration to see the &lt;i&gt;Modify filter&lt;/i&gt; in action:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;{"date":"2025-12-05 14:23:45.678901","env":"dev","message":"Application started","mem_usage":512,"service_name":"my-application","version":"1.2.3","processed":"true"}
{"date":"2025-12-05 14:23:46.789012","env":"dev","message":"Application started","mem_usage":512,"service_name":"my-application","version":"1.2.3","processed":"true"}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Notice how the output has been transformed?&amp;nbsp;&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;The original&amp;nbsp;&lt;em&gt;environment&lt;/em&gt;&amp;nbsp;field is now&amp;nbsp;&lt;em&gt;env&lt;/em&gt;,&amp;nbsp;&lt;em&gt;memory_mb&lt;/em&gt;&amp;nbsp;is now&amp;nbsp;&lt;em&gt;mem_usage&lt;/em&gt;, the&amp;nbsp;&lt;em&gt;level&lt;/em&gt;&amp;nbsp;field has been removed entirely, and we've added three new fields:&amp;nbsp;&lt;em&gt;service_name&lt;/em&gt;,&amp;nbsp;&lt;em&gt;version&lt;/em&gt;, and&amp;nbsp;&lt;em&gt;processed&lt;/em&gt;. This kind of transformation is essential when you're working with multiple services that produce logs in different formats but need to be standardized before sending to your observability backend.&lt;/p&gt;&lt;p&gt;The &lt;i&gt;Modify filter&lt;/i&gt; also supports conditional operations using the&amp;nbsp;&lt;em&gt;Condition&lt;/em&gt;&amp;nbsp;parameter. This allows you to apply modifications only when specific criteria are met. Let's extend our example to demonstrate conditional modifications:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on
&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;pipeline:
  inputs:
    - name: dummy
      tag: app.logs
      dummy: '{"environment":"production","level":"error","message":"Database connection failed","response_time":5000}'

    - name: dummy
      tag: app.logs
      dummy: '{"environment":"dev","level":"info","message":"Request processed","response_time":150}'

  filters:
    - name: modify
      match: '*'
      condition:
        - key_value_equals environment production
      add:
        - priority high
        - alert true

    - name: modify
      match: '*'
      condition:
        - key_value_equals level error
      add:
        - severity critical
&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;
  outputs:
    - name: stdout
      match: '*'
      format: json_lines&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's run this configuration:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;{"date":"2025-12-05 14:30:12.345678","environment":"production","level":"error","message":"Database connection failed","response_time":5000,"priority":"high","alert":"true","severity":"critical"}
{"date":"2025-12-05 14:30:13.456789","environment":"dev","level":"info","message":"Request processed","response_time":150}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;The first record matches both conditions (production environment AND error level), so it gets&amp;nbsp;&lt;em&gt;priority&lt;/em&gt;,&amp;nbsp;&lt;em&gt;alert&lt;/em&gt;, and&amp;nbsp;&lt;em&gt;severity&amp;nbsp;&lt;/em&gt;fields added. The second record doesn't match any conditions, so it passes through unchanged.&amp;nbsp;&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;This conditional logic is incredibly powerful for implementing routing rules, prioritizing certain types of logs, or adding context based on the content of your telemetry data.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;2. Grep filter&lt;/h3&gt;&lt;p&gt;Another essential filter that developers need in their telemetry toolkit is the &lt;i&gt;Grep filter&lt;/i&gt;. The &lt;i&gt;Grep filter&lt;/i&gt; allows you to match or exclude specific records based on regular expression patterns, giving you fine-grained control over which events flow through your pipeline. This is particularly useful during development when you want to focus on specific types of logs or exclude noisy events that aren't relevant to your current debugging session.&lt;/p&gt;&lt;p&gt;To demonstrate the power of the Grep filter, let's create a configuration that filters application logs:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on
&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;pipeline:
  inputs:
    - name: dummy
      tag: app.logs
      dummy: '{"level":"DEBUG","message":"Processing request 12345","service":"api"}'

    - name: dummy
      tag: app.logs
      dummy: '{"level":"ERROR","message":"Failed to connect to database","service":"api"}'

    - name: dummy
      tag: app.logs
      dummy: '{"level":"INFO","message":"Request completed successfully","service":"api"}'

    - name: dummy
      tag: app.logs
      dummy: '{"level":"WARN","message":"High memory usage detected","service":"api"}'

  filters:
    - name: grep
      match: '*'
      regex:
        - level ERROR|WARN
&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;
  outputs:
    - name: stdout
      match: '*'
      format: json_lines&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Our configuration uses the&amp;nbsp;&lt;em&gt;grep&lt;/em&gt;&amp;nbsp;filter with a&amp;nbsp;&lt;em&gt;regex&lt;/em&gt;&amp;nbsp;parameter to keep only records where the&amp;nbsp;&lt;em&gt;level&lt;/em&gt;&amp;nbsp;field matches either &lt;i&gt;ERROR&lt;/i&gt; or &lt;i&gt;WARN&lt;/i&gt;. This kind of filtering is invaluable when you're troubleshooting production issues and need to focus on problematic events while ignoring routine informational logs.&lt;/p&gt;&lt;p&gt;Let's run this configuration:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;{"date":"2025-12-05 15:10:23.456789","level":"ERROR","message":"Failed to connect to database","service":"api"}
{"date":"2025-12-05 15:10:24.567890","level":"WARN","message":"High memory usage detected","service":"api"}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Notice that only the &lt;i&gt;ERROR&lt;/i&gt; and &lt;i&gt;WARN&lt;/i&gt; level logs appear in the output. The &lt;i&gt;DEBUG&lt;/i&gt; and &lt;i&gt;INFO&lt;/i&gt; logs have been filtered out completely. This dramatically reduces the volume of logs you need to process during development and testing.&lt;/p&gt;&lt;p&gt;The &lt;i&gt;Grep filter&lt;/i&gt; also supports excluding records using the&amp;nbsp;&lt;em&gt;exclude&lt;/em&gt;&amp;nbsp;parameter. Let's modify our configuration to demonstrate this:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on
&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;pipeline:
  inputs:
    - name: dummy
      tag: app.logs
      dummy: '{"message":"User login successful","user":"alice@example.com"}'

    - name: dummy
      tag: app.logs
      dummy: '{"message":"Health check passed","endpoint":"/health"}'

    - name: dummy
      tag: app.logs
      dummy: '{"message":"Database query executed","query":"SELECT * FROM users"}'

    - name: dummy
      tag: app.logs
      dummy: '{"message":"Metrics endpoint called","endpoint":"/metrics"}'

  filters:
    - name: grep
      match: '*'
      exclude:
        - message /health|/metrics
&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;
  outputs:
    - name: stdout
      match: '*'
      format: json_lines&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's run this updated configuration:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;{"date":"2025-12-05 15:20:34.567890","message":"User login successful","user":"alice@example.com"}
{"date":"2025-12-05 15:20:35.678901","message":"Database query executed","query":"SELECT * FROM users"}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;The health check and metrics endpoint logs have been excluded from the output. This is extremely useful for filtering out routine monitoring traffic that generates high volumes of logs but provides little value during debugging. By combining&amp;nbsp;&lt;em&gt;regex&lt;/em&gt;&amp;nbsp;to include specific patterns and&amp;nbsp;&lt;em&gt;exclude&lt;/em&gt;&amp;nbsp;to filter out unwanted patterns, you can create sophisticated filtering rules that give you exactly the logs you need.&lt;/p&gt;&lt;p&gt;An important note about the &lt;i&gt;Grep filter&lt;/i&gt; is that it supports matching nested fields using the record accessor format. For example, if you have JSON logs with nested structures like&amp;nbsp;&lt;code&gt;{"kubernetes":{"pod_name":"my-app-123"}}&lt;/code&gt;, you can use&amp;nbsp;&lt;code&gt;$kubernetes['pod_name']&lt;/code&gt;&amp;nbsp;as the key to match against nested values.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;3. Record Modifier filter&lt;/h3&gt;&lt;p&gt;The third essential filter for developers is the &lt;i&gt;Record Modifier filter&lt;/i&gt;. While the &lt;i&gt;Modify filter&lt;/i&gt; focuses on adding, renaming, and removing fields using static values, the &lt;i&gt;Record Modifier filter&lt;/i&gt; excels at appending fields with dynamic values such as environment variables and removing or allowing specific keys using pattern matching. This makes it ideal for injecting runtime context into your logs.&lt;/p&gt;&lt;p&gt;Let's create a configuration that demonstrates the &lt;i&gt;Record Modifier filter&lt;/i&gt;:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on
&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;pipeline:
  inputs:
    - name: dummy
      tag: app.logs
      dummy: '{"message":"Application event","request_id":"req-12345","response_time":250,"internal_debug":"sensitive data","trace_id":"trace-abc"}'

  filters:
    - name: record_modifier
      match: '*'
      record:
        - hostname ${HOSTNAME}
        - pod_name ${POD_NAME}
        - namespace ${NAMESPACE}
      remove_key:
        - internal_debug
&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;
  outputs:
    - name: stdout
      match: '*'
      format: json_lines&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Our configuration uses the&amp;nbsp;&lt;em&gt;record_modifier&lt;/em&gt;&amp;nbsp;filter with several powerful features. The&amp;nbsp;&lt;em&gt;record&lt;/em&gt;&amp;nbsp;parameter adds new fields with values from environment variables. This is incredibly useful in containerized environments where hostname, pod names, and namespace information are available as environment variables but need to be injected into your logs for proper correlation and filtering in your observability backend. The&amp;nbsp;&lt;em&gt;remove_key&lt;/em&gt;&amp;nbsp;parameter strips out sensitive fields that shouldn't be sent to your logging destination.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's run this configuration with some environment variables set:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm \
  -e HOSTNAME=dev-server-01 \
  -e POD_NAME=my-app-pod-abc123 \
  -e NAMESPACE=production \
  fb

...
{"date":"2025-12-05 16:15:45.678901","message":"Application event","request_id":"req-12345","response_time":250,"trace_id":"trace-abc","hostname":"dev-server-01","pod_name":"my-app-pod-abc123","namespace":"production"}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Notice how the environment variables have been injected into the log record, and the&amp;nbsp;&lt;em&gt;internal_debug&lt;/em&gt;&amp;nbsp;field has been removed. This pattern is essential for enriching your logs with contextual information that helps you understand where the logs originated in your distributed system.&lt;/p&gt;&lt;p&gt;The &lt;i&gt;Record Modifier&lt;/i&gt; filter also supports the&amp;nbsp;&lt;em&gt;allowlist_key&lt;/em&gt;&amp;nbsp;parameter (and its legacy alias&amp;nbsp;&lt;em&gt;whitelist_key&lt;/em&gt;), which works inversely to&amp;nbsp;&lt;em&gt;remove_key&lt;/em&gt;. Instead of specifying which fields to remove, you specify which fields to keep, and all others are removed:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on
&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;pipeline:
  inputs:
    - name: dummy
      tag: app.logs
      dummy: '{"message":"User action","user_id":"12345","email":"user@example.com","password_hash":"abc123","session_token":"xyz789","action":"login","timestamp":"2025-12-05T16:20:00Z"}'

  filters:
    - name: record_modifier
      match: '*'
      allowlist_key:
        - message
        - user_id
        - action
        - timestamp
&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;
  outputs:
    - name: stdout
      match: '*'
      format: json_lines&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's run this configuration:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;{"date":"2025-12-05 16:20:01.234567","message":"User action","user_id":"12345","action":"login","timestamp":"2025-12-05T16:20:00Z"}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;The sensitive fields (&lt;em&gt;email&lt;/em&gt;,&amp;nbsp;&lt;em&gt;password_hash&lt;/em&gt;,&amp;nbsp;&lt;em&gt;session_token&lt;/em&gt;) have been completely stripped out, leaving only the allowlisted fields. This approach is particularly useful when you're dealing with logs that might contain sensitive information and you want to take a cautious approach by explicitly defining what's safe to send to your logging backend.&lt;/p&gt;&lt;p&gt;Another powerful feature of the &lt;i&gt;Record Modifier filter&lt;/i&gt; is the ability to generate UUIDs for each record. This is invaluable for tracking and correlating individual log entries across your distributed system:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on
&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;pipeline:
  inputs:
    - name: dummy
      tag: app.logs
      dummy: '{"message":"Processing request","service":"api"}'

  filters:
    - name: record_modifier
      match: '*'
      uuid_key: event_id
&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;
  outputs:
    - name: stdout
      match: '*'
      format: json_lines&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;When you run this configuration, each record will have a unique&amp;nbsp;&lt;em&gt;event_id&lt;/em&gt;&amp;nbsp;field added automatically, making it easy to reference specific log entries in your observability tools.&lt;/p&gt;&lt;p&gt;This covers the top three filters for developers getting started with Fluent Bit while trying to transform and filter their telemetry data effectively and speed up their inner development loop.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;More in the series&lt;/h3&gt;&lt;p&gt;In this article you learned about three powerful Fluent Bit filters that improve the inner developer loop experience. This article is based on this&amp;nbsp;&lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit"&gt;online free workshop&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;There will be more in this series as you continue to learn how to configure, run, manage, and master the use of Fluent Bit in the wild. Next up, exploring Fluent Bit &lt;i&gt;routing&lt;/i&gt;&amp;nbsp;as there are new ways to for developers to leverage this feature.&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirvNfeP2EQLZDrHRbWIPI-Fyt7WXffVCl7U85phmE5AOCG-YgrGQuxLN4xQLnRRJQJhSim1XD4gdCm1YlLIUknOJt3wYI-jNDaAJRT5hoLE_YCgOP6_g1mYPyp-nQ-b7eXnD91tYtRXO44XIf0AufbzcKM_ir_CcWfokHs_ElfiKRgisOhxGdDUzCsOGY/s72-w400-h225-c/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>Mastering Fluent Bit: 3 Tips for Telemetry Pipeline Multiline Parsers for Developers</title><link>http://www.schabell.org/2025/11/mastering-fluentbit-3-tips-for-telemetry-pipeline-multiline-parsers-for-developers.html</link><category>Cloud</category><category>Cloud Data</category><category>Cloud Native</category><category>Containers</category><category>Fluent Bit</category><category>Mastering Fluent Bit</category><category>Observability</category><pubDate>Thu, 20 Nov 2025 07:00:00 +0100</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-1417152326271839530</guid><description>&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggKxxVy7yeMxPSFuqpZpwXvkreDJ8QFbhE5Z0NgGZKMfjlwPI3TZY8KTJ4_A_dEby34f7jK1EpD_rpBt8f7cpKGaXyUJuOwc4eyQLEwAsFUmGEontsXYB8-KoVNGxoMbjTKGzzzc4AxDsXRF0oYwYtUWL8CAAhOA6-mC6dkY836OwB3nM6BUlOCO6CjiE/s960/Mastering%20Fluent%20Bit%20Blog%20Series.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggKxxVy7yeMxPSFuqpZpwXvkreDJ8QFbhE5Z0NgGZKMfjlwPI3TZY8KTJ4_A_dEby34f7jK1EpD_rpBt8f7cpKGaXyUJuOwc4eyQLEwAsFUmGEontsXYB8-KoVNGxoMbjTKGzzzc4AxDsXRF0oYwYtUWL8CAAhOA6-mC6dkY836OwB3nM6BUlOCO6CjiE/s320/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;This series is a general purpose getting started guide for those of us wanting to learn about the Cloud Native Computing Foundation (CNCF) project Fluent Bit.&lt;p&gt;&lt;/p&gt;&lt;p&gt;Each article in this series addresses a single topic by providing insights into what the topic is, why we are interested in exploring that topic, where to get started with the topic, and how to get hands-on with learning about the topic as it relates to the Fluent Bit project.&lt;/p&gt;&lt;p&gt;The idea is that each article can stand on its own, but that they also lead down a path that slowly increases our abilities to implement solutions with Fluent Bit telemetry pipelines.&lt;/p&gt;&lt;p&gt;Let's take a look at the topic of this article, using Fluent Bit multiline parsers for developers. In case you missed the previous article, check out &lt;a href="https://www.schabell.org/2025/12/mastering-fluentbit-top-3-telemetry-pipeline-processors-for-developers.html" rel="nofollow" target="_blank"&gt;using telemetry pipeline processors&lt;/a&gt; where you explore the top three telemetry data processors for developers.&lt;/p&gt;&lt;p&gt;This article will be a dive into parsers that help developer testing of Fluent Bit pipelines when dealing with difficult and long multiline log messages. We'll take a look at using multiline parsers for your telemetry pipeline configuration in Fluent Bit.&lt;/p&gt;&lt;span&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;All examples in this article have been done on OSX and are assuming the reader is able to convert the actions shown here to their own local machines.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Where to get started&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;You should have explored the previous articles in this series to install and get started with Fluent Bit on your developer local machine, either using&amp;nbsp;&lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-from-source.html" rel="nofollow" target="_blank"&gt;the source code&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-and-configuring-using-contianer-images.html" rel="nofollow" target="_blank"&gt;container images&lt;/a&gt;. Links at the end of this article will point you to a free hands-on workshop that lets you explore more of Fluent Bit in detail.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;You can verify that you have a functioning installation by testing your Fluent Bit, either using a source installation or a container installation as shown below:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; caret-color: rgb(68, 68, 68); color: #444444; font-family: inherit; font-size: 14px; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run -ti ghcr.io/fluent/fluent-bit:4.0.8 -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;...&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;[0] dummy.0: [[1753105021.031338000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105022.033205000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105023.032600000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105024.033517000, {}], {"message"=&amp;gt;"dummy"}]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's look at the three tips for multiline parsers and how they help you manage complex log entries during your local development testing.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Multiline parsing in a telemetry pipeline&lt;/h3&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;span style="font-family: inherit;"&gt;See&amp;nbsp;&lt;a href="https://www.schabell.org/2025/07/mastering-fluent-bit-developer-guide-to-service-section-config.html" rel="nofollow" target="_blank"&gt;this article&lt;/a&gt;&amp;nbsp;for details about the&amp;nbsp;&lt;i&gt;service&lt;/i&gt;&amp;nbsp;section of the configurations used in the rest of this article, but for now we plan to focus on our Fluent Bit pipeline and specifically the&amp;nbsp;&lt;i&gt;multiline&amp;nbsp;parsers&lt;/i&gt;&amp;nbsp;that can be of great help in managing our telemetry data during testing in our inner developer loop.&lt;/span&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;span style="font-family: inherit;"&gt;Below in the figure you see the phases of a telemetry pipeline. The second phase is&amp;nbsp;&lt;i&gt;parser&lt;/i&gt;, which is where unstructured input data is turned into structured data.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div class="separator" style="caret-color: rgb(68, 68, 68); clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqK6v0eMx3ejBuyW2nhX1Kz6qeao0jNl-bRYwAVROjTxtBZP4ktVmETta0zhgvRsLDLJkq3fULQLFFm505LGE1B2cu3_HzWS8mXSTCxGO4a8EEpSwxLul9sX1m-rbyEfzagXJ6oDUs7CHFRlXvqzicnl2sn8-RuXV1L0gyk-Cs1YS2nEebhuymGtQ92-Y/s960/DIAGRAMS%20-%20Monitoring%20Architecture%20Diagrams%20(1).png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqK6v0eMx3ejBuyW2nhX1Kz6qeao0jNl-bRYwAVROjTxtBZP4ktVmETta0zhgvRsLDLJkq3fULQLFFm505LGE1B2cu3_HzWS8mXSTCxGO4a8EEpSwxLul9sX1m-rbyEfzagXJ6oDUs7CHFRlXvqzicnl2sn8-RuXV1L0gyk-Cs1YS2nEebhuymGtQ92-Y/w640-h360/DIAGRAMS%20-%20Monitoring%20Architecture%20Diagrams%20(1).png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;Note that in this article we explore Fluent Bit using multiline parsers that we can configure to process data in the input of our telemetry pipeline, but this is shown here as a separate phase.&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;The challenge developers often face is that real-world applications don't always log messages on a single line. Stack traces, error messages, and debug output frequently span multiple lines. These multiline messages need to be concatenated before they can be properly parsed and processed.&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;Fluent Bit provides multiline parsers to solve this exact problem. A multiline parser can recognize when multiple lines of log data belong together and concatenate them into a single event before further processing.&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;An example of multiline log data that developers encounter daily would be a Java stack trace:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); color: #444444; font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;Dec 14 06:41:08 Exception in thread "main" java.lang.RuntimeException:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;Something has gone wrong, aborting!&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: black; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;  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)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p style="caret-color: rgb(68, 68, 68); color: #444444; font-family: inherit; font-size: 14px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;Without multiline parsing, each line would be treated as a separate log entry. With multiline parsing, all these lines are correctly concatenated into a single structured event that maintains the complete context of the error.&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;The Fluent Bit multiline parser engine exposes two ways to configure the feature:&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Built-in multiline parsers&lt;/li&gt;&lt;li&gt;Configurable multiline parsers&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;Fluent Bit provides pre-configured built-in parsers for common use cases such as:&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;docker&lt;/b&gt; - Process log entries generated by Docker container engine&lt;/li&gt;&lt;li&gt;&lt;b&gt;cri&lt;/b&gt; - Process log entries generated by CRI-O container engine&lt;/li&gt;&lt;li&gt;&lt;b&gt;go&lt;/b&gt; - Process log entries from Go applications&lt;/li&gt;&lt;li&gt;&lt;b&gt;python&lt;/b&gt; - Process log entries from Python applications&lt;/li&gt;&lt;li&gt;&lt;b&gt;ruby&lt;/b&gt; - Process log entries from Ruby applications&lt;/li&gt;&lt;li&gt;&lt;b&gt;java&lt;/b&gt; - Process log entries from Java applications&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;For cases where the built-in parsers don't fit your needs, you can define custom multiline parsers. These custom parsers use regular expressions and state machines to identify the start and continuation of multiline messages. Let's look at how to configure a custom multiline parser that developers will want to know more about.&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;span style="caret-color: rgb(0, 0, 0);"&gt;Now let's look at the most interesting tips for multiline parsers that developers will want to know more about.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;1. Configurable multiline parser&lt;/h3&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;One of the more common use cases for telemetry pipelines that developers will encounter is dealing with stack traces and error messages that span multiple lines. These multiline messages need special handling to ensure they are concatenated properly before being sent to their destination.&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;To provide an example we start by creating a test log file called &lt;i&gt;test.log&lt;/i&gt; with multiline Java stack trace data:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;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)
    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)
another line...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, let's create a multiline parser configuration. We create a new file called &lt;i&gt;parsers_multiline.yaml&lt;/i&gt; in our favorite editor and add the following configuration:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;parsers:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  - 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&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's break down what this multiline parser does:&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;name&lt;/b&gt; - We give our parser a unique name multiline-regex-test&lt;/li&gt;&lt;li&gt;&lt;b&gt;type&lt;/b&gt; - We specify the type as regex for regular expression based parsing&lt;/li&gt;&lt;li&gt;&lt;b&gt;flush_timeout&lt;/b&gt; - After 1000ms of no new matching lines, the buffer is flushed&lt;/li&gt;&lt;li&gt;&lt;b&gt;rules&lt;/b&gt; - We define the state machine rules that control multiline detection&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;The rules section is where the magic happens. A multiline parser uses states to determine which lines belong together:&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;The &lt;b&gt;start_state&lt;/b&gt; rule matches lines that begin a new multiline message. In our case, the pattern matches a timestamp followed by any text, which identifies the first line of our Java exception.&lt;/li&gt;&lt;li&gt;The &lt;b&gt;cont&lt;/b&gt; (continuation) rule matches lines that are part of the multiline message. Our pattern matches lines starting with whitespace followed by "at", which identifies the stack trace lines.&lt;/li&gt;&lt;li&gt;Each rule specifies a &lt;b&gt;next_state&lt;/b&gt; which tells Fluent Bit what state to transition to after matching. This creates a state machine that can handle complex multiline patterns.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;When the parser sees a line matching &lt;i&gt;start_state&lt;/i&gt;, it begins a new multiline buffer. Any subsequent lines matching the &lt;i&gt;cont&lt;/i&gt; pattern are appended to that buffer. When a line doesn't match either pattern, or when the flush timeout expires, the complete multiline message is emitted as a single event.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Now let's create our main Fluent Bit configuration file &lt;i&gt;fluent-bit.yaml&lt;/i&gt; that uses this multiline parser:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on
  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: '*'&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Note several important configuration points here:&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;We include the &lt;i&gt;parsers_file&lt;/i&gt; in the service section to load our multiline parser definitions&lt;/li&gt;&lt;li&gt;We use the &lt;i&gt;tail&lt;/i&gt; input plugin to read from our test log file&lt;/li&gt;&lt;li&gt;We set &lt;i&gt;read_from_head&lt;/i&gt;: true to read the entire file from the beginning&lt;/li&gt;&lt;li&gt;Most importantly, we specify &lt;i&gt;multiline.parser: multiline-regex-test&lt;/i&gt; to apply our multiline parser&lt;/li&gt;&lt;/ul&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;The multiline parser is applied at the input stage, which is the recommended approach. This ensures that lines are concatenated before any other processing occurs.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's run this configuration to see the multiline parser in action:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;[0] tail.0: [[1750332967.679671000, {}], {"log"=&amp;gt;"single line...
"}]
[1] tail.0: [[1750332967.679677000, {}], {"log"=&amp;gt;"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: [[1750332967.679677000, {}], {"log"=&amp;gt;"another line...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Notice how the output shows three distinct events:&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;/p&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;The single line message passes through unchanged&lt;/li&gt;&lt;li&gt;The entire stack trace is concatenated into one event, preserving the complete error context&lt;/li&gt;&lt;li&gt;The final single line message passes through unchanged&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;This is exactly what we want. The multiline parser successfully identified the start of the Java exception and concatenated all the stack trace lines into a single structured event.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;2. Extracting structured data from multiline messages&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Once you have your multiline messages properly concatenated, you'll often want to extract specific fields from them. Fluent Bit supports this through the parser filter, which can be applied after multiline parsing.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's extend our example to extract the date and message components from the concatenated stack trace. First, we'll add a regular expression parser to our &lt;i&gt;parsers_multiline.yaml&lt;/i&gt; file:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;parsers:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  - 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&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  - name: named-capture-test
    format: regex
    regex: '/^(?&amp;lt;date&amp;gt;[a-zA-Z]+ \d+ \d+\:\d+\:\d+)\s+(?&amp;lt;message&amp;gt;(.|\n)*)$/m'&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;The new &lt;i&gt;named-capture-test&lt;/i&gt; parser uses named capture groups to extract:&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;date&lt;/b&gt; - The timestamp at the start of the message&lt;/li&gt;&lt;li&gt;&lt;b&gt;message&lt;/b&gt; - The remaining content including all newlines&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Note the &lt;i&gt;/m&lt;/i&gt; modifier at the end of the regex, which enables multiline mode where &lt;i&gt;. (dot)&lt;/i&gt;&amp;nbsp;can match newline characters.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Now we update our main configuration to apply this parser using the parser filter:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on
  parsers_file: parsers_multiline.yaml

pipeline:
  inputs:
    - name: tail
      path: test.log
      read_from_head: true
      multiline.parser: multiline-regex-test
&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  filters:
    - name: parser
      match: '*'
      key_name: log
      parser: named-capture-test&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;
  outputs:
    - name: stdout
      match: '*'&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;We've added a parser filter that:&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Matches all events with &lt;i&gt;match: '*'&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Looks at the &lt;i&gt;log&lt;/i&gt; field with &lt;i&gt;key_name: log&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Applies the &lt;i&gt;named-capture-test&lt;/i&gt; parser to extract structured fields&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Running this enhanced configuration produces:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;[0] tail.0: [[1750333602.460984000, {}], {"log"=&amp;gt;"single line...
"}]
[1] tail.0: [[1750333602.460998000, {}], {"date"=&amp;gt;"Dec 14 06:41:08", "message"=&amp;gt;"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: [[1750333602.460998000, {}], {"log"=&amp;gt;"another line...
"}]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Now the multiline Java exception event contains structured fields:&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;i&gt;date&lt;/i&gt; contains the timestamp&lt;/li&gt;&lt;li&gt;&lt;i&gt;message&lt;/i&gt; contains the complete exception and stack trace&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;This structured format makes it much easier to query, analyze, and alert on these error events in your observability backend.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;3. Important considerations for multiline parsers&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;When working with multiline parsers, keep these important points in mind:&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;b&gt;Apply multiline parsing at the input stage&lt;/b&gt; - While you can apply multiline parsing using the multiline filter, the recommended approach is to configure it directly on the input plugin using &lt;i&gt;multiline.parser&lt;/i&gt;. This ensures lines are concatenated before any other processing.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;b&gt;Understand flush timeout behavior&lt;/b&gt; - The &lt;i&gt;flush_timeout&lt;/i&gt; parameter determines how long Fluent Bit waits for additional matching lines before emitting the multiline buffer. Set this value based on your application's logging patterns. Too short and you might break up valid multiline messages. Too long and you'll introduce unnecessary latency.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;b&gt;Use specific state patterns&lt;/b&gt; - Make your regular expressions as specific as possible to avoid false matches. The &lt;i&gt;start_state&lt;/i&gt; pattern should uniquely identify the beginning of a multiline message, and continuation patterns should only match valid continuation lines.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;b&gt;Be aware of resource implications&lt;/b&gt; - Multiline parsers buffer lines in memory until the complete message is ready. For applications with very large multiline messages (like huge stack traces), this can consume significant memory. The multiline parser bypasses the &lt;i&gt;buffer_max_size&lt;/i&gt; limit to ensure complete messages are captured.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;b&gt;Test with real data&lt;/b&gt; - Always test your multiline parser configurations with actual log data from your applications. Edge cases in log formatting can cause unexpected parsing behavior.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;This covers the three tips for developers getting started with Fluent Bit multiline parsers while trying to handle complex multiline log messages and speed up their inner development loop.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;More in the series&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;In this article you learned how to use Fluent Bit multiline parsers to properly handle log messages that span multiple lines. This article is based on this &lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit" rel="nofollow" target="_blank"&gt;online free workshop&lt;/a&gt;.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;There will be more in this series as you continue to learn how to configure, run, manage, and master the use of Fluent Bit in the wild. Next up, exploring some of the more interesting Fluent Bit&amp;nbsp;&lt;i&gt;filters&amp;nbsp;&lt;/i&gt;for developers.&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggKxxVy7yeMxPSFuqpZpwXvkreDJ8QFbhE5Z0NgGZKMfjlwPI3TZY8KTJ4_A_dEby34f7jK1EpD_rpBt8f7cpKGaXyUJuOwc4eyQLEwAsFUmGEontsXYB8-KoVNGxoMbjTKGzzzc4AxDsXRF0oYwYtUWL8CAAhOA6-mC6dkY836OwB3nM6BUlOCO6CjiE/s72-c/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>Mastering Fluent Bit: Top 3 Telemetry Pipeline Processors for Developers</title><link>http://www.schabell.org/2025/12/mastering-fluentbit-top-3-telemetry-pipeline-processors-for-developers.html</link><category>Cloud</category><category>Cloud Data</category><category>Cloud Native</category><category>Containers</category><category>Fluent Bit</category><category>Mastering Fluent Bit</category><category>Observability</category><pubDate>Thu, 13 Nov 2025 07:00:00 +0100</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-1581565090655815773</guid><description>&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjUf94iBdpnqiGg8W_Ms7k85Qp0J4s02T1S3M1zZX9QtZLuMzXOSt92lXfG7pZdzN7oOqdmvz2ZQvlEScU1cDjmSP5HZmlDYOcEcD1Mi3zXHlmeg3dwp5noGTrIHBeOTQUUDio0sEp5KpHy-wo_RRw0gwGEXu-dzwEzZQG2HgwOScA0aD-vBSYdOrovJjQ" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="540" data-original-width="960" height="180" src="https://blogger.googleusercontent.com/img/a/AVvXsEjUf94iBdpnqiGg8W_Ms7k85Qp0J4s02T1S3M1zZX9QtZLuMzXOSt92lXfG7pZdzN7oOqdmvz2ZQvlEScU1cDjmSP5HZmlDYOcEcD1Mi3zXHlmeg3dwp5noGTrIHBeOTQUUDio0sEp5KpHy-wo_RRw0gwGEXu-dzwEzZQG2HgwOScA0aD-vBSYdOrovJjQ" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;This series is a general purpose getting started guide for those of us wanting to learn about the Cloud Native Computing Foundation (CNCF) project Fluent Bit.&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Each article in this series addresses a single topic by providing insights into what the topic is, why we are interested in exploring that topic, where to get started with the topic, and how to get hands-on with learning about the topic as it relates to the Fluent Bit project.&lt;/p&gt;&lt;p&gt;The idea is that each article can stand on its own, but that they also lead down a path that slowly increases our abilities to implement solutions with Fluent Bit telemetry pipelines.&lt;/p&gt;&lt;p&gt;Let's take a look at the topic of this article, using Fluent Bit processors for developers. In case you missed the previous article, check out the &lt;a href="https://www.schabell.org/2025/10/mastering-fluent-bit-top-tip-using-telemetry-pipeline-parsers-for-developers.html" rel="nofollow" target="_blank"&gt;top tips on using telemetry pipeline parsers for developers&lt;/a&gt; where you get tips on cleaning up your telemetry data for better developer experiences.&lt;/p&gt;&lt;p&gt;This article will be a hands-on tour of the things that help you as a developer testing out your Fluent Bit pipelines. We'll take a look at the top 3 processors you'll want to know about when building your telemetry pipeline configurations in Fluent Bit.&lt;/p&gt;&lt;span&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;All examples in this article have been done on OSX and are assuming the reader is able to convert the actions shown here to their own local machines.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Where to get started&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;You should have explored the previous articles in this series to install and get started with Fluent Bit on your developer local machine, either using&amp;nbsp;&lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-from-source.html" rel="nofollow" target="_blank"&gt;the source code&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-and-configuring-using-contianer-images.html" rel="nofollow" target="_blank"&gt;container images&lt;/a&gt;. Links at the end of this article will point you to a free hands-on workshop that lets you explore more of Fluent Bit in detail.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;You can verify that you have a functioning installation by testing your Fluent Bit, either using a source installation or a container installation as shown below:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; caret-color: rgb(68, 68, 68); color: #444444; font-family: inherit; font-size: 14px; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run -ti ghcr.io/fluent/fluent-bit:4.0.8 -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;...&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;[0] dummy.0: [[1753105021.031338000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105022.033205000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105023.032600000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105024.033517000, {}], {"message"=&amp;gt;"dummy"}]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's look at the top three processors that will help you with your local development testing of Fluent Bit pipelines.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Processing in a telemetry pipeline&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;See &lt;a href="https://www.schabell.org/2025/07/mastering-fluent-bit-developer-guide-to-service-section-config.html" rel="nofollow" target="_blank"&gt;this article for details&lt;/a&gt; about the service section of the configurations used in the rest of this article, but for now we plan to focus on our Fluent Bit pipeline and specifically the &lt;i&gt;&lt;a href="https://docs.fluentbit.io/manual/data-pipeline/processors" rel="nofollow" target="_blank"&gt;processors&lt;/a&gt;&lt;/i&gt; that can be of great help in managing our telemetry data during testing in our inner developer loop.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Processors in Fluent Bit are powerful components that sit between the input and output phases of your telemetry pipeline. They allow you to manipulate, transform, and enrich your telemetry data before it reaches its destination. Unlike filters which operate on records, processors work on the raw data stream level, giving you fine-grained control over how your data flows through the pipeline.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;The processor phase happens after data is ingested but before it's formatted for output. This makes processors ideal for operations that need to happen at scale across your entire data stream, such as content modification, metrics extraction, and data aggregation.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Keeping all of this in mind, let's look at the most interesting processors that developers will want to know more about.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;1. Content Modifier processor&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;One of the most common use cases for telemetry pipelines that developers will encounter is the need to add, modify, or remove fields from your telemetry data. The &lt;a href="https://docs.fluentbit.io/manual/data-pipeline/processors/content-modifier" rel="nofollow" target="_blank"&gt;Content Modifier processor&lt;/a&gt; gives you the ability to manipulate the structure and content of your events as they flow through the pipeline.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;To provide an example we start with a simple Fluent Bit configuration file &lt;i&gt;fluent-bit.yaml&lt;/i&gt; containing a configuration using the dummy plugin to generate events that we'll then modify:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on

pipeline:
  inputs:
    - name: dummy
      tag: app.logs
      dummy: '{"environment":"dev","message":"Application started"}'
      
  &lt;b&gt;processors:
    logs:
      - name: content_modifier
        action: insert
        key: pipeline_version
        value: "1.0.0"
        
      - name: content_modifier
        action: insert
        key: processed_timestamp
        value: "${HOSTNAME}"
        
      - name: content_modifier
        action: rename
        renamed_key: env
        key: environment&lt;/b&gt;
        
  outputs:
    - name: stdout
      match: '*'
      format: json_lines
      json_date_format: java_sql_timestamp&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Our configuration uses the &lt;i&gt;content_modifier&lt;/i&gt; processor three times to demonstrate different actions. First, we &lt;i&gt;insert&lt;/i&gt; a new field called &lt;i&gt;pipeline_version&lt;/i&gt; with a static value. Second, we &lt;i&gt;insert&lt;/i&gt; a &lt;i&gt;processed_timestamp&lt;/i&gt; field that references an environment variable. Third, we &lt;i&gt;rename&lt;/i&gt; the &lt;i&gt;environment&lt;/i&gt; field to &lt;i&gt;env&lt;/i&gt; for consistency.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Let's run this to confirm our working test environment:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: black; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: black; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;{"date":"2025-10-26 20:45:12.123456","env":"dev","message":"Application started","pipeline_version":"1.0.0","processed_timestamp":"localhost"}
{"date":"2025-10-26 20:45:13.234567","env":"dev","message":"Application started","pipeline_version":"1.0.0","processed_timestamp":"localhost"}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: black; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Note how each event now contains the additional fields we configured, and the original &lt;i&gt;environment&lt;/i&gt; field has been renamed to &lt;i&gt;env&lt;/i&gt;. This processor is invaluable for standardizing your telemetry data before it reaches your backend systems.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;2. Metrics Selector processor&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Another critical use case for developers working with telemetry data is the ability to extract and select specific metrics from your event streams. The &lt;a href="https://docs.fluentbit.io/manual/data-pipeline/processors/metrics-selector" rel="nofollow" target="_blank"&gt;Metrics Selector processor&lt;/a&gt; allows you to filter and route metrics based on their labels and values, giving you precise control over which metrics flow to which destinations.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;To demonstrate this we'll create a configuration that generates different types of metrics and uses the metrics selector to route them appropriately:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on
&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;pipeline:
  inputs:
    - name: dummy
      tag: metrics.cpu
      dummy: '{"metric":"cpu_usage","value":75.5,"host":"server01","env":"production"}'
      
    - name: dummy
      tag: metrics.memory
      dummy: '{"metric":"memory_usage","value":82.3,"host":"server01","env":"production"}'
      
    - name: dummy
      tag: metrics.disk
      dummy: '{"metric":"disk_usage","value":45.2,"host":"server02","env":"staging"}'
      
  &lt;b&gt;processors:
    logs:
      - name: metrics_selector
        metric_name: cpu_usage
        action: include
        label: env
        operation_type: prefix_match
        match: prod&lt;/b&gt;
        
  outputs:
    - name: stdout
      match: 'metrics.cpu'
      format: json_lines
      json_date_format: java_sql_timestamp
      
    - name: stdout
      match: 'metrics.*'
      format: json_lines
      json_date_format: java_sql_timestamp&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Our configuration generates three different metric types and uses the &lt;i&gt;metrics_selector&lt;/i&gt; processor to filter CPU metrics that match production environments. This allows you to create sophisticated routing rules based on your metric characteristics.&lt;/p&gt;&lt;p&gt;Let's run this configuration:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #999999;"&gt;{"date":"2025-10-26 21:10:33.456789","metric":"cpu_usage","value":75.5,"host":"server01","env":"production"}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="color: #999999;"&gt;{"date":"2025-10-26 21:10:33.567890","metric":"memory_usage","value":82.3,"host":"server01","env":"production"}
&lt;/span&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #999999;"&gt;{"date":"2025-10-26 21:10:33.678901","metric":"disk_usage","value":45.2,"host":"server02","env":"staging"}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;The metrics selector processor helps you focus on the metrics that matter most during development and testing, reducing noise and improving the signal-to-noise ratio in your telemetry data.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;3. OpenTelemetry Envelope processor&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;The third essential processor that developers need to understand is the &lt;a href="https://docs.fluentbit.io/manual/data-pipeline/processors/opentelemetry-envelope" rel="nofollow" target="_blank"&gt;OpenTelemetry Envelope processor&lt;/a&gt;. This processor transforms your Fluent Bit telemetry data into the OpenTelemetry protocol format, enabling seamless integration with the broader OpenTelemetry ecosystem. As organizations increasingly adopt OpenTelemetry as their standard for observability data, this processor becomes critical for ensuring your Fluent Bit pipelines can communicate effectively with OpenTelemetry collectors and backends.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;The &lt;i&gt;OpenTelemetry Envelope processor&lt;/i&gt; wraps your telemetry data in the standard OpenTelemetry format, preserving all the semantic conventions and structures that make OpenTelemetry powerful. This includes proper handling of resource attributes, instrumentation scope, and the telemetry signal types that are core to OpenTelemetry.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;For comprehensive coverage of integrating Fluent Bit with OpenTelemetry, I highly recommend exploring these detailed articles:&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;a href="https://dzone.com/articles/telemetry-pipelines-integrating-fluent-bit-with-otel-pt1" rel="nofollow" target="_blank"&gt;Telemetry Pipelines: Integrating Fluent Bit with OpenTelemetry, Part 1&lt;/a&gt; - This article covers the fundamentals of integrating Fluent Bit with OpenTelemetry, including configuration patterns and best practices for getting started.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;&lt;a href="https://dzone.com/articles/integrating-fluent-bit-with-opentelemetry-part-two" rel="nofollow" target="_blank"&gt;Integrating Fluent Bit with OpenTelemetry, Part 2&lt;/a&gt; - This follow-up article dives deeper into advanced integration scenarios, troubleshooting tips, and real-world use cases for production deployments.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;To demonstrate how the &lt;i&gt;OpenTelemetry Envelope processor&lt;/i&gt; works, let's create a configuration that wraps application logs in OpenTelemetry format:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;  flush: 1
  log_level: info
  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on
&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #999999;"&gt;pipeline:
  inputs:
    - name: dummy
      tag: app.logs
      dummy: '{"level":"info","service":"user-api","message":"User login successful","user_id":"12345"}'
      
    - name: dummy
      tag: app.logs
      dummy: '{"level":"error","service":"payment-api","message":"Payment processing failed","transaction_id":"tx-9876"}'
      
 &lt;b&gt; processors:
    logs:
      - name: opentelemetry_envelope
        resource:
          service_name: my-application
          service_version: 1.2.3
          deployment_environment: production
        instrumentation_scope:
          name: fluent-bit
          version: 4.2.0&lt;/b&gt;
        
  outputs:
    - name: stdout
      match: '*'
      format: json_lines
      json_date_format: java_sql_timestamp&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Our configuration uses the &lt;i&gt;opentelemetry_envelope&lt;/i&gt; processor to wrap each log entry with OpenTelemetry metadata. The &lt;i&gt;resource&lt;/i&gt; section adds &lt;i&gt;attributes&lt;/i&gt; that describe the source of the telemetry data, such as the service name and deployment environment. The &lt;i&gt;instrumentation_scope&lt;/i&gt; section identifies the tool that collected the data, which is essential for proper attribution in OpenTelemetry systems.&lt;/p&gt;&lt;p&gt;Let's run this configuration to see the OpenTelemetry envelope in action:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;span style="color: #999999;"&gt;{"date":"2025-10-26 22:15:30.123456","resource":{"service_name":"my-application","service_version":"1.2.3","deployment_environment":"production"},"instrumentation_scope":{"name":"fluent-bit","version":"4.1.0"},"level":"info","service":"user-api","message":"User login successful","user_id":"12345"}
&lt;/span&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #999999;"&gt;{"date":"2025-10-26 22:15:31.234567","resource":{"service_name":"my-application","service_version":"1.2.3","deployment_environment":"production"},"instrumentation_scope":{"name":"fluent-bit","version":"4.1.0"},"level":"error","service":"payment-api","message":"Payment processing failed","transaction_id":"tx-9876"}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;Notice how each log entry now includes the OpenTelemetry resource attributes and instrumentation scope information. This standardized format ensures that when your telemetry data reaches an OpenTelemetry collector or backend, it will be properly categorized and can be correlated with other telemetry signals like traces and metrics from your distributed system.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;This covers the top 3 processors for developers getting started with Fluent Bit while trying to leverage processors to transform and enrich their telemetry data quickly and speed up their inner development loop.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;More in the series&lt;/h3&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;In this article you learned about three powerful Fluent Bit processors that improve the inner developer loop experience. This article is based on this &lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit" rel="nofollow" target="_blank"&gt;online free workshop&lt;/a&gt;.&lt;/p&gt;&lt;p class="font-claude-response-body whitespace-normal break-words"&gt;There will be more in this series as you continue to learn how to configure, run, manage, and master the use of Fluent Bit in the wild. Next up, exploring some of the more interesting &lt;a href="https://www.schabell.org/2025/11/mastering-fluentbit-3-tips-for-telemetry-pipeline-multiline-parsers-for-developers.html" rel="nofollow" target="_blank"&gt;Fluent Bit &lt;i&gt;multiline parsers&amp;nbsp;&lt;/i&gt;for developers&lt;/a&gt;.&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/a/AVvXsEjUf94iBdpnqiGg8W_Ms7k85Qp0J4s02T1S3M1zZX9QtZLuMzXOSt92lXfG7pZdzN7oOqdmvz2ZQvlEScU1cDjmSP5HZmlDYOcEcD1Mi3zXHlmeg3dwp5noGTrIHBeOTQUUDio0sEp5KpHy-wo_RRw0gwGEXu-dzwEzZQG2HgwOScA0aD-vBSYdOrovJjQ=s72-c" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>Cloud Native Rejekts NA 2025 - Expanding Your Toolbox: Beginners Guide to Controlling Kubernetes Logs (slides)</title><link>http://www.schabell.org/2025/11/cloud-native-rejekts-na-2025-beginners-guide-to-controlling-kubernetes-logs-slides.html</link><category>Cloud</category><category>Cloud Native</category><category>conference</category><category>DevOps</category><category>Fluent Bit</category><category>Observability</category><category>Workshops</category><pubDate>Sat, 8 Nov 2025 18:00:00 +0100</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-8685488337759819069</guid><description>&lt;p&gt;&lt;span style="background-color: white; caret-color: rgb(68, 68, 68);"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; color: #444444; font-family: inherit; text-align: center;"&gt;&lt;span style="background-color: white; caret-color: rgb(68, 68, 68);"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRkOen1oef0VDDcT1BZYuYyfEJj0yOPCCDSI7D_Xp5cqT39UcM_pizmbckqH62YbWGxsuSAZ6Y_PJlUaJ4WWS61tyh57hp5pqFp7aJxqOP_FwTT0EsnRSif0hflk5TsViZ1cMS8bymsL6mITm6gap-Ds2x2eqZ8UHloQv_OmgVEbkN6qa4ce4-ys6ChrY/s960/Expanding%20Your%20Toolbox_%20Beginners%20Guide%20to%20Controlling%20Kubernetes%20Logs.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRkOen1oef0VDDcT1BZYuYyfEJj0yOPCCDSI7D_Xp5cqT39UcM_pizmbckqH62YbWGxsuSAZ6Y_PJlUaJ4WWS61tyh57hp5pqFp7aJxqOP_FwTT0EsnRSif0hflk5TsViZ1cMS8bymsL6mITm6gap-Ds2x2eqZ8UHloQv_OmgVEbkN6qa4ce4-ys6ChrY/s320/Expanding%20Your%20Toolbox_%20Beginners%20Guide%20to%20Controlling%20Kubernetes%20Logs.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: white; caret-color: rgb(68, 68, 68);"&gt;&lt;span style="font-family: inherit;"&gt;Today I spoke at the always fun&amp;nbsp;event taking place before KubeCon + CloudNativeCon NA, &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="https://cloud-native.rejekts.io/" rel="nofollow" target="_blank"&gt;Cloud Native Rejekts&lt;/a&gt;&lt;span style="background-color: white; caret-color: rgb(68, 68, 68);"&gt;.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;span style="font-family: inherit;"&gt;Since my transfer from the application development domains to the cloud native observability domain more than three years ago, I've never missed a single CFP for this event. This year it was in another amazing location, The Academy of Medicine in Atlanta, GA.&lt;/span&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;span style="font-family: inherit;"&gt;In the past I've shared&amp;nbsp;&lt;/span&gt;observability&amp;nbsp;&lt;span style="font-family: inherit;"&gt;topics in a&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.schabell.org/2024/11/cloud-native-rejekts-na-meet-the-new-kid-in-the-sandbox-perses-slides.html" rel="nofollow" style="font-family: inherit;" target="_blank"&gt;session on&amp;nbsp;Perses&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;,&amp;nbsp;&lt;/span&gt;&amp;nbsp;a&amp;nbsp;&lt;a href="https://www.schabell.org/2023/04/cloud-native-rejekts-2023-o11y-for-you-and-me-with-opentelemetry-.html" rel="nofollow" target="_blank"&gt;session providing OpenTelemetry insights&lt;/a&gt;, and&amp;nbsp;&lt;span style="font-family: inherit;"&gt;a session on&amp;nbsp;&lt;a href="https://www.schabell.org/2025/03/cloud-native-rejekts-london-mastering-fluent-bit-opentelemetry-slides.html" rel="nofollow" target="_blank"&gt;integrating Fluent Bit with OpenTelemetry&lt;/a&gt;&amp;nbsp;including a live demo. Today I told a cloud native story helping developers gain control of their logs in Kubernetes environments while within their inner development loop.&lt;/span&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white; caret-color: rgb(68, 68, 68);"&gt;&amp;nbsp;Below you will find the session slides, abstract, and&amp;nbsp;&lt;/span&gt;location details&lt;span style="background-color: white; caret-color: rgb(68, 68, 68);"&gt;&amp;nbsp;for this Atlanta based event.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white; caret-color: rgb(68, 68, 68);"&gt;My session focused on Kubernetes logging and how to get some sort of control back as a developer working on applications and just wanting to zoom in on the application they are deploying. Here are the slides:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;

&lt;div align="center"&gt;
  &lt;iframe allowfullscreen="" frameborder="0" height="420" marginheight="0" marginwidth="0" scrolling="no" src="https://www.slideshare.net/slideshow/embed_code/key/pD8eUu7UrnmBVA" style="border-width: 1px; border: var(--border-1) solid #CCC; margin-bottom: 5px; max-width: 100%;" width="510"&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;div&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white; caret-color: rgb(68, 68, 68); color: #444444;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white; caret-color: rgb(68, 68, 68); color: #444444;"&gt;And the abstract for the talk:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68); color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px;"&gt;&lt;/p&gt;&lt;h3 style="caret-color: rgb(68, 68, 68); color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; margin: 0px; position: relative;"&gt;&lt;a href="https://cfp.cloud-native.rejekts.io/cloud-native-rejekts-atlanta-na-atlanta-2025/talk/BSVWYC/" rel="nofollow" target="_blank"&gt;Expanding Your Toolbox: Beginners Guide to Controlling Kubernetes Logs&lt;/a&gt;&lt;/h3&gt;&lt;p style="caret-color: rgb(68, 68, 68); color: #444444;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;i&gt;Drowning in logs from your Kubernetes clusters? Struggling to scale observability without overwhelming your telemetry systems? You're not alone—and there's a better way. In this talk, you’ll learn how to efficiently manage and streamline logging data from source to destination using telemetry pipelines.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68); color: #444444;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;i&gt;We’ll walk through the key stages of a modern telemetry pipeline—collection, parsing, filtering, routing, and forwarding—demonstrating how to build powerful, flexible pipelines that can handle logs from any source to any destination. Along the way, you’ll see a live demo in a real Kubernetes environment, where we’ll deploy your first telemetry pipeline tailored to a real-world use case.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68); color: #444444;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;i&gt;Whether you're debugging production issues, operating multi-tenant clusters, or just trying to cut through the noise, this session will give you the tools and patterns you need to simplify and scale log collection. Plus, you’ll get access to a self-paced, hands-on workshop to continue exploring after the session: o11y-workshops.gitlab.io/workshop-fluentbit.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68); color: #444444;"&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68); color: #444444;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;i&gt;This talk includes a 15-minute live demo showcasing key integration phases:&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68); color: #444444;"&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;i&gt;Deploying a real workload: Start with a Kubernetes cluster running a real application (a CMS) that generates log data.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCRZm2XnFzA4ASiVbEhjZ_T9McO98c-t9dRkpn8vp8g91LuWniWX09jJgb1MPY5xhKcXoeS16hDZ0MFrtxjZ2msvGxViuEtGz4uw5uqVKEFHad5oIWggejyBqvOuEMc3F2ZJgCAy23eLhTXJonl-xLsYoIracmpdpORozjOEXA_niNDoSXvDWkK2bpBJk/s959/Screenshot%202025-08-28%20at%2010.57.03.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" data-original-height="838" data-original-width="959" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCRZm2XnFzA4ASiVbEhjZ_T9McO98c-t9dRkpn8vp8g91LuWniWX09jJgb1MPY5xhKcXoeS16hDZ0MFrtxjZ2msvGxViuEtGz4uw5uqVKEFHad5oIWggejyBqvOuEMc3F2ZJgCAy23eLhTXJonl-xLsYoIracmpdpORozjOEXA_niNDoSXvDWkK2bpBJk/s320/Screenshot%202025-08-28%20at%2010.57.03.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: inherit;"&gt;&lt;i&gt;Installing a telemetry pipeline: Deploy a telemetry pipeline to the cluster to begin streaming logs from all containers.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;i&gt;Streaming to an output: Route collected logs to an external destination for analysis or storage.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;i&gt;Optimizing log volume: Refine the pipeline to filter out noisy or unnecessary logs—reducing telemetry costs and improving signal-to-noise ratio.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;&lt;i&gt;Filtering logs: Enrich logs with metadata, isolate error-level telemetry, and ensure only the necessary logs (e.g., error logs from the CMS) are exported securely from the cluster.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68); color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px;"&gt;&lt;i&gt;Date: 8 Nov 2025&lt;/i&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68); color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px;"&gt;&lt;i&gt;Time:&amp;nbsp;&lt;/i&gt;14:35–15:05&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68); color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px;"&gt;&lt;i&gt;Room:&amp;nbsp;&lt;/i&gt;Crystal Dining Room&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68); color: #444444;"&gt;&lt;span style="font-family: inherit;"&gt;They recorded all sessions, so &lt;a href="https://cloud-native.rejekts.io/#schedule" rel="nofollow" target="_blank"&gt;watch for it to publish online&lt;/a&gt;. Thanks to all who came to the talk and I enjoyed sharing real fun hands-on developer learning with Kubernetes and&amp;nbsp;&lt;a href="https://fluentbit.io" rel="nofollow" target="_blank"&gt;Fluent Bit&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRkOen1oef0VDDcT1BZYuYyfEJj0yOPCCDSI7D_Xp5cqT39UcM_pizmbckqH62YbWGxsuSAZ6Y_PJlUaJ4WWS61tyh57hp5pqFp7aJxqOP_FwTT0EsnRSif0hflk5TsViZ1cMS8bymsL6mITm6gap-Ds2x2eqZ8UHloQv_OmgVEbkN6qa4ce4-ys6ChrY/s72-c/Expanding%20Your%20Toolbox_%20Beginners%20Guide%20to%20Controlling%20Kubernetes%20Logs.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>Mastering Fluent Bit: Controlling Logs with Fluent Bit on Kubernetes (updated)</title><link>http://www.schabell.org/2025/11/mastering-fluent-bit-controlling-logs-on-kubernetes-updated.html</link><category>Cloud</category><category>Cloud Data</category><category>Cloud Native</category><category>Containers</category><category>Fluent Bit</category><category>Mastering Fluent Bit</category><category>Observability</category><pubDate>Tue, 4 Nov 2025 13:00:00 +0100</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-4872267885260494697</guid><description>&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYJUny5BahRk-eD6dTMTLr9qnVUU6_5v-iuBy4igBmwkgaY50tUY8ZnhIMuCcKR7RHHR-sbROGB0mI9WBTSntHCpKy1rcA6AqgTvs7V2w_PlyZMRBy5lDNjlO6usU1B1lU9y5GCVpinM-gnDvfrhQlzV42jN1Ne04QdxeWIY3dKbSRZQAiVTIvw1_omxY/s960/Mastering%20Fluent%20Bit%20Blog%20Series.png" style="clear: left; display: inline !important; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYJUny5BahRk-eD6dTMTLr9qnVUU6_5v-iuBy4igBmwkgaY50tUY8ZnhIMuCcKR7RHHR-sbROGB0mI9WBTSntHCpKy1rcA6AqgTvs7V2w_PlyZMRBy5lDNjlO6usU1B1lU9y5GCVpinM-gnDvfrhQlzV42jN1Ne04QdxeWIY3dKbSRZQAiVTIvw1_omxY/s320/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="320" /&gt;&lt;/a&gt;&lt;b&gt;&lt;i&gt;This is a special update to the original &lt;a href="https://www.schabell.org/2025/05/mastering-fluent-bit-controlling-logs-on-kubernetes.html" rel="nofollow" target="_blank"&gt;Controlling Logs with &amp;nbsp;Fluent Bit on Kubernetes&lt;/a&gt;&amp;nbsp;article published previously that is no longer valid.&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="caret-color: rgb(68, 68, 68);"&gt;The issue requiring this update arose over last weekend when I discovered that Broadcom, who acquired VMWare, who were the custodians of the bitnami catalog, did something not so nice to all of us.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="caret-color: rgb(68, 68, 68);"&gt;In &lt;a href="https://github.com/bitnami/charts/issues/35164" rel="nofollow" target="_blank"&gt;this issue&lt;/a&gt;, they announced that the catalog would be moved in August 2025 to a &lt;a href="https://hub.docker.com/u/bitnamilegacy" rel="nofollow" target="_blank"&gt;legacy catalog&lt;/a&gt;&amp;nbsp;in favor of a 'secure' catalog&amp;nbsp;and no longer updated. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;/p&gt;&lt;div style="caret-color: rgb(68, 68, 68);"&gt;&lt;p&gt;This meant that the current &lt;a href="https://gitlab.com/o11y-workshops/logs-control-easy-install" rel="nofollow" target="_blank"&gt;Logs Control Easy Install project&lt;/a&gt;, the workshop &lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit/lab08.html" rel="nofollow" target="_blank"&gt;Controlling Logs with Fluent Bit on Kubernetes&lt;/a&gt;, and the &lt;a href="https://www.schabell.org/2025/05/mastering-fluent-bit-controlling-logs-on-kubernetes.html" rel="nofollow" target="_blank"&gt;original article&lt;/a&gt; had to all be updated. &amp;nbsp;I spent this last weekend and most of this week bringing all three of these artifacts up to date with a new application workload to replace the use of Ghost CMS.&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: inherit;"&gt;Let's take a look at what these changes meant to the original article and provide you with a new guide, using Fluent Bit to get control of logs on a Kubernetes cluste&lt;/span&gt;r.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;As with all articles in this series, I'm providing a short introduction to Fluent Bit before sharing how to use a Fluent Bit telemetry pipeline on a Kubernetes cluster to take control of all the logs being generated.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style="font-family: inherit;"&gt;What is Fluent Bit?&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Before diving into Fluent Bit, let's step back and look at&amp;nbsp;&lt;a href="https://fluentbit.io/blog/2025/04/01/fluent-bit-v4.0/" rel="nofollow" target="_blank"&gt;the position of this project&lt;/a&gt;&amp;nbsp;within the Fluent organization. If we look at the&amp;nbsp;&lt;a href="https://github.com/fluent" rel="nofollow" target="_blank"&gt;Fluent organization on Github&lt;/a&gt;, we find Fluentd and Fluent Bit projects hosted there. The back story is that the project started with log parsing project&amp;nbsp;&lt;a href="https://www.cncf.io/projects/fluentd/" rel="nofollow" target="_blank"&gt;Fluentd joining the CNCF&lt;/a&gt;&amp;nbsp;in 2026 and reaching Graduated status in 2019.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Once it became apparent that the world was heading into cloud native Kubernetes environments, the solution was not designed for the flexible and light weight requirements that Kubernetes solutions demanded. Fluent bit was born from the need to have a low resource using, high throughput, and highly scalable log management solution for cloud native Kubernetes environments. The project was started within the Fluent organization as a sub-project in 2017 and the rest is now&amp;nbsp;&lt;a href="https://fluentbit.io/blog/2025/04/01/fluent-bit-v4.0?utm_source=schabell-blog&amp;amp;utm_medium=eric" rel="nofollow" target="_blank"&gt;10 years of history&lt;/a&gt;&amp;nbsp;with the release of v4 last week!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Fluent Bit has become so much more than a flexible and lightweight log pipeline solution, now able to process metrics and traces and becoming a telemetry pipeline collection tool of choice for those looking to put the control over their telemetry data right at the source where it's being collected.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Let's get started with Fluent Bit and see what we can do for ourselves!&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style="font-family: inherit;"&gt;Why control logs on a Kubernetes cluster?&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;When you dive into the cloud native world this means you are deploying containers on Kubernetes. The complexities increase dramatically as your applications and microservices interact in this complex and dynamic infrastructure landscape.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Deployments can auto-scale, pods spin up and are taken down as the need arises, and underlying all of this are the various Kubernetes controlling components. All of these things are generating telemetry data and Fluent Bit is a wonderfully simple way to take control of them across a Kubernetes cluster. It provides a way of collecting everything through a central telemetry pipeline as you go while providing the ability to parse, filter, and route all your telemetry data.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: white; font-family: inherit;"&gt;For developers, this article will demonstrate using Fluent Bit as a single point of log collection on a development Kubernetes cluster with a deployed workload.&amp;nbsp;&lt;/span&gt;Finally, all examples in this article have been done on OSX and are assuming the reader is able to convert the actions shown here to their own local machines&lt;/p&gt;&lt;p style="color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px;"&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style="font-family: inherit;"&gt;Where to get started&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;To ensure you are ready to start controlling your Kubernetes cluster logs, the rest of this article assumes you have completed&amp;nbsp;&lt;a href="https://www.schabell.org/2025/05/mastering-fluent-bit-installing-and-configuring-on-kubernetes.html" rel="nofollow" target="_blank"&gt;this previous article&lt;/a&gt;. This ensures you are running a two node Kubernetes cluster with a workload running in the form of Ghost CMS and Fluent Bit is installed to collect all container logs.&amp;nbsp;&lt;/p&gt;&lt;p&gt;If you did not work through the previous article, I've provided a&amp;nbsp;&lt;a href="https://gitlab.com/o11y-workshops/logs-control-easy-install" rel="nofollow" target="_blank"&gt;Logs Control Easy Install&lt;/a&gt;&amp;nbsp;project repository that you can download, unzip, and run with one command to spin up the Kubernetes cluster with the above setup on your local machine.&lt;/p&gt;&lt;p&gt;Using either path, once set up you are able to see the logs from Fluent Bit containing everything generated on this running cluster. This would be the logs across two namespaces;&amp;nbsp;&lt;i&gt;&lt;b&gt;kube-system&lt;/b&gt;&lt;/i&gt;&amp;nbsp;and&amp;nbsp;&lt;b&gt;&lt;i&gt;logging&lt;/i&gt;&lt;/b&gt;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;You can verify that they are up and running by browsing those namespaces, shown here on my local machine:&lt;/span&gt;&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ kubectl --kubeconfig target/logdemoconfig.yaml get pods --namespace kube-system&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;NAME                                           READY   STATUS   RESTARTS  AGE
coredns-668d6bf9bc-2skfg                       1/1     Running  0         2m43s
coredns-668d6bf9bc-79jpn                       1/1     Running  0         2m43s
etcd-logdemo-control-plane                     1/1     Running  0         2m51s
kindnet-7lm5s                                  1/1     Running  0         2m43s
kube-apiserver-logdemo-control-plane           1/1     Running  0         2m50s
kube-controller-manager-logdemo-control-plane  1/1     Running  0         2m50s
kube-proxy-2q9db                               1/1     Running  0         2m43s
kube-scheduler-logdemo-control-plane           1/1     Running  0         2m50s&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ kubectl --kubeconfig target/logdemoconfig.yaml get pods --namespace default&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;NAME                             READY   STATUS    RESTARTS   AGE
log-generator-7cdff9fcf8-qgw9k   1/1     Running   0          5m4s&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ kubectl --kubeconfig target/logdemoconfig.yaml get pods --namespace logging&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;NAME               READY   STATUS    RESTARTS   AGE
fluent-bit-vk2rf   1/1     Running   0          4m49s&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;The initial configuration for the Fluent Bit instance is to collect all container logs, from all namespaces, shown in in the&amp;nbsp;&lt;i&gt;&lt;b&gt;fluent-bit-helm.yaml&lt;/b&gt;&lt;/i&gt;&amp;nbsp;configuration file used in our set up, highlighted in bold below:&lt;/span&gt;&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;args:&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #888888;"&gt;  - --workdir=/fluent-bit/etc
  - --config=/fluent-bit/etc/conf/fluent-bit.yaml

config:
  extraFiles:
    fluent-bit.yaml: |
      service:
       flush: 1
       log_level: info
       http_server: true
       http_listen: 0.0.0.0
       http_port: 2020
      pipeline:
        inputs:
          - name: tail
            tag: kube.*
            read_from_head: true
&lt;/span&gt;&lt;span style="color: #444444;"&gt;            &lt;/span&gt;&lt;b&gt;path: /var/log/containers/*.log&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;            multiline.parser: docker, cri
        outputs:
          - name: stdout
            match: '*'&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;To see all the logs collected, we can dump the Fluent Bit log file as follows, using the pod name we found above:&lt;/span&gt;&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ kubectl --kubeconfig target/logdemoconfig.yaml logs &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;fluent-bit-&lt;span style="font-family: inherit;"&gt;vk2rf&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt; --nanmespace logging&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #888888;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;[OUTPUT-CUT-DUE-TO-LOG-VOLUME]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #888888;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;You will notice if you browse that you have error messages, info messages, if you look hard enough some logs from Kubernetes pods, the application workload, and even your Fluent Bit instance. As a developer working on your cluster, how can you find anything useful in this flood of logging? The good thing is you do have a single place to look for them!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Another point to mention is that by using the Fluent Bit&amp;nbsp;&lt;i&gt;tail&lt;/i&gt;&amp;nbsp;input plugin and setting it to read from the beginning of each log file, we have ensured that our log telemetry data is taken from all our logs. If we didn't set this to collect from the beginning of the log file, our telemetry pipeline would miss everything that was generated before the Fluent Bit instance started. This ensures we have the workload startup messages and can test on standard log telemetry events each time we modify our pipeline configuration.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Let's start taking control of our logs and see how we as developers can make some use of the logs data we want to see during our local development testing.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style="font-family: inherit;"&gt;Taking back control&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;The first thing we can do is to focus our log collection efforts on just the workload we are interested in and in this example we are looking to find problems with our Log Generator application deployment. As you are not interested in the logs from anything happening in the&amp;nbsp;&lt;i style="font-weight: bold;"&gt;kube-system&lt;/i&gt;&amp;nbsp;namespace, you can narrow the focus of your Fluent Bit input plugin to only examine Log Generator log files.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;This can be done by making a new configuration file called&amp;nbsp;&lt;i style="font-weight: bold;"&gt;myfluent-bit-helm.yaml&lt;/i&gt;&amp;nbsp;file and change the default path as follows in bold:&lt;/span&gt;&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; width: auto;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif;"&gt;args:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #888888;"&gt;  - --workdir=/fluent-bit/etc
  - --config=/fluent-bit/etc/conf/fluent-bit.yaml

config:
  extraFiles:
    fluent-bit.yaml: |
      service:
       flush: 1
       log_level: info
       http_server: true
       http_listen: 0.0.0.0
       http_port: 2020
      pipeline:
        inputs:
          - name: tail
            tag: kube.*
            read_from_head: true
&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;b&gt;path: /var/log/containers/*generator*&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="color: #444444;"&gt;            multiline.parser: docker, cri
        outputs:
          - name: stdout
            match: '*'&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next step is to update the Fluent Bit instance with a helm update command as follows:&lt;/p&gt;&lt;div&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ helm upgrade --kubeconfig target/logdemoconfig.yaml &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;--install fluent-bit fluent/fluent-bit --set image.tag=4.0.0 --namespace=logging --create-namespace --values=myfluent-bit-helm.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #888888;"&gt;NAME               READY   STATUS    RESTARTS   AGE
fluent-bit-mzktk   1/1     Running   0          28s&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now explore the logs being collected by Fluent Bit and notice that all the&amp;nbsp;&lt;i style="font-weight: bold;"&gt;kube-system&lt;/i&gt;&amp;nbsp;namespace logs are no longer there and we can focus on our deployed workload.&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ kubectl --kubeconfig target/logdemoconfig.yaml logs &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;fluent-bit-mzktk --nanmespace logging&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #888888;"&gt;...
[0] kube.var.log.containers.log-generator-7cdff9fcf8-qgw9k_default_log-generator-f1be04153240cf686ba99566f79d64a0e2496a4b555dd833000e1ff222f73dc8.log: [[1762440627.216814972, {}], {"time"=&amp;gt;"2025-11-06T14:50:27.216814972Z", "stream"=&amp;gt;"stdout", "_p"=&amp;gt;"F", "log"=&amp;gt;"Thu Nov  6 14:50:27 UTC 2025 - This is a log message from the log generator."}]
[0] kube.var.log.containers.log-generator-7cdff9fcf8-qgw9k_default_log-generator-f1be04153240cf686ba99566f79d64a0e2496a4b555dd833000e1ff222f73dc8.log: [[1762440630.220889184, {}], {"time"=&amp;gt;"2025-11-06T14:50:30.220889184Z", "stream"=&amp;gt;"stdout", "_p"=&amp;gt;"F", "log"=&amp;gt;"Thu Nov  6 14:50:30 UTC 2025 - {message:true 200 success}"}]
[0] kube.var.log.containers.log-generator-7cdff9fcf8-qgw9k_default_log-generator-f1be04153240cf686ba99566f79d64a0e2496a4b555dd833000e1ff222f73dc8.log: [[1762440633.226102188, {}], {"time"=&amp;gt;"2025-11-06T14:50:33.226102188Z", "stream"=&amp;gt;"stderr", "_p"=&amp;gt;"F", "log"=&amp;gt;"Thu Nov  6 14:50:33 UTC 2025 - {message:false 500 error}"}]&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #888888;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;This is just a selection of log lines from the total output. If you look closer you see these logs have their own sort of format, so let's standardize them so that JSON is the output format and make the various timestamps a bit more readable by changing your Fluent Bit output plugin configuration as follows:&lt;/span&gt;&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif;"&gt;&lt;span style="color: #888888;"&gt;args:&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span&gt;  - --workdir=/fluent-bit/etc
  - --config=/fluent-bit/etc/conf/fluent-bit.yaml

config:
  extraFiles:
    fluent-bit.yaml: |
      service:
       flush: 1
       log_level: info
       http_server: true
       http_listen: 0.0.0.0
       http_port: 2020
      pipeline:
        inputs:
          - name: tail
            tag: kube.*
            read_from_head: true&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span&gt;            path: /var/log/containers/*ghost*&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;            multiline.parser: docker, cri
        outputs:
          - name: stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;            match: '*'&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;            &lt;b&gt;format: json_lines&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;&lt;b&gt;            json_date_format: java_sql_timestamp&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Update the Fluent Bit instance using a helm update command as follows:&lt;/p&gt;&lt;div&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ helm upgrade --kubeconfig target/logdemoconfig.yaml &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;--install fluent-bit fluent/fluent-bit --set image.tag=4.0.0 --namespace=logging --create-namespace --values=myfluent-bit-helm.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #888888;"&gt;NAME               READY   STATUS    RESTARTS   AGE
fluent-bit-gqsc8   1/1     Running   0          42s&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now explore the logs being collected by Fluent Bit and notice the output changes:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ kubectl --kubeconfig target/logdemoconfig.yaml logs &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;fluent-bit-gqsc8 --nanmespace logging&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #888888;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #888888;"&gt;{"date":"2025-11-06 14:51:44.314963","time":"2025-11-06T14:51:44.314963452Z","stream":"stdout","_p":"F","log":"Thu Nov  6 14:51:44 UTC 2025 - This is a log message from the log generator."}
{"date":"2025-11-06 14:51:47.317883","time":"2025-11-06T14:51:47.317883265Z","stream":"stdout","_p":"F","log":"Thu Nov  6 14:51:47 UTC 2025 - {message:true 200 success}"}
{"date":"2025-11-06 14:51:50.321730","time":"2025-11-06T14:51:50.321730204Z","stream":"stderr","_p":"F","log":"Thu Nov  6 14:51:50 UTC 2025 - {message:false 500 error}"}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #888888;"&gt;&lt;span style="font-family: inherit;"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Now if we look closer at the array of messages and being the developer we are, we've noticed a mix of&amp;nbsp;&lt;i&gt;stderr&lt;/i&gt;&amp;nbsp;and&amp;nbsp;&lt;i&gt;stdout&lt;/i&gt;&amp;nbsp;log lines. Let's take control and trim out all the lines that do not contain&amp;nbsp;&lt;i&gt;stderr&lt;/i&gt;, as we are only interested in what is broken.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;We need to add a&amp;nbsp;&lt;i&gt;filter&lt;/i&gt;&amp;nbsp;section to our Fluent Bit configuration using the&amp;nbsp;&lt;i&gt;grep&lt;/i&gt;&amp;nbsp;filter and targeting a regular expression to select the keys&amp;nbsp;&lt;i&gt;stream&lt;/i&gt;&amp;nbsp;or&amp;nbsp;&lt;i&gt;stderr&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;as follows:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif;"&gt;&lt;span style="color: #888888;"&gt;args:&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span&gt;  - --workdir=/fluent-bit/etc
  - --config=/fluent-bit/etc/conf/fluent-bit.yaml

config:
  extraFiles:
    fluent-bit.yaml: |
      service:
       flush: 1
       log_level: info
       http_server: true
       http_listen: 0.0.0.0
       http_port: 2020
      pipeline:
        inputs:
          - name: tail
            tag: kube.*
            read_from_head: true&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span&gt;            path: /var/log/containers/*ghost*&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;            multiline.parser: docker, cri&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;        &lt;b&gt;filters:
          - name: grep
            match: '*'&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;&lt;b&gt;            regex: stream stderr&lt;/b&gt;
        outputs:
          - name: stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;            match: '*'&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;            format: json_lines&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;            json_date_format: java_sql_timestamp&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Update the Fluent Bit instance using a helm update command as follows:&lt;/p&gt;&lt;div&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ helm upgrade --kubeconfig target/logdemoconfig.yaml &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;--install fluent-bit fluent/fluent-bit --set image.tag=4.0.0 --namespace=logging --create-namespace --values=myfluent-bit-helm.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #888888;"&gt;NAME               READY   STATUS    RESTARTS   AGE
fluent-bit-npn8n   1/1     Running   0          12s&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now explore the logs being collected by Fluent Bit and notice the output changes:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ kubectl --kubeconfig target/logdemoconfig.yaml logs &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;fluent-bit-npn8n --nanmespace logging&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;{"date":"2025-11-06 14:52:56.411711","time":"2025-11-06T14:52:56.411711621Z","stream":"stderr","_p":"F","log":"Thu Nov  6 14:52:56 UTC 2025 - {message:false 500 error}"}
{"date":"2025-11-06 14:53:07.426493","time":"2025-11-06T14:53:07.426493474Z","stream":"stderr","_p":"F","log":"Thu Nov  6 14:53:07 UTC 2025 - {message:false 500 error}"}
{"date":"2025-11-06 14:53:18.441807","time":"2025-11-06T14:53:18.441807795Z","stream":"stderr","_p":"F","log":"Thu Nov  6 14:53:18 UTC 2025 - {message:false 500 error}"}
{"date":"2025-11-06 14:53:29.453509","time":"2025-11-06T14:53:29.453509211Z","stream":"stderr","_p":"F","log":"Thu Nov  6 14:53:29 UTC 2025 - {message:false 500 error}"}
{"date":"2025-11-06 14:53:40.462905","time":"2025-11-06T14:53:40.462905134Z","stream":"stderr","_p":"F","log":"Thu Nov  6 14:53:40 UTC 2025 - {message:false 500 error}"}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #888888;"&gt;&lt;span style="font-family: inherit;"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Now we are no longer seeing standard output log events as our telemetry pipeline is filtering to only show standard error tagged logs!&lt;/p&gt;&lt;p&gt;This exercise has shown how to format and prune our logs using our Fluent Bit telemetry pipeline on a Kubernetes cluster. Now let's look at how to enrich our log telemetry data.&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;We are going to add tags to every standard error line pointing the on-call developer to the SRE they need to contact. To do this, we expand our&amp;nbsp;&lt;i&gt;filter&lt;/i&gt;&amp;nbsp;section of the Fluent Bit configuration using the&amp;nbsp;&lt;i&gt;modify&lt;/i&gt;&amp;nbsp;filter and targeting the keys&amp;nbsp;&lt;i&gt;stream&lt;/i&gt;&amp;nbsp;or&amp;nbsp;&lt;i&gt;stderr&amp;nbsp;&lt;/i&gt;to remove those keys and add two new keys&amp;nbsp;&lt;i&gt;STATUS&lt;/i&gt;&amp;nbsp;and&amp;nbsp;&lt;i&gt;ACTION&lt;/i&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;as follows:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif;"&gt;&lt;span style="color: #888888;"&gt;args:&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span&gt;  - --workdir=/fluent-bit/etc
  - --config=/fluent-bit/etc/conf/fluent-bit.yaml

config:
  extraFiles:
    fluent-bit.yaml: |
      service:
       flush: 1
       log_level: info
       http_server: true
       http_listen: 0.0.0.0
       http_port: 2020
      pipeline:
        inputs:
          - name: tail
            tag: kube.*
            read_from_head: true&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span&gt;            path: /var/log/containers/*ghost*&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;            multiline.parser: docker, cri&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;        filters:
          - name: grep
            match: '*'&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;            regex: stream stderr&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;          &lt;b&gt;- name: modify
            match: '*'
            condition: Key_Value_Equals stream stderr
            remove: stream
            add:
              - STATUS REALLY_BAD
              - ACTION CALL_SRE&lt;/b&gt;
        outputs:
          - name: stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;            match: '*'&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;            format: json_lines&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;            json_date_format: java_sql_timestamp&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Update the Fluent Bit instance using a helm update command as follows:&lt;/p&gt;&lt;div&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ helm upgrade --kubeconfig target/logdemoconfig.yaml &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;--install fluent-bit fluent/fluent-bit --set image.tag=4.0.0 --namespace=logging --create-namespace --values=myfluent-bit-helm.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #888888;"&gt;NAME               READY   STATUS    RESTARTS   AGE
fluent-bit-ftfs4   1/1     Running   0          32s&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now explore the logs being collected by Fluent Bit and notice the output changes where the&amp;nbsp;&lt;i&gt;stream&lt;/i&gt;&amp;nbsp;key is missing and two new ones have been added at the end of each error log event:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ kubectl --kubeconfig target/logdemoconfig.yaml logs &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;fluent-bit-ftfs4 --nanmespace logging&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;span style="font-family: inherit;"&gt;[CUT-LINE-FOR-VIEWING] &lt;/span&gt;{message:false 500 error}",&lt;b&gt;"STATUS":"REALLY_BAD_ERROR","ACTION":"CALL_SRE"&lt;/b&gt;}
&lt;span style="font-family: inherit;"&gt;[CUT-LINE-FOR-VIEWING] &lt;/span&gt;{message:false 500 error}",&lt;b&gt;"STATUS":"REALLY_BAD_ERROR","ACTION":"CALL_SRE"&lt;/b&gt;}
&lt;span style="font-family: inherit;"&gt;[CUT-LINE-FOR-VIEWING]&lt;/span&gt; {message:false 500 error}",&lt;b&gt;"STATUS":"REALLY_BAD_ERROR","ACTION":"CALL_SRE"&lt;/b&gt;}
&lt;span style="font-family: inherit;"&gt;[CUT-LINE-FOR-VIEWING]&lt;/span&gt; {message:false 500 error}",&lt;b&gt;"STATUS":"REALLY_BAD_ERROR","ACTION":"CALL_SRE"&lt;/b&gt;}
&lt;span style="font-family: inherit;"&gt;[CUT-LINE-FOR-VIEWING]&lt;/span&gt; {message:false 500 error}",&lt;b&gt;"STATUS":"REALLY_BAD_ERROR","ACTION":"CALL_SRE"&lt;/b&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Now we have a running Kubernetes cluster, an application workload generating logs, and using a Fluent Bit telemetry pipeline to gather and take control of our log telemetry data.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Initially we found that gathering all log telemetry data was flooding too much information to be able to sift out the important events for our development needs. We then started taking control back of our log telemetry data by narrowing our collection strategy, by filtering, and finally by enriching our telemetry data.&lt;/p&gt;&lt;h3&gt;&lt;span style="font-family: inherit;"&gt;More in the series&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;In this article you learned how to use Fluent Bit on a Kubernetes cluster to take control of your telemetry data. This article is based on this (updated)&amp;nbsp;&lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit" rel="nofollow" target="_blank"&gt;online free workshop&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;There will be more in this series as you continue to learn how to configure, run, manage, and master the use of Fluent Bit in the wild. Next up, a&amp;nbsp;&lt;a href="https://www.schabell.org/2025/07/mastering-fluent-bit-developer-guide-to-service-section-config.html" rel="nofollow" target="_blank"&gt;developers guide to Fluent Bit service section configuration&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYJUny5BahRk-eD6dTMTLr9qnVUU6_5v-iuBy4igBmwkgaY50tUY8ZnhIMuCcKR7RHHR-sbROGB0mI9WBTSntHCpKy1rcA6AqgTvs7V2w_PlyZMRBy5lDNjlO6usU1B1lU9y5GCVpinM-gnDvfrhQlzV42jN1Ne04QdxeWIY3dKbSRZQAiVTIvw1_omxY/s72-c/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>Mastering Fluent Bit: Top Tip Using Telemetry Pipeline Parsers for Developers</title><link>http://www.schabell.org/2025/10/mastering-fluent-bit-top-tip-using-telemetry-pipeline-parsers-for-developers.html</link><category>Cloud</category><category>Cloud Data</category><category>Cloud Native</category><category>Containers</category><category>Fluent Bit</category><category>Mastering Fluent Bit</category><category>Observability</category><pubDate>Tue, 21 Oct 2025 07:00:00 +0200</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-3186246345289301639</guid><description>&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s960/Mastering%20Fluent%20Bit%20Blog%20Series.png" style="clear: left; display: inline; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s320/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="320" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;span style="font-family: inherit;"&gt;This series is a general purpose getting started guide for those of us wanting to learn about the Cloud Native Computing Foundation (CNCF) project Fluent Bit.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;/p&gt;&lt;div class="post-body entry-content" id="post-body-5235288955510574978" itemprop="articleBody" style="caret-color: rgb(68, 68, 68); line-height: 1.4; position: relative; width: 735.661743px;"&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Each article in this series addresses a single topic by providing insights into&amp;nbsp;&lt;i&gt;what&lt;/i&gt;&amp;nbsp;the topic is,&amp;nbsp;&lt;i&gt;why&lt;/i&gt;&amp;nbsp;we are interested in exploring that topic,&amp;nbsp;&lt;i&gt;where&lt;/i&gt;&amp;nbsp;to get started with the topic, and&amp;nbsp;&lt;i&gt;how&amp;nbsp;&lt;/i&gt;to get hands-on with learning about the topic as it relates to the Fluent Bit project.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;The idea is that each article can stand on its own, but that they also lead down a path that slowly increases our abilities to implement solutions with Fluent Bit telemetry pipelines.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Let's take a look at the topic of this article, using Fluent Bit tips for developers.&amp;nbsp;In case you missed&amp;nbsp;&lt;a href="https://www.schabell.org/2025/09/mastering-fluent-bit-top-3-telemetry-pipeline-output-plugins-for-developers.html" rel="nofollow" target="_blank"&gt;the previous article&lt;/a&gt;, check out the top 3 telemetry pipeline output plugins for developers where you get tips on the best of Fluent Bit for your developer experiences.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;This article will be a hands-on tour of the things that help you as a developer testing out your Fluent Bit pipelines.&amp;nbsp;We'll take a look at the top tip when using a parser for your telemetry pipeline configuration in Fluent Bit.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white;"&gt;A&lt;/span&gt;ll examples in this article have been done on OSX and are assuming the reader is able to convert the actions shown here to their own local machines.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;Where to get started&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;You should have explored the previous articles in this series to install and get started with Fluent Bit on your developer local machine, either using &lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-from-source.html" rel="nofollow" target="_blank"&gt;the&amp;nbsp;source code&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;a href="https://www.schabell.org/2025/04/mastering-fluent-bit-installing-and-configuring-using-contianer-images.html" rel="nofollow" target="_blank"&gt;container images&lt;/a&gt;. Links at the end of this article will point you to a free hands-on workshop that lets you explore more of Fluent Bit in detail.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;You can verify that you have a functioning installation by testing your Fluent Bit, either using a source installation or a container installation as shown below:&lt;/span&gt;&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border-color: gray; border-image: none; border-style: solid; color: #444444; font-family: inherit; font-size: 14px; width: auto;"&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run -ti ghcr.io/fluent/fluent-bit:4.0.8 -i dummy -o stdout&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;...&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;[0] dummy.0: [[1753105021.031338000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105022.033205000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105023.032600000, {}], {"message"=&amp;gt;"dummy"}]
[0] dummy.0: [[1753105024.033517000, {}], {"message"=&amp;gt;"dummy"}]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Let's look at a few tips and tricks to help you with your local development testing of Fluent Bit input plugins.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Parsing in a telemetry pipeline&lt;/h3&gt;&lt;p style="color: #444444;"&gt;&lt;span style="font-family: inherit;"&gt;See&amp;nbsp;&lt;a href="https://www.schabell.org/2025/07/mastering-fluent-bit-developer-guide-to-service-section-config.html" rel="nofollow" target="_blank"&gt;this article&lt;/a&gt;&amp;nbsp;for details about the&amp;nbsp;&lt;i&gt;service&lt;/i&gt;&amp;nbsp;section of the configurations used in the rest of this article, but for now we plan to focus on our Fluent Bit pipeline and specifically the &lt;i&gt;parsers&lt;/i&gt; that can be of great help in managing our telemetry data during testing in our inner developer loop.&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;Below in the figure you see the phases of a telemetry pipeline. The second phase is &lt;i&gt;parser&lt;/i&gt;, which is where unstructured input data is turned into structured data. Fluent Bit does this using Parsers that we can configure to manipulate the unstructured data producing structured data for the next phases of our pipeline.&lt;/span&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqK6v0eMx3ejBuyW2nhX1Kz6qeao0jNl-bRYwAVROjTxtBZP4ktVmETta0zhgvRsLDLJkq3fULQLFFm505LGE1B2cu3_HzWS8mXSTCxGO4a8EEpSwxLul9sX1m-rbyEfzagXJ6oDUs7CHFRlXvqzicnl2sn8-RuXV1L0gyk-Cs1YS2nEebhuymGtQ92-Y/s960/DIAGRAMS%20-%20Monitoring%20Architecture%20Diagrams%20(1).png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqK6v0eMx3ejBuyW2nhX1Kz6qeao0jNl-bRYwAVROjTxtBZP4ktVmETta0zhgvRsLDLJkq3fULQLFFm505LGE1B2cu3_HzWS8mXSTCxGO4a8EEpSwxLul9sX1m-rbyEfzagXJ6oDUs7CHFRlXvqzicnl2sn8-RuXV1L0gyk-Cs1YS2nEebhuymGtQ92-Y/w640-h360/DIAGRAMS%20-%20Monitoring%20Architecture%20Diagrams%20(1).png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p style="text-align: left;"&gt;An example of this can be found in &lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit/lab01.html#/25" rel="nofollow" target="_blank"&gt;the online workshop&lt;/a&gt;, where we see an example of unstructured log data:&lt;/p&gt;&lt;div&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; color: #444444; font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;192.168.2.20 - - [28/Jul/2006:10:27:10 -0300] "GET /cgi-bin/try/ HTTP/1.0" 200 3395&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p style="color: #444444; font-family: inherit; font-size: 14px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;When unstructured log data is parsed by Fluent Bit, the results become structured data such as the following:&lt;/span&gt;&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; color: #444444; font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;{&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: black; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;  "host":    "192.168.2.20",
  "user":    "-",
  "method":  "GET",
  "path":    "/cgi-bin/try/",
  "code":    "200",
  "size":    "3395"
}&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p style="color: #444444; font-family: inherit; font-size: 14px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The Fluent Bit parser engine is configurable and can process log entries based in two formats:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;JSON maps&lt;/li&gt;&lt;li&gt;Regular expressions&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;By default, Fluent Bit provides a set of pre-configured parsers that can be used for different use cases, such as logs from these formats:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Apache&lt;/li&gt;&lt;li&gt;NGINX&lt;/li&gt;&lt;li&gt;Docker&lt;/li&gt;&lt;li&gt;Syslog rfc5424&lt;/li&gt;&lt;li&gt;Syslog rfc3164&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Parsers tend to be defined in configuration files that are loaded at start time in the main Fluent Bit configuration file. We can also load parsers from the command line, but we won't be covering this here. &lt;span style="font-family: inherit;"&gt;Keeping all of this in mind, let's look at the most interesting parser that developers will want to know more about.&lt;/span&gt;&lt;/p&gt;&lt;h4 style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;1. &amp;nbsp;Regular expression parser&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;One of the more common use cases for telemetry pipelines that developers will encounter is having multiple event streams producing data that creates the situation that keys are not unique if parsed without some cleanup. To illustrate how Fluent Bit can easily provide us with a means to both parse and filter events from multiple input sources to clean up any duplicate keys before sending onwards to a destination.&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;To provide an example we start with a simple Fluent Bit configuration file &lt;i&gt;fluent-bit.yaml&amp;nbsp;&lt;/i&gt;containing a configuration using the dummy plugin to generate two types of events, both using the same key to cause confusion if we try querying without cleaning them up first:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; color: #444444; font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;  flush: 1
  log_level: info&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on

pipeline:
  inputs:
    # This entry generates a successful message.
    - name:  dummy
      tag:   event.success
      dummy: '{"message":"true 200 success"}'

    # This entry generates a failure message.
    - name:  dummy
      tag:   event.error
      dummy: '{"message":"false 500 error"}'
&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;  outputs:
    - name: stdout
      match: '*'&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;      format: json_lines&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;      json_date_format: java_sql_timestamp&lt;/span&gt;&lt;b style="color: #888888; font-family: inherit;"&gt;    &lt;/b&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p style="color: #444444; font-family: inherit; font-size: 14px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Our configuration is tagging each successful event with &lt;i&gt;event.success&lt;/i&gt; and failure events with &lt;i&gt;event.error&lt;/i&gt;. The confusion will be caused by configuring the dummy message with the same key, &lt;i&gt;message&lt;/i&gt;, for both event definitions. This will cause our incoming events to be confusing to deal with.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Let's run this to confirm out working test environment:&lt;/span&gt;&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; color: #444444; font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: black; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: black; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;pre style="color: black; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: black; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;{"date":"2025-10-26 19:59:34.508732","message":"true 200 success"}
{"date":"2025-10-26 19:59:34.508837","message":"false 500 error"}
{"date":"2025-10-26 19:59:35.509396","message":"true 200 success"}
{"date":"2025-10-26 19:59:35.509456","message":"false 500 error"}
{"date":"2025-10-26 19:59:36.508828","message":"true 200 success"}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: black; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p style="color: #444444; font-family: inherit; font-size: 14px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Now we have dirty ingested data coming into our pipeline, showing that we have multiple messages on the same key. To be able to clean this up for usage before passing on to the backend (output), we need to make use of both the &lt;i&gt;Parser&lt;/i&gt; and &lt;i&gt;Filter&lt;/i&gt; phases.&lt;/p&gt;&lt;p&gt;First, in the &lt;i&gt;Parser&lt;/i&gt; phase, where unstructured data is converted into structured data, we'll make use of the built in &lt;a href="https://docs.fluentbit.io/manual/data-pipeline/parsers/regular-expression" rel="nofollow" target="_blank"&gt;&lt;i&gt;Regular expression parser plugin&lt;/i&gt;&lt;/a&gt; to structure the duplicate messages into something more usable.&amp;nbsp;To set up the parser configuration we create a new file called &lt;i&gt;parsers.yaml&lt;/i&gt; in our favorite editor. Add the following configuration, where we are defining a &lt;i&gt;parser&lt;/i&gt;, naming the parser &lt;i&gt;message_cleaning_parser&lt;/i&gt;, selecting the built-in &lt;i&gt;regex parser&lt;/i&gt;, and applying the regular expression shown here to convert each message into a structured format (note this actually is applied to incoming messages in the next phase of the telemetry pipeline):&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="color: #444444; font-family: inherit; font-size: 14px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="-webkit-text-stroke-width: 0px; background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; caret-color: rgb(68, 68, 68); color: #444444; font-family: inherit; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; overflow: auto; padding: 0.2em 0.6em; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; width: auto; word-spacing: 0px;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit; white-space: normal;"&gt;# This parser uses the built-in parser plugin and applies the&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# regex to all incoming events.
#
parsers:
  - name: message_cleaning_parser
    format: regex
    regex: '^(?&amp;lt;valid_message&amp;gt;[^ ]+) (?&amp;lt;code&amp;gt;[^ ]+) (?&amp;lt;type&amp;gt;[^ ]+)$'&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the &lt;i&gt;Filter&lt;/i&gt; phase is where the previously defined parser is put to the test. To set up the &lt;i&gt;filters&lt;/i&gt; configuration we create a new section as shown below and add the following configuration, where we are defining &lt;i&gt;filters&lt;/i&gt;, naming a new filter &lt;i&gt;parser&lt;/i&gt;, matching all incoming messages to apply this filter, looking for the key &lt;i&gt;message&lt;/i&gt; to select the value to be fed into the parser, and applying the parser &lt;i&gt;message_cleaning_parser&lt;/i&gt; to it:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; color: #444444; font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;service:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;  flush: 1
  log_level: info&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;  http_server: on
  http_listen: 0.0.0.0
  http_port: 2020
  hot_reload: on&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;  &lt;b&gt;parsers_file: parsers.yaml&lt;/b&gt;

pipeline:
  inputs:
    # This entry generates a successful message.
    - name:  dummy
      tag:   event.success
      dummy: '{"message":"true 200 success"}'

    # This entry generates a failure message.
    - name:  dummy
      tag:   event.error
      dummy: '{"message":"false 500 error"}'
&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;  &lt;b&gt;filters:
    - name: parser
      match: '*'
      key_name: message
      parser: message_cleaning_parser&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;  outputs:
    - name: stdout
      match: '*'&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;      format: json_lines&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;      json_date_format: java_sql_timestamp&lt;/span&gt;&lt;b style="color: #888888; font-family: inherit;"&gt;    &lt;/b&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p style="color: #444444; font-family: inherit; font-size: 14px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Also note that we have to include the &lt;i&gt;parsers_file &lt;/i&gt;by name to ensure our &lt;i&gt;filters &lt;/i&gt;can find the parser we defined. Now when we run the configuration we see the following:&lt;/p&gt;&lt;div style="background: 0% 0% repeat rgb(240, 240, 240); border: solid gray; color: #444444; font-family: inherit; font-size: 14px; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For source installation.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ fluent-bit --config fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: black; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: black; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# For container installation after building new image with your&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# configuration using a Buildfile as follows:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# &lt;/span&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;FROM ghcr.io/fluent/fluent-bit:4.1.0&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./fluent-bit.yaml /fluent-bit/etc/fluent-bit.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# COPY ./parsers.yaml /fluent-bit/etc/parsers.yaml&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;# CMD [ "fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.yaml" ]&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;#&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman build -t fb -f Buildfile&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;$ podman run --rm fb &lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="color: #444444; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;&lt;pre style="color: black; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: black; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;{"date":"2025-10-26 20:15:54.233766","valid_message":"true","code":"200","type":"success"}
{"date":"2025-10-26 20:15:54.234199","valid_message":"false","code":"500","type":"error"}
{"date":"2025-10-26 20:15:55.234238","valid_message":"true","code":"200","type":"success"}
{"date":"2025-10-26 20:15:55.234323","valid_message":"false","code":"500","type":"error"}
{"date":"2025-10-26 20:15:56.233915","valid_message":"true","code":"200","type":"success"}
{"date":"2025-10-26 20:15:56.234009","valid_message":"false","code":"500","type":"error"}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="color: black; line-height: 17.5px; margin-bottom: 0px; margin-top: 0px;"&gt;&lt;span style="color: #888888; font-family: inherit;"&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p style="color: #444444; font-family: inherit; font-size: 14px;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Note the alternating generated event lines with parsed messages that now contain keys for each field to simplify later querying. The &lt;i&gt;message&lt;/i&gt;&amp;nbsp;key has been parsed to show &lt;i&gt;valid_message&lt;/i&gt;, solving the confusing use case&lt;i&gt;.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;This covers the top tip for developers getting started with Fluent Bit while trying to leverage a parser to clean up their telemetry data quickly and speed up their inner development loop.&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;More in the series&lt;/h3&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-family: inherit;"&gt;In this article you learned a few handy tricks for using Fluent Bit output plugins and routing to improve the inner developer loop experience. This article is based on this&amp;nbsp;&lt;a href="https://o11y-workshops.gitlab.io/workshop-fluentbit" rel="nofollow" target="_blank"&gt;online free workshop&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;There will be more in this series as you continue to learn how to configure, run, manage, and master the use of Fluent Bit in the wild. Next up, exploring some of the more interesting&amp;nbsp;&lt;a href="https://www.schabell.org/2025/12/mastering-fluentbit-top-3-telemetry-pipeline-processors-for-developers.html" rel="nofollow" target="_blank"&gt;Fluent Bit&amp;nbsp;&lt;i&gt;processors&lt;/i&gt;&amp;nbsp;for developers&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizWMukdHoHvTd9tv7xCWeuE7pR7qJHhMylxF9NBia1F42ssvrvkwDa4-gKevPOyHfPTq4fsnNEwjsYI7URCxftLs4azdPEZYdWDxFq8exPRwLPkUVJDn9rJik56Ii2kxyRWE7bHeNBheL4SeKgFvs0kMdS2cV4E6KTAChDO6o0BVNSsPCoRJZcrxkpLkE/s72-c/Mastering%20Fluent%20Bit%20Blog%20Series.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>All Things Open 2025 - Cloud Metrics: The Cost-Value Equation (slides)</title><link>http://www.schabell.org/2025/10/ato-2025-cloud-metrics-the-cost-value-equation-slides.html</link><category>Cloud</category><category>Cloud Data</category><category>Cloud Native</category><category>conference</category><category>Observability</category><pubDate>Tue, 14 Oct 2025 14:00:00 +0200</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-3944565531165976068</guid><description>&lt;p&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white; caret-color: rgb(68, 68, 68);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white; caret-color: rgb(68, 68, 68);"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg09fNY9Ae4x7zCBWYpiYeG5xvxMaJCKwbIVr7FpxLspeKyqLQfDwh5iC32ozYV9I4bjxFv4cXNahagAQMrZSklImmxWtnHNrGFgVcpWr5_yPpxIaGf_p5vC_qfW0A4jDa-riPA0LPrVmJ4_89jNS-f4ubXzovtQ0BjrGAEpYbqMZNbQXMynkd8Nmt9EUk/s960/ATO%202025%20Burst%20Talk%20-%20Cloud%20Metrics_%20The%20Cost-Value%20Equation%20.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg09fNY9Ae4x7zCBWYpiYeG5xvxMaJCKwbIVr7FpxLspeKyqLQfDwh5iC32ozYV9I4bjxFv4cXNahagAQMrZSklImmxWtnHNrGFgVcpWr5_yPpxIaGf_p5vC_qfW0A4jDa-riPA0LPrVmJ4_89jNS-f4ubXzovtQ0BjrGAEpYbqMZNbQXMynkd8Nmt9EUk/s320/ATO%202025%20Burst%20Talk%20-%20Cloud%20Metrics_%20The%20Cost-Value%20Equation%20.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white; caret-color: rgb(68, 68, 68);"&gt;As I &lt;a href="https://www.schabell.org/2025/06/ato-2025-cloud-metrics-the-cost-value-equation.html" rel="nofollow" target="_blank"&gt;previously mentioned&lt;/a&gt;, I missed the 2024 All Things Open, having&amp;nbsp;&lt;/span&gt;&lt;a href="https://www.schabell.org/2023/10/all-things-open-2023-terrifying-execs-into-action-slides.html" rel="nofollow" target="_blank"&gt;last spoken in 2023&lt;/a&gt;&lt;span style="background-color: white; caret-color: rgb(68, 68, 68);"&gt;, but I'm back this year at&amp;nbsp;&lt;/span&gt;&lt;a href="https://2025.allthingsopen.org/" rel="nofollow" target="_blank"&gt;All Things Open&lt;/a&gt; in Raleigh, NC&lt;span style="background-color: white; caret-color: rgb(68, 68, 68);"&gt;!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;span style="background-color: white;"&gt;&lt;span style="font-family: inherit;"&gt;I'm a big fan of the All Things Open conferences and meetups, as they have been a rock star organization since they started and always put on great events in the state of North Carolina. This year is the 13th edition and I've only missed the events across the pandemic years.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;span style="font-family: inherit;"&gt;The selection committee was kind enough to select one of my favorite topics that I've been working on within my current team at Chronosphere, cloud metrics and cost-value equations. Today I was on-site and gave this burst-talk session. I wanted to share the slides and my thoughts on the attendee reactions.&lt;/span&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;span style="font-family: inherit;"&gt;First, here are the slides with speaker notes if you download them.&lt;/span&gt;&lt;/p&gt;

&lt;div align="center"&gt;
  &lt;iframe allowfullscreen="" frameborder="0" height="420" marginheight="0" marginwidth="0" scrolling="no" src="https://www.slideshare.net/slideshow/embed_code/key/fuSpaVBBSfx3IH" style="border-width: 1px; border: var(--border-1) solid #CCC; margin-bottom: 5px; max-width: 100%;" width="510"&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;span style="font-family: inherit;"&gt;Finally, let's look at the abstract and details of my session.&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;&lt;div class="separator" style="caret-color: rgb(68, 68, 68); clear: both; color: #444444; font-family: Georgia, Utopia, &amp;quot;Palatino Linotype&amp;quot;, Palatino, serif; font-size: 14px; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6JwBge4kkXiSFe2CnJfi2cHAF0B3W6h-dugJzB58zfRJ5ERWBFdjYO6I0m4JK5FhrrqJV3iSU8AdNkibWW9lXuZi16wo-HmmlJtvF57p1ULvSF-tdhzxrXbFJt9Z7tjffVs12U6mmT8jcMeZieGq4IbQS5b_6vP6_dZdsxusfzpRGG-xHmj5fJDN22Po/s701/Screenshot%202025-07-11%20at%2011.37.32.png" style="clear: right; color: #2fbf71; float: right; margin-bottom: 1em; margin-left: 1em; text-decoration: none;"&gt;&lt;img border="0" data-original-height="701" data-original-width="600" height="320" loading="lazy" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6JwBge4kkXiSFe2CnJfi2cHAF0B3W6h-dugJzB58zfRJ5ERWBFdjYO6I0m4JK5FhrrqJV3iSU8AdNkibWW9lXuZi16wo-HmmlJtvF57p1ULvSF-tdhzxrXbFJt9Z7tjffVs12U6mmT8jcMeZieGq4IbQS5b_6vP6_dZdsxusfzpRGG-xHmj5fJDN22Po/s320-rw/Screenshot%202025-07-11%20at%2011.37.32.png" style="-webkit-box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 0px; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border-radius: 0px; border: 1px solid transparent; box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 0px; padding: 8px; position: relative;" width="274" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="https://2025.allthingsopen.org/sessions/2-for-1-cloud-metrics-the-cost-value-equation-beyond-the-ai-buzz-a-pragmatic-leaders-guide-to-real-world-value" rel="nofollow" target="_blank"&gt;Cloud Metrics: The Cost-Value Equation&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;i&gt;&lt;span style="font-family: inherit;"&gt;Are you collecting just about every metric under the sun and the kitchen sink too? Understanding the cost of collecting metrics and the usefulness of those metrics is the only way to scale in a cloud native world. You can’t get away with just collecting everything as you grow.&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;i&gt;&lt;span style="font-family: inherit;"&gt;Your observability teams need to make decisions about what to collect, what to drop, what to aggregate, and still be able to alert, triage, remediate, and do their root cause analysis on a daily basis. Gain immediate insights into high cost data (DPPS), when to drop time series data, and how to determine when the value of that data is at its lowest. Session includes a recorded demo video of it in action.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;span style="font-family: inherit;"&gt;Thanks to all who attended this talk and for all the questions! I look forward to seeing you all in Raleigh again soon!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg09fNY9Ae4x7zCBWYpiYeG5xvxMaJCKwbIVr7FpxLspeKyqLQfDwh5iC32ozYV9I4bjxFv4cXNahagAQMrZSklImmxWtnHNrGFgVcpWr5_yPpxIaGf_p5vC_qfW0A4jDa-riPA0LPrVmJ4_89jNS-f4ubXzovtQ0BjrGAEpYbqMZNbQXMynkd8Nmt9EUk/s72-c/ATO%202025%20Burst%20Talk%20-%20Cloud%20Metrics_%20The%20Cost-Value%20Equation%20.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item><item><title>SRECon Eu 2025 - The Executive Signal (slides)</title><link>http://www.schabell.org/2025/10/srecon-eu-2025-the-executive-signal-slides.html</link><category>Cloud</category><category>Cloud Data</category><category>Cloud Native</category><category>conference</category><category>Observability</category><category>Tips&amp;Tricks</category><pubDate>Wed, 8 Oct 2025 18:00:00 +0200</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-3868547292717970492.post-4003792701355845716</guid><description>&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyi-xvU3r3U3fb3ixJVaH8MYSwOev8EzupaZvvQ3pZfgLZSbwNNDvFOiWl6Sm4YGlKKvmXYSY2bAJDVv1qhGAIZcLRxSPSKdr8uZeSgVXTIFmo0dWR8-V_LBeG69FtqLAl1f1Q4p-YOqKWpbWENokoe4O3L-YUGMwVnYzGzbEeQ4btvvVqJLEGV5yyD0o/s960/LT%20-%20The%20Executive%20Signal_%20How%20to%20Cut%20Through%20the%20Noise%20and%20Drive%20Change.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="540" data-original-width="960" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyi-xvU3r3U3fb3ixJVaH8MYSwOev8EzupaZvvQ3pZfgLZSbwNNDvFOiWl6Sm4YGlKKvmXYSY2bAJDVv1qhGAIZcLRxSPSKdr8uZeSgVXTIFmo0dWR8-V_LBeG69FtqLAl1f1Q4p-YOqKWpbWENokoe4O3L-YUGMwVnYzGzbEeQ4btvvVqJLEGV5yyD0o/s320/LT%20-%20The%20Executive%20Signal_%20How%20to%20Cut%20Through%20the%20Noise%20and%20Drive%20Change.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;i style="caret-color: rgb(68, 68, 68);"&gt;"&lt;a href="https://www.usenix.org/conference/srecon25emea" rel="nofollow" target="_blank"&gt;SREcon25 Europe/Middle East/Africa&lt;/a&gt;&amp;nbsp;&lt;/i&gt;is a gathering of engineers who care deeply about site reliability, systems engineering, and working with complex distributed systems at scale. SREcon strives to challenge both those new to the profession as well as those who have been involved in it for decades. The conference has a culture of critical thought, deep technical insights, continuous improvement, and innovation.&lt;i style="caret-color: rgb(68, 68, 68);"&gt;"&lt;/i&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;Today I shared some insights into the executive signal and gave some important tips that everyone can use to cut through the noise and drive change. Below I share the slides from my talk.&lt;/p&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;p style="caret-color: rgb(68, 68, 68);"&gt;The following are the slides from my session, which was just 4 mins!&lt;/p&gt;

&lt;div align="center"&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="420" marginheight="0" marginwidth="0" scrolling="no" src="https://www.slideshare.net/slideshow/embed_code/key/j5BnrqFv0YRLHB" style="border-width: 1px; border: var(--border-1) solid #CCC; margin-bottom: 5px; max-width: 100%;" width="510"&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p style="caret-color: rgb(68, 68, 68);"&gt;&lt;span style="background-color: white; font-family: inherit;"&gt;The title and abstract are provided below for completeness:&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;The Executive Signal: How to Cut Through the Noise and Drive Change&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAYzvCU9yKbQQbuUhiP7tPZrs9lQLYRpbmmszJoRslzCtR9kYtf2Gd7ooujqwFdMoRg8HeZ4SL9N3MkuIgV4xYIB98AGgxgKotu1VDAnqvatYjl1pvCTIMdhEUWhj6vYrIh7_79VwDCqdqF4v-0LGvgKwNTYmSTeNdmYaXL22ngPsWtWDnzNO1jPMq5yA/s4592/davide-cantelli-H3giJcTw__w-unsplash.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" data-original-height="3064" data-original-width="4592" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAYzvCU9yKbQQbuUhiP7tPZrs9lQLYRpbmmszJoRslzCtR9kYtf2Gd7ooujqwFdMoRg8HeZ4SL9N3MkuIgV4xYIB98AGgxgKotu1VDAnqvatYjl1pvCTIMdhEUWhj6vYrIh7_79VwDCqdqF4v-0LGvgKwNTYmSTeNdmYaXL22ngPsWtWDnzNO1jPMq5yA/s320/davide-cantelli-H3giJcTw__w-unsplash.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;i&gt;Cloud native teams often live closest to the problems—but their voices are the last to be heard. Despite offering real solutions, many engineers find their concerns ignored by executive decision-makers. The result? Ongoing firefighting, chronic on-call stress, and ultimately, burnout. With developers spending more than 10 hours a week reacting to incidents, faster and smarter executive action isn’t optional—it’s essential.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;In this lightning talk, you’ll learn how to bridge the communication gap between technical teams and leadership. We’ll cover three actionable techniques you can start using today to make your message resonate—turning engineering pain into executive priority. If you want to stop spinning in operational chaos and start getting leadership buy-in, this talk will give you the tools to drive real change—without waiting for burnout to make the case for you.&lt;/i&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;One core topic:&amp;nbsp;&lt;/i&gt;&lt;i style="font-family: inherit;"&gt;This talk will show 3 simple tricks on how to engage effectively with leadership to invoke change.&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: inherit;"&gt;Thanks to all who joined us on Wed, 8 October for the rapid fire lightning talks!&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyi-xvU3r3U3fb3ixJVaH8MYSwOev8EzupaZvvQ3pZfgLZSbwNNDvFOiWl6Sm4YGlKKvmXYSY2bAJDVv1qhGAIZcLRxSPSKdr8uZeSgVXTIFmo0dWR8-V_LBeG69FtqLAl1f1Q4p-YOqKWpbWENokoe4O3L-YUGMwVnYzGzbEeQ4btvvVqJLEGV5yyD0o/s72-c/LT%20-%20The%20Executive%20Signal_%20How%20to%20Cut%20Through%20the%20Noise%20and%20Drive%20Change.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>eric@schabell.org (eric@schabell.org)</author></item></channel></rss>