日誌監控實踐 - 監控Agent整合Lua引擎實現多維度日誌採集

AIOps智慧運維發表於2018-12-29

作者簡介:董涵    百度資深研發工程師

負責百度智慧運維(Noah)服務管理和分散式監控架構研發工作,在分散式系統和大規模資料處理、可用性工程方向有廣泛的實踐經驗。


乾貨概覽

對於網際網路行業來說,最有價值的資料往往蘊含在服務的日誌之中。從日誌中,我們不僅僅可以獲取到服務的使用量、服務效果、問題定位資訊等,還可以透過監控系統及時地識別出服務的健康狀態,規避風險,推動服務最佳化升級

監控系統中,日誌處理就是採集服務執行時生成的原始日誌,根據使用者配置的解析規則,從中提取可用資料,形成監控指標的過程,這個過程一般由監控系統的日誌採集Agent完成。

通用的日誌採集Agent一般會提供多種日誌解析方法,常用的有分隔符K:V正規表示式等。為了適配某些常用的系統或元件(例如:Nginx、Syslog等),有些日誌採集Agent還會提供一些預製的日誌解析配置,以期達到開箱即用的效果。

百度的業務場景十分複雜,涉及搜尋服務、社群服務、金融服務、AI服務等,這些業務的程式所生產的日誌格式存在較大差異,如何統一處理這些不同格式的日誌成為一個重要的問題。今天,我們會從百度Noah監控平臺的角度,討論如何解決這一問題

典型日誌處理示例

1K:V日誌


日誌監控實踐 - 監控Agent整合Lua引擎實現多維度日誌採集

如上圖所示,這是一個典型的K:V形式組成的日誌。

我們可以透過簡單的分隔符將日誌分隔開,並根據K:V的式樣從日誌中提取出uri、c_time、idc等監控項。

2多行日誌


日誌監控實踐 - 監控Agent整合Lua引擎實現多維度日誌採集

這是一個C++程式的Stack資訊。需要將多行日誌作為一個Trace資訊進行完整提取,並且將每一行裡面的函式名、檔名、行號單獨提取,統一推送,用於批次例項的故障定位

這個例子需要具備兩個能力,多行日誌處理和單行日誌內提取字串。

3混合日誌


日誌監控實踐 - 監控Agent整合Lua引擎實現多維度日誌採集

在這個例子中,每行日誌混合了服務名程式碼位置使用者自定義資料等資訊。需要分別用分隔符、K:V和JSON解析的方式進行提取。

針對這些場景,一些開源方案(例如Logstash,Collectd)透過在配置檔案中支援此類語義或外掛的方式實現了此類功能。我們參考了這些開源實現,結合百度業務的場景,在監控採集Agent上透過日誌外掛功能實現日誌處理需求。

實現外掛時,需要重點考慮以下幾方面:

1. 通用性和易用性:需要儘可能滿足使用者定製化需求, 並且開發簡單。

2. 效能:典型的日誌採集場景中,需要每秒處理數MB甚至數十MB的日誌檔案,並完成欄位切分、正則匹配、資料格式轉換等操作,需要處理引擎有較強的效能。

3. 可用性和安全性:Agent執行線上上生產伺服器上,對穩定和安全有相當高的要求。

Agent日誌外掛實現


日誌監控實踐 - 監控Agent整合Lua引擎實現多維度日誌採集

如何實現定製化的日誌解析邏輯很簡單。我們封裝了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實現定製日誌採集方面的工程實踐經驗。工程實現並不複雜,但細節較多,需要嚴謹的功能設計,編碼和充分的測試,保障日誌處理過程滿足需求、資源合理利用,並提供良好的使用者操作介面,逐步積累抽象出更多的通用性外掛,降低使用者使用成本。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31557835/viewspace-2286957/,如需轉載,請註明出處,否則將追究法律責任。

相關文章