filebeat 数据采集流程

2024-02-29 19:48
文章标签 数据 流程 采集 filebeat

本文主要是介绍filebeat 数据采集流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

filebeat启动流程 讲解了filebeat的启动流程,filebeat在构建完crawler对象,开始采集流程。


Crawlerstart方法内,会启动Inputs

func (c *Crawler) Start(pipeline beat.Pipeline,r *registrar.Registrar,configInputs *common.Config,configModules *common.Config,pipelineLoaderFactory fileset.PipelineLoaderFactory,overwritePipelines bool,
) error {...for _, inputConfig := range c.inputConfigs {err := c.startInput(pipeline, inputConfig, r.GetStates())if err != nil {return err}}...
}

c.startInput(pipeline, inputConfig, r.GetStates())方法初始化Input

  1. 首先构建Input对象
  2. 运行Input
func (c *Crawler) startInput(pipeline beat.Pipeline,config *common.Config,states []file.State,
) error {if !config.Enabled() {return nil}connector := channel.ConnectTo(pipeline, c.out)p, err := input.New(config, connector, c.beatDone, states, nil)...// 开始收集p.Start()return nil
}

p.Start()方法内启动Input,他在一个单独的协程里运行。

这里的p是对Input的封装,他的Run方法是对某个接口的实现,因为我们用来收集日志,所以我们只需要关心filebeat/input/log/input.go文件内的Run方法。Run方法内部调用了Inputscan方法,开始采集数据。

// Run runs the input
func (p *Input) Run() {...p.scan()...
}

scan方法内首先获取所有的文件。其次获取文件状态,根据状态来判定收集最新数据,还是从历史文件收集。文件收集会构建Harvester对象。

// Scan starts a scanGlob for each provided path/glob
func (p *Input) scan() {var sortInfos []FileSortInfovar files []string// 获取应该获取到的所有文件paths := p.getFiles()var err error...for i := 0; i < len(paths); i++ {var path stringvar info os.FileInfoif sortInfos == nil {path = files[i]info = paths[path]} else {path = sortInfos[i].pathinfo = sortInfos[i].info}select {case <-p.done:logp.Info("Scan aborted because input stopped.")returndefault:}newState, err := getFileState(path, info, p)if err != nil {logp.Err("Skipping file %s due to error %s", path, err)}// Load last statelastState := p.states.FindPrevious(newState)...// Decides if previous state existsif lastState.IsEmpty() {logp.Debug("input", "Start harvester for new file: %s", newState.Source)// 准备构建 harvester 了err := p.startHarvester(newState, 0)if err == errHarvesterLimit {logp.Debug("input", harvesterErrMsg, newState.Source, err)continue}if err != nil {logp.Err(harvesterErrMsg, newState.Source, err)}} else {// 从历史文件开始处理p.harvestExistingFile(newState, lastState)}}
}

p.startHarvester(newState, 0)内构建harvester。(harvester是另一个filebeat官网描述的核心组件之一)

func (p *Input) startHarvester(state file.State, offset int64) error {if p.numHarvesters.Inc() > p.config.HarvesterLimit && p.config.HarvesterLimit > 0 {p.numHarvesters.Dec()harvesterSkipped.Add(1)return errHarvesterLimit}// Set state to "not" finished to indicate that a harvester is runningstate.Finished = falsestate.Offset = offset// Create harvester with state// 这部分构建了 harvesterh, err := p.createHarvester(state, func() { p.numHarvesters.Dec() })if err != nil {p.numHarvesters.Dec()return err}// 配置 harvestererr = h.Setup()if err != nil {p.numHarvesters.Dec()return fmt.Errorf("error setting up harvester: %s", err)}// Update state before staring harvester// This makes sure the states is set to Finished: false// This is synchronous state update as part of the scanh.SendStateUpdate()// 启动 harvesterif err = p.harvesters.Start(h); err != nil {p.numHarvesters.Dec()}return err
}
  1. p.createHarvester构建harvester
  2. p.Setup配置harvesterSetup方法内会初始化文件相关的内容,以及构建文件reader
  3. p.harvesters.Start(h)运行harvester

主要还是要看harvesters.Start方法,会在单独的协程内运行harvester

func (r *Registry) Start(h Harvester) error {// Make sure stop is not called during starting a harvesterr.Lock()defer r.Unlock()...go func() {defer func() {r.remove(h)r.wg.Done()}()// 异步运行err := h.Run()if err != nil {logp.Err("Error running input: %v", err)}}()return nil
}

harvester.Run方法真是长。。

func (h *Harvester) Run() error {// 这坨简直了for {...// 读取文件内容message, err := h.reader.Next()// 糟糕的异常处理。。。if err != nil {switch err {...}return nil}state := h.getState()startingOffset := state.Offsetstate.Offset += int64(message.Bytes)...// 读取到的文件内容text := string(message.Content)...// 数据内容都包装在 data 内,harvester 发送 data,其实就是 forwarder 转发的if !h.sendEvent(data, forwarder) {return nil}// Update state of harvester as successfully senth.state = state}
}

h.sendEvent(data, forwarder)这段代码将采集的数据发送到下游,内部其实就是用forwarder转发了数据。

到这里数据的采集流程应该就差不多了,剩下的是数据的发送流程。

这篇关于filebeat 数据采集流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/759876

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

nodejs打包作为公共包使用的完整流程

《nodejs打包作为公共包使用的完整流程》在Node.js项目中,打包和部署是发布应用的关键步骤,:本文主要介绍nodejs打包作为公共包使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言一、前置准备二、创建与编码三、一键构建四、本地“白嫖”测试(可选)五、发布公共包六、常见踩坑提醒

Ubuntu向多台主机批量传输文件的流程步骤

《Ubuntu向多台主机批量传输文件的流程步骤》:本文主要介绍在Ubuntu中批量传输文件到多台主机的方法,需确保主机互通、用户名密码统一及端口开放,通过安装sshpass工具,准备包含目标主机信... 目录Ubuntu 向多台主机批量传输文件1.安装 sshpass2.准备主机列表文件3.创建一个批处理脚

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

一个Java的main方法在JVM中的执行流程示例详解

《一个Java的main方法在JVM中的执行流程示例详解》main方法是Java程序的入口点,程序从这里开始执行,:本文主要介绍一个Java的main方法在JVM中执行流程的相关资料,文中通过代码... 目录第一阶段:加载 (Loading)第二阶段:链接 (Linking)第三阶段:初始化 (Initia

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl