内容简介:作者简介董涵 百度资深研发工程师
作者简介
董涵 百度资深研发工程师
负责 百度智能运维(Noah) 服务管理和分布式监控架构研发工作,在 分布式系统 和大规模 数据处理、可用性工程方向有 广泛的实践经验。
干货概览
对于互联网行业来说,最有价值的数据往往蕴含在服务的日志之中。从日志中,我们不仅仅可以获取到服务的使用量、服务效果、问题定位信息等,还可以通过监控系统及时地识别出服务的 ” 健康 ” 状态,规避风险,推动服务优化升级 。
在 监控系统 中,日志处理就是采集服务运行时生成的原始日志,根据用户配置的解析规则,从中提取可用数据,形成监控指标的过程,这个过程一般由监控系统的日志采集Agent完成。
通用的日志采集Agent一般会提供多种日志解析方法,常用的有 分隔符 、 K:V 、 正则表达式 等。为了适配某些常用的系统或组件(例如:Nginx、Syslog等),有些日志采集Agent还会提供一些预制的日志解析配置,以期达到开箱即用的效果。
百度的业务场景十分复杂,涉及搜索服务、社区服务、金融服务、AI服务等,这些业务的程序所生产的日志格式存在较大差异,如何统一处理这些不同格式的日志成为一个重要的问题。今天,我们会从 百度Noah监控平台 的角度,讨论如 何解决这一问题 。
典型日志处理示例
1 K: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日志插件实现
这里还封装了通用的日志处理 工具 库,以Lua内置类的形式提供,包含JSON、Debug等工具。
可用性和安全
对用户代码,需要严格规范资源占用量。执行插件的任务,作为一个单独的进程,使用Cgroup和Ulimit等机制限制资源占用,同时也作为执行隔离的手段,规避单个脚本或插件引擎的Bug影响所有采集任务正常执行。 另外,在任务执行时间上,也由Agent加以控制,避免任务超时运行。 Lua本身提供的一些功能也做了屏蔽,例如io.open/io.popen/os.execute/os.remove等高危操作接口,避免从脚本调用外部程序,或做出删除系统文件等操作。
增强模式
经过一段时间的线上运行,在某些场景下,日志处理的性能无法满足需求。
以上是 百度智能运维(Noah) 在使用Lua实现定制日志采集方面的工程实践经验。工程实现并不复杂,但细节较多,需要严谨的功能设计,编码和充分的测试,保障日志处理过程满足需求、资源合理利用,并提供良好的用户操作接口,逐步积累抽象出更多的 通用性 插件,降低 用户使用成本。
阅读推荐
运维实践
运维产品
企业级运维平台| 运维知识库| 通告平台| 百度名字服务| 业务部署| 数据配送| 集群控制系统| 外网监控| 内网监控| 部署变更
精品推荐
AIOps中的四大金刚| 智能运维| AIOps时代| 运维演进
↓↓↓ 点击"阅读原文" 【了解更多精彩内容】
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。