WASM Filter Plugins
WebAssembly is binary instruction format for stack based virtual machine.
Calyptia Fluent Bit currently supports integration of wasm plugins built as wasm/wasi objects for input and filter plugins only. The interface for the WASM filter plugins is currently under development but is functional.
Prerequisites
Building flb-wamrc (optional)
flb-wamrc
is just flb-
prefixed AOT (Ahead Of Time) compiler that is provided from wasm-micro-runtime.
For flb-wamrc
support, users have to install llvm infrastructure, e.g:
For Build WASM programs
Currently, Calyptia Fluent Bit supports the following WASM toolchains:
Rust on
wasm32-unknown-unknown
.rustc 1.62.1 (e092d0b6b 2022-07-16) or later
TinyGo on wasm32-wasi
v0.24.0 or later
WASI SDK 13 or later.
Build a WASM Filter for Filter Plugin
Currently, Calyptia Fluent Bit's WASM filter assumes C ABI that is also known as wasm32-unknown-unknown
on Rust target and wasm32-wasi
on TinyGo target.
To Install Additional Components
TinyGo and WASI SDK support wasm target by default. When using Rust's wasm32-unknown-unknown
target, users must install wasm32-unknown-unknown
via rustup. Then, installing that target components as:
Requirements of WASM programs
WASM filter plugins execute the function that has the following signagure.
For C:
For Go(TinyGo):
For Rust:
Note that //export XXX
on TinyGo and #[no_mangle]
attributes on Rust are required. This is because TinyGo and Rust will mangle their function names if they are not specified.
Once built, a WASM program will be available. Then, that built program can be executed with the following Calyptia Fluent Bit configuration:
For example, one of the examples of Rust WASM filter should generate its filtered logs as follows:
Optimize execution of WASM programs
To optimize WASM program execution, there is the option of using flb-wamrc
. flb-wamrc
will reduce runtime footprint and to be best perforemance for filtering operations. This tool will be built when -DFLB_WAMRC=On
cmake option is specififed and llvm infrastructure is installed on the building box.
For further optimizations to the specific CPU such as Cortex-A57 series, e.g:
Then, when AOT (Ahead Of Time) compiling is succeeded:
Note that AOT compiling should generate CPU architecture-dependent objects. If users want to use AOT compiled object on the different archtecture, it must align the target and target cpu for actual environments.
Further Concrete Examples
C Filter
https://github.com/fluent/fluent-bit/tree/master/examples/filter_wasm_c
Rust Filter
https://github.com/fluent/fluent-bit/tree/master/examples/filter_rust
TinyGo Filter
https://github.com/fluent/fluent-bit/tree/master/examples/filter_wasm_go
Last updated