日志監(jiān)控實(shí)踐:監(jiān)控Agent集成Lua引擎實(shí)現(xiàn)多維度日志采集

原標(biāo)題:日志監(jiān)控實(shí)踐:監(jiān)控Agent集成Lua引擎實(shí)現(xiàn)多維度日志采集

對(duì)于互聯(lián)網(wǎng)行業(yè)來說,最有價(jià)值的數(shù)據(jù)往往蘊(yùn)含在服務(wù)的日志之中。從日志中,我們不僅僅可以獲取到服務(wù)的使用量、服務(wù)效果、問題定位信息等,還可以通過監(jiān)控系統(tǒng)及時(shí)地識(shí)別出服務(wù)的“健康”狀態(tài),規(guī)避風(fēng)險(xiǎn),推動(dòng)服務(wù)優(yōu)化升級(jí)。

在監(jiān)控系統(tǒng)中,日志處理就是采集服務(wù)運(yùn)行時(shí)生成的原始日志,根據(jù)用戶配置的解析規(guī)則,從中提取可用數(shù)據(jù),形成監(jiān)控指標(biāo)的過程,這個(gè)過程一般由監(jiān)控系統(tǒng)的日志采集Agent完成。

通用的日志采集Agent一般會(huì)提供多種日志解析方法,常用的有分隔符、K:V、正則表達(dá)式等。為了適配某些常用的系統(tǒng)或組件(例如:Nginx、Syslog等),有些日志采集Agent還會(huì)提供一些預(yù)制的日志解析配置,以期達(dá)到開箱即用的效果。

百度的業(yè)務(wù)場(chǎng)景十分復(fù)雜,涉及搜索服務(wù)、社區(qū)服務(wù)、金融服務(wù)、AI服務(wù)等,這些業(yè)務(wù)的程序所生產(chǎn)的日志格式存在較大差異,如何統(tǒng)一處理這些不同格式的日志成為一個(gè)重要的問題。

今天,我們會(huì)從百度云Noah監(jiān)控平臺(tái)的角度,討論如何解決這一問題。

典型日志處理示例

1、K:V日志

如上圖所示,這是一個(gè)典型的K:V形式組成的日志。

我們可以通過簡(jiǎn)單的分隔符將日志分隔開,并根據(jù)K:V的式樣從日志中提取出uri、c_time、idc等監(jiān)控項(xiàng)。

2、多行日志

這是一個(gè)C++程序的Stack信息。需要將多行日志作為一個(gè)Trace信息進(jìn)行完整提取,并且將每一行里面的函數(shù)名、文件名、行號(hào)單獨(dú)提取,統(tǒng)一推送,用于批量實(shí)例的故障定位。

這個(gè)例子需要具備兩個(gè)能力,多行日志處理和單行日志內(nèi)提取字符串。

3、混合日志

在這個(gè)例子中,每行日志混合了服務(wù)名、代碼位置、用戶自定義數(shù)據(jù)等信息。需要分別用分隔符、K:V和JSON解析的方式進(jìn)行提取。

針對(duì)這些場(chǎng)景,一些開源方案(例如Logstash,Collectd)通過在配置文件中支持此類語義或插件的方式實(shí)現(xiàn)了此類功能。我們參考了這些開源實(shí)現(xiàn),結(jié)合百度業(yè)務(wù)的場(chǎng)景,在監(jiān)控采集Agent上通過日志插件功能實(shí)現(xiàn)日志處理需求。

實(shí)現(xiàn)插件時(shí),需要重點(diǎn)考慮以下幾方面:

  • 通用性和易用性:需要盡可能滿足用戶定制化需求, 并且開發(fā)簡(jiǎn)單。
  • 性能:典型的日志采集場(chǎng)景中,需要每秒處理數(shù)MB甚至數(shù)10MB的日志文件,并完成字段切分、正則匹配、數(shù)據(jù)格式轉(zhuǎn)換等操作,需要處理引擎有較強(qiáng)的性能。
  • 可用性和安全性:Agent運(yùn)行在線上生產(chǎn)服務(wù)器上,對(duì)穩(wěn)定和安全有相當(dāng)高的要求。

Agent日志插件實(shí)現(xiàn)

如何實(shí)現(xiàn)定制化的日志解析邏輯很簡(jiǎn)單。我們封裝了Log解析類,包含獲取單行日志和返回監(jiān)控項(xiàng)解析結(jié)果的接口,供用戶自定義日志解析腳本來調(diào)用。用戶需要在日志解析腳本中實(shí)現(xiàn)Callback函數(shù),在解析每行日志時(shí),被Agent調(diào)用。

