summaryrefslogtreecommitdiffstats
path: root/src/fluent-bit/GOLANG_OUTPUT_PLUGIN.md
diff options
context:
space:
mode:
Diffstat (limited to 'src/fluent-bit/GOLANG_OUTPUT_PLUGIN.md')
-rw-r--r--src/fluent-bit/GOLANG_OUTPUT_PLUGIN.md110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/fluent-bit/GOLANG_OUTPUT_PLUGIN.md b/src/fluent-bit/GOLANG_OUTPUT_PLUGIN.md
new file mode 100644
index 000000000..8ad2782ef
--- /dev/null
+++ b/src/fluent-bit/GOLANG_OUTPUT_PLUGIN.md
@@ -0,0 +1,110 @@
+# Fluent Bit + Golang output plugins
+
+The current development version of Fluent Bit, integrates support to load
+_shared_ plugins built in Golang. The interface still needs some adjustment
+but is functional. The expectation is to release Fluent Bit v0.10 with full
+support for Go.
+
+## Getting Started
+
+Compile Fluent Bit with Golang support, e.g:
+
+```
+$ cd build/
+$ cmake -DFLB_DEBUG=On -DFLB_PROXY_GO=On ../
+$ make
+```
+
+Once compiled, we can see a new option in the binary `-e` which stands for
+_external plugin_, e.g:
+
+```
+$ bin/fluent-bit -h
+Usage: fluent-bit [OPTION]
+
+Available Options
+ -c --config=FILE specify an optional configuration file
+ -d, --daemon run Fluent Bit in background mode
+ -f, --flush=SECONDS flush timeout in seconds (default: 5)
+ -i, --input=INPUT set an input
+ -m, --match=MATCH set plugin match, same as '-p match=abc'
+ -o, --output=OUTPUT set an output
+ -p, --prop="A=B" set plugin configuration property
+ -e, --plugin=FILE load an external plugin (shared lib)
+ ...
+```
+
+## Build a plugin in Go
+
+To make easier to build plugins, we have published a _fluent-bit-go_ package:
+
+http://github.com/fluent/fluent-bit-go
+
+In the same repository we have published a plugin example called
+__out_multiinstance__ that just prints the records to the standard output:
+
+https://github.com/fluent/fluent-bit-go/tree/master/examples/out_multiinstance
+
+At a minimum, a Go plugin looks like this:
+
+```go
+package main
+
+import "github.com/fluent/fluent-bit-go/output"
+
+//export FLBPluginRegister
+func FLBPluginRegister(def unsafe.Pointer) int {
+ // Gets called only once when the plugin.so is loaded
+ return output.FLBPluginRegister(ctx, "gstdout", "Stdout GO!")
+}
+
+//export FLBPluginInit
+func FLBPluginInit(plugin unsafe.Pointer) int {
+ // Gets called only once for each instance you have configured.
+ return output.FLB_OK
+}
+
+//export FLBPluginFlushCtx
+func FLBPluginFlushCtx(ctx, data unsafe.Pointer, length C.int, tag *C.char) int {
+ // Gets called with a batch of records to be written to an instance.
+ return output.FLB_OK
+}
+
+//export FLBPluginExit
+func FLBPluginExit() int {
+ return output.FLB_OK
+}
+
+func main() {
+}
+```
+
+The code above is a template to write an output plugin. It's really important
+to keep the package name as `main` and add an explicit `main()` function.
+This is a requirement as the code will be built as a shared library.
+
+To build the code above, use the following line:
+
+```go
+$ go build -buildmode=c-shared -o out_gstdout.so out_gstdout.go
+```
+
+Once built, a shared library called `out_gstdout.so` will be available. It's
+really important to double check the final .so file is what we expect. Doing a
+`ldd` over the library we should see something similar to this:
+
+```
+$ ldd out_gstdout.so
+ linux-vdso.so.1 => (0x00007fff561dd000)
+ libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc4aeef0000)
+ libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc4aeb27000)
+ /lib64/ld-linux-x86-64.so.2 (0x000055751a4fd000)
+```
+
+## Run Fluent Bit + the new plugin
+
+```
+$ bin/fluent-bit -e /path/to/out_gstdout.so -i cpu -o gstdout
+```
+
+For more details or assistance write to eduardo@treasure-data.com