日志和指标数据采集使用logtail,整个数据采集过程如图:



其提供了非常灵活的环亚电游官网插件机制,共有四种类型的插件:


inputs:输入插件,获取数据;

processors:处理插件,对得到的数据进行处理;

aggregators:聚合插件,对数据进行聚合;

flushers:输出插件,将数据输出到指定sink。


由于指标数据的获取需要调用本地机器上的服务接口获取,因此应尽量减少请求次数,在logtail中,一个input占用一个goroutine。


闲鱼通过定制input插件和processors插件,将多个指标数据在一个input插件中通过一次服务请求获取,并将其格式化成一个json数组对象,在processors插件中再拆分成多条数据,以减少系统的io次数同时提升性能。



数据传输使用LogHub,logtail写入数据后直接由blink消费其中的数据,只需设置合理的分区数量即可。分区数要大于等于blink读取任务的并发数,避免blink中的任务空转。



预处理主要采用blink实现,主要的设计和优化点:


1)编写高效的计算流程


blink是一个有状态的流计算框架,非常适合做实时聚合、join等操作。在我们的应用中只需要关注出现错误的的请求上相关服务链路的调用情况,因此整个日志处理流分成两个流:


服务的请求入口日志作为一个单独的流来处理,筛选出请求出错的数据;

其他中间链路的调用日志作为另一个独立的流来处理,通过和上面的流join on traceid实现出错服务依赖的请求数据塞选。



如上图所示通过双流join后,输出的就是所有发生请求错误相关链路的完整数据。



blink在做join的时候本质上是通过state缓存中间数据状态,然后做数据的匹配。而如果state的生命周期太长会导致数据膨胀影响性能,如果state的生命周期太短就会无法正常关联出部分延迟到来的数据,所以需要合理的配置state生存周期,对于该应用允许最大数据延迟为1分钟。