Skip to content

Latest commit

 

History

History
110 lines (82 loc) · 3.1 KB

GOLANG_OUTPUT_PLUGIN.md

File metadata and controls

110 lines (82 loc) · 3.1 KB

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:

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 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