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