所有的日志處理邏輯完全在腳本中實(shí)現(xiàn),例如,用戶可以在腳本中維護(hù)全局Context,通過Context中保存的進(jìn)度信息,完成多行日志的處理。

這里還封裝了通用的日志處理工具庫(kù),以Lua內(nèi)置類的形式提供,包含JSON、Debug等工具。

可用性和安全

Agent在所有服務(wù)器上運(yùn)行,可用性和安全性是最重要的考量因素。

  • 可用性方面,主要是避免自定義腳本本身的Bug或插件引擎Bug導(dǎo)致采集功能異常。除此之外,需要規(guī)避資源占用超限導(dǎo)致服務(wù)器上其它業(yè)務(wù)受影響。

對(duì)用戶代碼,需要嚴(yán)格規(guī)范資源占用量。執(zhí)行插件的任務(wù),作為一個(gè)單獨(dú)的進(jìn)程,使用Cgroup和Ulimit等機(jī)制限制資源占用,同時(shí)也作為執(zhí)行隔離的手段,規(guī)避單個(gè)腳本或插件引擎的Bug影響所有采集任務(wù)正常執(zhí)行。

另外,在任務(wù)執(zhí)行時(shí)間上,也由Agent加以控制,避免任務(wù)超時(shí)運(yùn)行。

  • 安全性方面,自定義日志解析腳本需要配置中心統(tǒng)一托管,避免被篡改。

Lua本身提供的一些功能也做了屏蔽,例如

io.open/io.popen/os.execute/os.remove等高危操作接口,避免從腳本調(diào)用外部程序,或做出刪除系統(tǒng)文件等操作。

增強(qiáng)模式

經(jīng)過一段時(shí)間的線上運(yùn)行,在某些場(chǎng)景下,日志處理的性能無法滿足需求。

對(duì)于通用日志采集場(chǎng)景,通過將Lua替換成Luajit,日志解析吞吐量獲得約4倍的提升,可以覆蓋我們幾乎所有的通用日志采集場(chǎng)景。替換過程中需要關(guān)注兼容問題處理,例如Regexp語意和標(biāo)準(zhǔn)的Lua并不完全相同,lua_ctx最大數(shù)量限制等等。

特殊的業(yè)務(wù)需求場(chǎng)景,需要針對(duì)性地進(jìn)行優(yōu)化。例如,某些業(yè)務(wù)日志的采集過程中,需要進(jìn)行UNIX時(shí)間戳到RFC格式的轉(zhuǎn)換、IP地址到機(jī)房信息的轉(zhuǎn)換等操作,在Lua腳本中通過查表或進(jìn)行轉(zhuǎn)換來實(shí)現(xiàn)需求的效率非常低。對(duì)于這些場(chǎng)景我們使用C++等語言封裝了可以在Lua中直接調(diào)用的類,有效提升此類操作性能超過一個(gè)數(shù)量級(jí)。這種集成方式也可以用于支持一些定制功能,例如Protobuf和BaiduRPC變量等信息的采集。

性能方面仍有提升的空間。當(dāng)前的日志處理是單進(jìn)程單線程中運(yùn)行日志處理引擎解決需求,擴(kuò)展成為多線程,利用并發(fā)方式可以有效提升吞吐量。

總 結(jié)

以上是百度云智能運(yùn)維(Noah)在使用Lua實(shí)現(xiàn)定制日志采集方面的工程實(shí)踐經(jīng)驗(yàn)。工程實(shí)現(xiàn)并不復(fù)雜,但細(xì)節(jié)較多,需要嚴(yán)謹(jǐn)?shù)墓δ茉O(shè)計(jì)、編碼和充分的測(cè)試,保障日志處理過程滿足需求、資源合理利用,并提供良好的用戶操作接口,逐步積累抽象出更多的通用性插件,降低用戶使用成本。

免責(zé)聲明:本網(wǎng)站內(nèi)容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。任何單位或個(gè)人認(rèn)為本網(wǎng)站中的網(wǎng)頁或鏈接內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),應(yīng)及時(shí)向本網(wǎng)站提出書面權(quán)利通知或不實(shí)情況說明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會(huì)依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開相關(guān)鏈接。

2019-01-31
日志監(jiān)控實(shí)踐:監(jiān)控Agent集成Lua引擎實(shí)現(xiàn)多維度日志采集
在監(jiān)控系統(tǒng)中,日志處理就是采集服務(wù)運(yùn)行時(shí)生成的原始日志,根據(jù)用戶配置的解析規(guī)則,從中提取可用數(shù)據(jù),形成監(jiān)控指標(biāo)的過程,這個(gè)過程一般由監(jiān)控系統(tǒng)的日志采集Agent完成。

長(zhǎng)按掃碼 閱讀全文