因为各种各样的原因,好久没有写博客了,还是希望能够坚持下来
讲解一下filebeat
的启动流程吧,核心功能先不描述了0.0
filebeat
启动入口在main.go
文件内, cmd.RootCmd.Execute()
启动filebeat
;
func main() {
if err := cmd.RootCmd.Execute(); err != nil {
os.Exit(1)
}
}
在 filebeat/cmd/root.go
文件内,加载&初始化相关的配置,以及构建filebeat
对象。下面代码里的beater.New
方法会构建了filebeat
对象。GenRootCmdWithSettings
方法内会构建启动filebeat
相关命令。
var RootCmd *cmd.BeatsRootCmd
func init() {
...
RootCmd = cmd.GenRootCmdWithSettings(beater.New, instance.Settings{RunFlags: runFlags, Name: Name})
...
}
GenRootCmdWithSettings
函数在filebeat/libbeat/cmd/root.go
文件内。此函数内会调用filebeat/libbeat/cmd/run.go
文件内的func genRunCmd(settings instance.Settings, beatCreator beat.Creator) *cobra.Command
方法。
func genRunCmd(settings instance.Settings, beatCreator beat.Creator) *cobra.Command {
name := settings.Name
runCmd := cobra.Command{
Use: "run",
Short: "Run " + name,
Run: func(cmd *cobra.Command, args []string) {
err := instance.Run(settings, beatCreator)
if err != nil {
os.Exit(1)
}
},
}
...
}
根据方法名字就能关注到重点
instance.Run(settings, beatCreator)
Run
方法内会构建Beat
对象,并调用launch
方法。ps: go
里面对象的命名真是蛋疼
b, err := NewBeat(name, idxPrefix, version)
...
return b.launch(settings, bt)
launch
方法内又构建了Beater
对象(Beater
是个接口),并且在最后调用了Beater
接口的Run
方法启动。这个接口有多个实现,但是我们这里只需要关注一个,文件filebeat/beater/filebeat.go
文件内的Run
方法,这里就是启动filebeat
的实现。
func (b *Beat) launch(settings Settings, bt beat.Creator) error {
...
beater, err := b.createBeater(bt)
...
return beater.Run(&b.Beat)
}
在Run
方法内,会构建一个crawler
对象,此对象用来采集数据,工作原理其实是对Inputs
的包装,Inputs
就是filebeat
官网介绍的核心组件之一。
// Run allows the beater to be run as a beat.
func (fb *Filebeat) Run(b *beat.Beat) error {
...
crawler, err := crawler.New(
channel.NewOutletFactory(outDone, wgEvents).Create,
config.Inputs,
b.Info.Version,
fb.done,
*once)
if err != nil {
logp.Err("Could not init crawler: %v", err)
return err
}
...
err = crawler.Start(b.Publisher, registrar, config.ConfigInput, config.ConfigModules, pipelineLoaderFactory, config.OverwritePipelines)
if err != nil {
crawler.Stop()
return err
}
...
}
至此整个filebeat
启动流程基本清晰了。