日志监控实践 – 监控Agent集成Lua引擎实现多维度日志采集

作者简介:董涵    百度资深研发工程师

负责百度智能运维(Noah)服务管理和分布式监控架构研发工作,在分布式系统和大规模数据处理、可用性工程方向有广泛的实践经验。

干货概览

对于互联网行业来说,最有价值的数据往往蕴含在服务的日志之中。从日志中,我们不仅仅可以获取到服务的使用量、服务效果、问题定位信息等,还可以通过监控系统及时地识别出服务的”健康”状态,规避风险,推动服务优化升级。

监控系统中,日志处理就是采集服务运行时生成的原始日志,根据用户配置的解析规则,从中提取可用数据,形成监控指标的过程,这个过程一般由监控系统的日志采集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变量等信息的采集。

性能方面仍有提升的空间。当前的日志处理是单进程单线程中运行日志处理引擎解决需求,扩展成为多线程,利用并发方式可以有效提升吞吐量总  结

以上是百度智能运维(Noah)在使用Lua实现定制日志采集方面的工程实践经验。工程实现并不复杂,但细节较多,需要严谨的功能设计,编码和充分的测试,保障日志处理过程满足需求、资源合理利用,并提供良好的用户操作接口,逐步积累抽象出更多的通用性插件,降低用户使用成本。

Image placeholder
zhuyi
未设置
  83人点赞

没有讨论,发表一下自己的看法吧

推荐文章
PHP 进程池与轮询调度算法实现多任务

phper请了解进程调度策略,CPU时间片,进程控制【创建,销毁,回收,进程信号】与及进程运行流程和基本的进程组,信号中断原理,以及进程之间的关系。关于进程的更多内容可参考本人前面撸过的文章或是百度了

CSS实现多行省略

什么是多行省略?当字数多到一定程度就显示省略号点点点。最初只是简单的点点点,之后花样越来越多,点点点加下箭头,点点点加更多,点点点加更多加箭头...。多行省略就是大段文字后面的花式点点点。同行这么做:

Python爬虫:手把手教你采集登陆后才能看到数据

课程推荐:Python开发工程师--学习猿地--送9个上线商业项目 爬虫在采集网站的过程中,部分数据价值较高的网站,会限制访客的访问行为。这种时候建议通过登录的方式,获取目标网站的cookie,然后再

百度智能监控场景下的HBase实践

作者简介   张洋洋  百度高级研发工程师负责百度智能运维产品(Noah)的分布式时序数据库和通用配额管理平台的设计研发工作,在分布式存储和配额管理方向有广泛的实践经验。干货概览通过百度大规模时序数据

闲鱼Flutter互动引擎系列——整体设计篇

什么是Candy引擎Candy引擎是闲鱼技术团队设计开发的一款:APP嵌入式的、轻量级的、易于开发、性能稳定的互动引擎;绘制系统高度融合Flutter体系,游戏场景和FlutterUI支持无缝混排;动

SpringBoot 集成 JWT 实现 token 验证,token 注销

什么是JWT Jsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形

influxDB集群模式实践

influxDB数据库以其优秀的时序数据存储和查询能力,在处理和分析类似资源监控等时序数据方面得到了广泛的应用。而influxDB自带的各种特殊函数如求平均值、标准差、随机取数据,使数据分析变得十分方

Hyperf 发布 Session、极简 DB、zk 配置中心组件和支持 Twig/Plates 视图引擎支持

更新内容 本周更新主要新增极简DB组件,Zookeeper配置中心,和Session组件,以及为视图组件增加了Twig和Plates视图引擎的支持,同时为计划任务组件增加了集群执行的支持。极简DB组件

Go语言高级编程_6.4 分布式搜索引擎

6.4分布式搜索引擎 在Web一章中,我们提到MySQL很脆弱。数据库系统本身要保证实时和强一致性,所以其功能设计上都是为了满足这种一致性需求。比如writeaheadlog的设计,基于B+树实现的索

搜索引擎百度已死,但其他业务在重生

年初有一篇《搜索引擎百度已死》的文章在全网刷屏,文章尖锐指出百度搜索有一半以上结果导向了自己的百家号,而百家号上大量低劣和营销的内容严重误导了用户,事后百度回应说其百家号的内容占比小于10%。与此同时

Nebula 架构剖析系列(二)图数据库的查询引擎设计

摘要上文(存储篇)说到数据库重要的两部分为存储和计算,本篇内容为你解读图数据库Nebula在查询引擎QueryEngine方面的设计实践。在Nebula中,QueryEngine是用来处理Nebula

MongoDB 存储引擎与内部原理

一、存储引擎(Storage)mongodb3.0默认存储引擎为MMAPV1,还有一个新引擎wiredTiger可选,或许可以提高一定的性能。mongodb中有多个databases,每个databa

你公司到底需不需要引入实时计算引擎?| 推荐

大数据发展至今,数据呈指数倍的增长,对实效性的要求也越来越高,于是像上面这种需求也变得越来越多了。那这些场景对应着什么业务需求呢?我们来总结下,大概如下:初看这些需求,是不是感觉很难?那么我们接下来来

TPC-C解析系列04_TPC-C基准测试之数据库事务引擎的挑战

OceanBase这次TPC-C测试与榜单上Oracle和DB2等其他数据库在硬件使用上有非常大的不同,OceanBase的数据库服务器使用的是204+3台型号是ecs.i2.16xlarge阿里云E

微软张若非:搜索引擎和广告系统,那些你所不知的AI落地技术

这两年,被誉为“ 皇冠上的明珠”的自然语言处理领域发展愈发火热,成为了业内新宠,而 搜索和广告这两大老牌技术领域似乎已被大家遗忘。其实,这两大接地气的工程领域仍是各企业竞相抢夺的市场之一。近日,AI科

SQL Server 2014的数据库引擎新增功能(参考sqlserver官方文档)

SQLServer2014数据库引擎引入了一些新功能和增强功能,这些功能可以提高设计、开发和维护数据存储系统的架构师、开发人员和管理员的能力和工作效率。  以下是 数据库引擎已增强的方面。数据库引擎功

可视化的JavaScript:JavaScript引擎运行原理

JavaScript很酷,但是JavaScript引擎是如何才能理解我们编写的代码呢?作为JavaScript开发人员,我们通常不需要自己处理编译器。然而,了解JavaScript引擎的基础知识并了解

十分钟打造一个极简的模板“引擎”

地址:https://zhuanlan.zhihu.com/p/100804827友情链接: v-easy-components-基于Vue2.x的组件命令库 逸宿-一款预定民宿的webapp(毕

Lumen日志接入 Elasticsearch

日志分析系统的安装请看部署章节,安装elasticsearch组件composerrequireelasticsearch/elasticsearch修改config/logging.php添加一个e

集成 think-ORM 的 symfony bundle thinkorm-bundle

thinkorm-bundleSymfonyThinkOrmBundle关于thinkorm-bundle允许在你symfony使用thinkorm.所安装$composerrequireccwwwo

全面集成阿里云,Salesforce在中国正式转正

进入2019年,SaaS竞争已进入深水区,当很多CRM厂商还在庆幸Salesforce在中国没有准入资格时,Salesforce已经在悄然布局,曲线入市。7月25日,在阿里云峰会·上海站上,全球最大C

如何将echarts集成到react中

如何将echarts集成到react中在使用echarts之前需要先安装echarts,可以直接使用node命令来安装npminstallecharts--save包依赖安装完毕后,这个时候我们的EC

基于JS的高性能Flutter动态化框架MXFlutter

导语:18年10月份,手机QQ看点团队尝试使用Flutter,做为iOS开发,一接触到Flutter就马上感受到,Flutter虽然强大,但不能像RN一样动态化是阻碍我们使用她的唯一障碍了。看Goog

Stylus系列——webpack-spritesmith配合stylus使用示例

一、前言基于Webpack的CSSSprites实现方案,若是直接在html中调用雪碧图图标已经很方便,但是实际开发过程可能遇到需要在伪元素中使用雪碧图,或者需要hover切换另一个图标,这种情况下就

Flutter路由项目实战之fluro

github:https://github.com/zhengzhuan...关于flutter路由,在小项目中,就按照原生写法,但是在大型项目中,这样的我就不会进行推荐,我这里使用的fluro路由管