十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
监控Agent集成Lua引擎怎么实现多维度日志采集,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
创新互联长期为上1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为西岗企业提供专业的网站建设、网站制作,西岗网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。
在监控系统中,日志处理就是采集服务运行时生成的原始日志,根据用户配置的解析规则,从中提取可用数据,形成监控指标的过程,这个过程一般由监控系统的日志采集Agent完成。
通用的日志采集Agent一般会提供多种日志解析方法,常用的有分隔符、K:V、正则表达式等。为了适配某些常用的系统或组件(例如:Nginx、Syslog等),有些日志采集Agent还会提供一些预制的日志解析配置,以期达到开箱即用的效果。
百度的业务场景十分复杂,涉及搜索服务、社区服务、金融服务、AI服务等,这些业务的程序所生产的日志格式存在较大差异,如何统一处理这些不同格式的日志成为一个重要的问题。今天,我们会从百度Noah监控平台的角度,讨论如何解决这一问题。
1K:V日志
如上图所示,这是一个典型的K:V形式组成的日志。
我们可以通过简单的分隔符将日志分隔开,并根据K:V的式样从日志中提取出uri、c_time、idc等监控项。
2多行日志
这是一个C++程序的Stack信息。需要将多行日志作为一个Trace信息进行完整提取,并且将每一行里面的函数名、文件名、行号单独提取,统一推送,用于批量实例的故障定位。
这个例子需要具备两个能力,多行日志处理和单行日志内提取字符串。
3混合日志
在这个例子中,每行日志混合了服务名、代码位置、用户自定义数据等信息。需要分别用分隔符、K:V和JSON解析的方式进行提取。
针对这些场景,一些开源方案(例如Logstash,Collectd)通过在配置文件中支持此类语义或插件的方式实现了此类功能。我们参考了这些开源实现,结合百度业务的场景,在监控采集Agent上通过日志插件功能实现日志处理需求。
实现插件时,需要重点考虑以下几方面:
1. 通用性和易用性:需要尽可能满足用户定制化需求, 并且开发简单。
2. 性能:典型的日志采集场景中,需要每秒处理数MB甚至数十MB的日志文件,并完成字段切分、正则匹配、数据格式转换等操作,需要处理引擎有较强的性能。
3. 可用性和安全性:Agent运行在线上生产服务器上,对稳定和安全有相当高的要求。
Agent日志插件实现
如何实现定制化的日志解析逻辑很简单。我们封装了Log解析类,包含获取单行日志和返回监控项解析结果的接口,供用户自定义日志解析脚本来调用。用户需要在日志解析脚本中实现Callback函数,在解析每行日志时,被Agent调用。
所有的日志处理逻辑完全在脚本中实现,例如,用户可以在脚本中维护全局Context,通过Context中保存的进度信息,完成多行日志的处理。
这里还封装了通用的日志处理工具库,以Lua内置类的形式提供,包含JSON、Debug等工具。
可用性和安全
Agent在所有服务器上运行,可用性和安全性是最重要的考量因素。
可用性方面,主要是避免自定义脚本本身的Bug或插件引擎Bug导致采集功能异常。除此之外,需要规避资源占用超限导致服务器上其它业务受影响。
对用户代码,需要严格规范资源占用量。执行插件的任务,作为一个单独的进程,使用Cgroup和Ulimit等机制限制资源占用,同时也作为执行隔离的手段,规避单个脚本或插件引擎的Bug影响所有采集任务正常执行。
另外,在任务执行时间上,也由Agent加以控制,避免任务超时运行。
安全性方面,自定义日志解析脚本需要配置中心统一托管,避免被篡改。
Lua本身提供的一些功能也做了屏蔽,例如io.open/io.popen/os.execute/os.remove等高危操作接口,避免从脚本调用外部程序,或做出删除系统文件等操作。
增强模式
经过一段时间的线上运行,在某些场景下,日志处理的性能无法满足需求。
对于通用日志采集场景,通过将Lua替换成Luajit,日志解析吞吐量获得约4倍的提升,可以覆盖我们几乎所有的通用日志采集场景。替换过程中需要关注兼容问题处理,例如Regexp语意和标准的Lua并不完全相同,lua_ctx最大数量限制等等。
特殊的业务需求场景,需要针对性地进行优化。例如,某些业务日志的采集过程中,需要进行UNIX时间戳到RFC格式的转换、IP地址到机房信息的转换等操作,在Lua脚本中通过查表或进行转换来实现需求的效率非常低。对于这些场景我们使用C++等语言封装了可以在Lua中直接调用的类,有效提升此类操作性能超过一个数量级。这种集成方式也可以用于支持一些定制功能,例如Protobuf和BaiduRPC变量等信息的采集。
性能方面仍有提升的空间。当前的日志处理是单进程单线程中运行日志处理引擎解决需求,扩展成为多线程,利用并发方式可以有效提升吞吐量。
关于监控Agent集成Lua引擎怎么实现多维度日志采集问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。