filebeat 启动流程

因为各种各样的原因,好久没有写博客了,还是希望能够坚持下来

讲解一下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启动流程基本清晰了。

你可能感兴趣的:(【Filebeat】)