監(jiān)控Agent集成Lua引擎怎么實現多維度日志采集,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
成都創(chuàng)新互聯服務項目包括寧津網站建設、寧津網站制作、寧津網頁制作以及寧津網絡營銷策劃等。多年來,我們專注于互聯網行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯網行業(yè)的解決方案,寧津網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到寧津省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!在監(jiān)控系統(tǒng)中,日志處理就是采集服務運行時生成的原始日志,根據用戶配置的解析規(guī)則,從中提取可用數據,形成監(jiān)控指標的過程,這個過程一般由監(jiān)控系統(tǒng)的日志采集Agent完成。
通用的日志采集Agent一般會提供多種日志解析方法,常用的有分隔符、K:V、正則表達式等。為了適配某些常用的系統(tǒng)或組件(例如:Nginx、Syslog等),有些日志采集Agent還會提供一些預制的日志解析配置,以期達到開箱即用的效果。
百度的業(yè)務場景十分復雜,涉及搜索服務、社區(qū)服務、金融服務、AI服務等,這些業(yè)務的程序所生產的日志格式存在較大差異,如何統(tǒng)一處理這些不同格式的日志成為一個重要的問題。今天,我們會從百度Noah監(jiān)控平臺的角度,討論如何解決這一問題。
1K:V日志
如上圖所示,這是一個典型的K:V形式組成的日志。
我們可以通過簡單的分隔符將日志分隔開,并根據K:V的式樣從日志中提取出uri、c_time、idc等監(jiān)控項。
2多行日志
這是一個C++程序的Stack信息。需要將多行日志作為一個Trace信息進行完整提取,并且將每一行里面的函數名、文件名、行號單獨提取,統(tǒng)一推送,用于批量實例的故障定位。
這個例子需要具備兩個能力,多行日志處理和單行日志內提取字符串。
3混合日志
在這個例子中,每行日志混合了服務名、代碼位置、用戶自定義數據等信息。需要分別用分隔符、K:V和JSON解析的方式進行提取。
針對這些場景,一些開源方案(例如Logstash,Collectd)通過在配置文件中支持此類語義或插件的方式實現了此類功能。我們參考了這些開源實現,結合百度業(yè)務的場景,在監(jiān)控采集Agent上通過日志插件功能實現日志處理需求。
實現插件時,需要重點考慮以下幾方面:
1. 通用性和易用性:需要盡可能滿足用戶定制化需求, 并且開發(fā)簡單。
2. 性能:典型的日志采集場景中,需要每秒處理數MB甚至數十MB的日志文件,并完成字段切分、正則匹配、數據格式轉換等操作,需要處理引擎有較強的性能。
3. 可用性和安全性:Agent運行在線上生產服務器上,對穩(wěn)定和安全有相當高的要求。
Agent日志插件實現
如何實現定制化的日志解析邏輯很簡單。我們封裝了Log解析類,包含獲取單行日志和返回監(jiān)控項解析結果的接口,供用戶自定義日志解析腳本來調用。用戶需要在日志解析腳本中實現Callback函數,在解析每行日志時,被Agent調用。
所有的日志處理邏輯完全在腳本中實現,例如,用戶可以在腳本中維護全局Context,通過Context中保存的進度信息,完成多行日志的處理。
這里還封裝了通用的日志處理工具庫,以Lua內置類的形式提供,包含JSON、Debug等工具。
可用性和安全
Agent在所有服務器上運行,可用性和安全性是最重要的考量因素。
可用性方面,主要是避免自定義腳本本身的Bug或插件引擎Bug導致采集功能異常。除此之外,需要規(guī)避資源占用超限導致服務器上其它業(yè)務受影響。
對用戶代碼,需要嚴格規(guī)范資源占用量。執(zhí)行插件的任務,作為一個單獨的進程,使用Cgroup和Ulimit等機制限制資源占用,同時也作為執(zhí)行隔離的手段,規(guī)避單個腳本或插件引擎的Bug影響所有采集任務正常執(zhí)行。
另外,在任務執(zhí)行時間上,也由Agent加以控制,避免任務超時運行。
安全性方面,自定義日志解析腳本需要配置中心統(tǒng)一托管,避免被篡改。
Lua本身提供的一些功能也做了屏蔽,例如io.open/io.popen/os.execute/os.remove等高危操作接口,避免從腳本調用外部程序,或做出刪除系統(tǒng)文件等操作。
增強模式
經過一段時間的線上運行,在某些場景下,日志處理的性能無法滿足需求。
對于通用日志采集場景,通過將Lua替換成Luajit,日志解析吞吐量獲得約4倍的提升,可以覆蓋我們幾乎所有的通用日志采集場景。替換過程中需要關注兼容問題處理,例如Regexp語意和標準的Lua并不完全相同,lua_ctx大數量限制等等。
特殊的業(yè)務需求場景,需要針對性地進行優(yōu)化。例如,某些業(yè)務日志的采集過程中,需要進行UNIX時間戳到RFC格式的轉換、IP地址到機房信息的轉換等操作,在Lua腳本中通過查表或進行轉換來實現需求的效率非常低。對于這些場景我們使用C++等語言封裝了可以在Lua中直接調用的類,有效提升此類操作性能超過一個數量級。這種集成方式也可以用于支持一些定制功能,例如Protobuf和BaiduRPC變量等信息的采集。
性能方面仍有提升的空間。當前的日志處理是單進程單線程中運行日志處理引擎解決需求,擴展成為多線程,利用并發(fā)方式可以有效提升吞吐量。
關于監(jiān)控Agent集成Lua引擎怎么實現多維度日志采集問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創(chuàng)新互聯-成都網站建設公司行業(yè)資訊頻道了解更多相關知識。