百家乐必知技巧
大數據

日志監控實踐 – 監控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實現定制日志采集方面的工程實踐經驗。工程實現并不復雜,但細節較多,需要嚴謹的功能設計,編碼和充分的測試,保障日志處理過程滿足需求、資源合理利用,并提供良好的用戶操作接口,逐步積累抽象出更多的通用性插件,降低用戶使用成本。

我還沒有學會寫個人說明!

技術宅告訴你如何搜索更安全

上一篇

Spark in action on Kubernetes - 存儲篇

下一篇

你也可能喜歡

日志監控實踐 – 監控Agent集成Lua引擎實現多維度日志采集

長按儲存圖像,分享給朋友

ITPUB 每周精要將以郵件的形式發放至您的郵箱


微信掃一掃

微信掃一掃
百家乐必知技巧 贵州十一选五高频开奖结果 西甲雪缘园 微信高仿鞋代理赚钱吗 516捕鱼游戏大厅 网球比分直播188 快乐10分任选三技巧 北京十一选五口诀 福彩3d图谜总汇 865棋牌靠谱865棋牌靠谱吗 曾道人内幕玄机报