【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

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

  • 2019-09-11
  • 本文字数:2151 字

    阅读完需:约 7 分钟

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

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


在监控系统中,日志处理就是采集服务运行时生成的原始日志,根据用户配置的解析规则,从中提取可用数据,形成监控指标的过程,这个过程一般由监控系统的日志采集 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 实现定制日志采集方面的工程实践经验。工程实现并不复杂,但细节较多,需要严谨的功能设计,编码和充分的测试,保障日志处理过程满足需求、资源合理利用,并提供良好的用户操作接口,逐步积累抽象出更多的通用性插件,降低用户使用成本。


作者介绍:


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


本文转载自公众号 AIOps 智能运维(ID:AI_Ops)。


原文链接:


https://mp.weixin.qq.com/s/yUQYeMYakmKz9pHe9sblwA


2019-09-11 22:361413

评论

发布
暂无评论
发现更多内容

设计千万级学生管理系统的考试试卷存储方案

Fan

架构师实战营

SAAS服务能有哪些优势

Geek_99967b

小程序 SaaS SaaS系统架构

流程测试支持批量参数导入,测试效率直接拉满!

Xd

数据库 后端 接口测试 测试工具

Vue-4-模板语法-1

Python研究所

前端 6月月更

『Three.js』起飞!

德育处主任

JavaScript canvas 前端可视化 three.js 6月月更

漫谈测试覆盖率

老张

软件测试 质量保障 质量度量

C#入门系列(十) -- 一维数组

陈言必行

C# 6月月更

企业无忧 | Apipost私有化部署活动即将火热开启

Xd

后端 apipost 接口测试工具

python小知识-python作用域和闭包

AIWeker

Python python小知识

Django API 开发:视图设置和路由

宇宙之一粟

django 6月月更

Vue中created和mounted的区别

devpoint

Vue Vue3 InfoQ极客传媒15周年庆

ES6新特性class类

大熊G

JavaScript 前端 6月月更

Neo 黑客松获奖名单揭晓,上万美金花落谁家?

TinTinLand

区块链

在线JSON转CSV工具

入门小站

工具

MySql事务

工程师日月

6月月更

Google搜索为什么不能无限分页?

蝉沐风

elasticsearch 深度分页

悬赏任务源码开发设计构建时,要留意哪些事项

开源直播系统源码

源码 软件开发 直播系统 悬赏任务源码

Linux编程_网页视频监控项目

DS小龙哥

6月月更

HPCA名人堂成员蒋晓维博士,任职大禹智芯首席科学家

硬科技星球

人工智能 阿里巴巴 大禹智芯 蒋晓维

在线文本字符串批量替换工具

入门小站

工具

运算符 (第二天)

Jason199

运算符 js 6月月更

知识图谱、图数据平台、图技术如何助力零售业飞速发展

蓝海大脑GPU

图计算 图数据分析 图数据一体机

如何在使用 Flutter时切换应用时隐藏应用预览

坚果

6月月更

InfoQ 极客传媒 15 周年庆征文|Socket请求和Http请求特点、区别及适用场景

No Silver Bullet

HTTP请求 6月月更 InfoQ极客传媒15周年庆 Socket请求

SpringBoot应用使用自定义的ApplicationContext实现类

程序员欣宸

Java spring springboot Spring Framework 6月月更

互联网公司研发效能团队为啥必须独立?何时独立?

laofo

互联网 DevOps cicd 研发效能 工程效率

SAP 云平台多目标应用 Multi-Target Application 的开发技术介绍

Jerry Wang

云原生 Cloud SAP CloudFoundry 6月月更

hashmap的底层机制

卢卡多多

集合 6月月更

只需八步将小程序一键打包生成App

Geek_99967b

小程序 小程序转app

Python时区转换的两种方式

红毛丹

Python 6月月更

InfoQ 极客传媒 15 周年庆征文|【Python技能树共建】异常捕获预处理

梦想橡皮擦

Python 6月月更 InfoQ极客传媒15周年庆

日志监控实践 - 监控Agent集成Lua引擎实现多维度日志采集_文化 & 方法_董涵_InfoQ精选文章