Ubuntu 下 Filebeat 插件开发实践
一 开发方式与选型
二 快速上手 Processor 插件
// file: beats/x-pack/filebeat/processor/myplugin/sample.go
package myplugin
import (
"sync"
"github.com/elastic/beats/v7/libbeat/beat"
"github.com/elastic/beats/v7/libbeat/common"
"github.com/elastic/beats/v7/libbeat/processors"
"github.com/pkg/errors"
)
const pluginName = "sample_keep"
type sampleKeep struct {
config struct {
Keep uint `config:"keep" validate:"min=0"`
}
mu sync.Mutex
seen uint
}
func init() {
processors.RegisterPlugin(pluginName, newSampleKeep)
}
func newSampleKeep(cfg *common.Config) (processors.Processor, error) {
p := &sampleKeep{}
if err := cfg.Unpack(&p.config); err != nil {
return nil, errors.Wrapf(err, "fail to unpack config for %v", pluginName)
}
return p, nil
}
func (p *sampleKeep) Run(event *beat.Event) (*beat.Event, error) {
p.mu.Lock()
defer p.mu.Unlock()
if p.seen < p.config.Keep {
p.seen++
return event, nil
}
return nil, nil // 丢弃
}
func (p *sampleKeep) String() string { return pluginName }
processors:
- sample_keep:
keep: 1000
make filebeat,然后用 ./filebeat -e -c filebeat.yml 运行。logging.level: debug 排查。cfg.Unpack(&yourConfig) 解析配置,可结合 validate tag 做参数校验。sync.Mutex)。三 构建与运行要点
make filebeat 后直接运行生成的二进制。go build -buildmode=plugin -o myplugin.so path/to/plugin.go(插件需依赖与 Filebeat 一致的 libbeat 版本与 Go 版本)。./filebeat -e -c filebeat.yml -plugin ./myplugin.so(可多次 -plugin 加载多个插件)。四 常见问题与排查
processors: 缩进与名称是否与插件 String() 返回值一致;确认已随 beats 编译或正确通过 -plugin 加载;开启 logging.level: debug 查看插件注册与执行日志。cfg.Unpack 绑定结构体,并为字段添加 validate 规则;在 init() 中使用 processors.RegisterPlugin 注册。Run() 中做阻塞或耗时 I/O,必要时将耗时逻辑放到异步 goroutine 并控制并发度。