百度智能运维(Noah)服务管理和分布式监控架构研发工作
优采云 发布时间: 2021-06-10 06:44百度智能运维(Noah)服务管理和分布式监控架构研发工作
作者简介:百度高级研发工程师韩冬
负责百度智能运维(Noah)服务管理和分布式监控架构研发。他在分布式系统和*敏*感*词*数据处理和可用性工程方面拥有丰富的实践经验。
干货概览
对于互联网行业来说,最有价值的数据往往收录在服务日志中。从日志中,我们不仅可以获取服务使用情况、服务效果、问题位置信息等,还可以通过监控系统及时识别服务的“健康”状态,规避风险,促进服务优化和升级。
在监控系统中,日志处理是采集服务运行时产生的原创日志。根据用户配置的解析规则,从中提取可用数据,形成监控指标的过程。这个过程一般是通过监控系统@k15的日志@Agent来完成的。
一般 log采集Agent 一般提供了多种日志解析方式,如分隔符、K:V、正则表达式等。为了适应一些常用的系统或组件(例如:Nginx、Syslog等),一些日志采集Agent也会提供一些预制的日志解析配置,以实现-盒子效果。
百度的业务场景非常复杂,涉及搜索服务、社区服务、金融服务、AI服务等,这些业务程序产生的日志格式差异很大。如何统一处理这些不同格式的日志,成为一个重要的问题。今天,我们就从百度诺亚监控平台的角度来讨论如何解决这个问题。
典型的日志处理示例
1K:V 日志
如上图所示,这是一个典型的由K:V组成的日志。
我们可以通过简单的分隔符将日志分开,按照K:V样式从日志中提取出uri、c_time、idc等监控项。
2 多行日志
这是一个 C++ 程序的 Stack 信息。需要提取多行日志作为一个trace信息,分别提取每一行的函数名、文件名、行号,统一推送,用于批量实例的故障定位。
这个例子需要两个能力,多行日志处理和单行日志提取。
3 混合原木
在此示例中,每个日志行都混有服务名称、代码位置和用户定义数据等信息。需要分别通过分隔符、K:V和JSON解析的方式提取。
针对这些场景,一些开源解决方案(如Logstash、Collectd)通过支持此类语义或配置文件中的插件来实现此类功能。我们参考这些开源实现,结合百度的业务场景,通过监控采集Agent上的日志插件功能实现日志处理需求。
在实现插件时,需要考虑以下几个方面:
1.Universal 易用性:需要尽可能满足用户定制化需求,开发简单。
2.Performance:典型的日志采集场景下,需要每秒处理几MB甚至几十MB的日志文件,完成字段分割、正则匹配、数据格式转换等操作需要处理引擎。性能强劲。
3.可用性和安全性:Agent运行在在线生产服务器上,对稳定性和安全性要求很高。
代理日志插件实现
如何实现自定义的日志解析逻辑很简单。我们封装了Log解析类,包括获取单行日志和返回监控项分析结果的接口,供用户自定义日志解析脚本。用户需要在日志解析脚本中实现Callback函数,Agent在解析每行日志时调用。
所有日志处理逻辑完全在脚本中实现。例如,用户可以在脚本中维护全局上下文,通过上下文中保存的进度信息完成多行日志的处理。
这里也封装了一个通用的日志处理工具库,以Lua内置类的形式提供,包括JSON、Debug等工具。
可用性和安全性
代理在所有服务器上运行,可用性和安全性是最重要的考虑因素。
在易用性方面,主要是为了避免自定义脚本的bug或者插件引擎bug导致的采集功能异常。另外还要避免其他服务因资源使用过多而对服务器造成影响。
对于用户代码,需要严格规范资源使用。执行插件的任务,作为一个单独的进程,使用Cgroup、Ulimit等机制限制资源占用,同时也作为执行隔离的手段,避免单个脚本或者插件引擎bug影响正常执行所有采集 任务。
另外,任务执行时间也由Agent控制,避免任务超时操作。
在安全方面,自定义日志解析脚本需要由配置中心托管,避免被篡改。
Lua本身提供的一些功能也被屏蔽了,比如io.open/io.popen/os.execute/os.remove等高危操作接口,以避免从脚本中调用外部程序或删除系统文件。 .
增强模式
在线运行一段时间后,在某些场景下,日志处理性能无法满足需求。
对于通用日志采集场景,通过用Luajit替换Lua,日志解析吞吐量提升了4倍左右,几乎可以覆盖我们所有的通用日志采集场景。更换过程中需要注意兼容性问题。比如Regexp语义和标准Lua不完全一样,lua_ctx的最大数量有限制等等。
特殊的业务需求场景需要有针对性的优化。比如在一些业务日志的采集过程中,需要进行UNIX时间戳到RFC格式的转换、IP地址到机房信息的转换等操作。在 Lua 脚本中,通过查表或执行转换来实现需求是非常高效的。低的。对于这些场景,我们使用C++等语言封装了可以在Lua中直接调用的类,有效地将此类操作的性能提升了一个数量级以上。这种集成方式也可以用来支持一些自定义的功能,比如采集Protobuf、BaiduRPC变量等信息。
性能仍有提升空间。目前的日志处理是在单进程单线程中运行日志处理引擎解决需求,扩展到多线程,利用并发来有效提高吞吐量。总结
以上是百度智能运维(Noah)在使用Lua实现自定义日志采集的工程实践经验。项目实施并不复杂,但细节很多。需要严谨的功能设计、编码和充分的测试,保证日志处理过程满足需求,合理利用资源,提供良好的用户操作界面,逐步积累和抽象出更多通用性插件,减少用户使用成本。
本文由AIOps智能运维发布在ITPUB上。转载本文请保持文章的完整性,并附上文章source(ITPUB)和本页链接。
原文链接: