日誌監控實踐 - 監控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實現定製日誌採集方面的工程實踐經驗。工程實現並不複雜,但細節較多,需要嚴謹的功能設計,編碼和充分的測試,保障日誌處理過程滿足需求、資源合理利用,並提供良好的使用者操作介面,逐步積累抽象出更多的通用性外掛,降低使用者使用成本。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31557835/viewspace-2286957/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 黑盒監控、日誌監控
- 雲原生架構日誌監控最佳實踐架構
- idou老師教你學Istio :如何用istio實現監控和日誌採集
- Kubernetes Ingress 日誌分析與監控的最佳實踐
- idou老師教你學Istio 25:如何用istio實現監控和日誌採集
- Mysql事件監控日誌MySql事件
- Spring cloud 整合 SkyWalking 實現效能監控、鏈路追蹤、日誌收集SpringCloud
- vivo大資料日誌採集Agent設計實踐大資料
- 小程式日誌監控工具
- 03-Loki 日誌監控Loki
- ELK監控nginx日誌總結Nginx
- Grafana、Prometheus、mtail-日誌監控GrafanaPrometheusAI
- 部署Sentry日誌監控系統
- 日誌服務 HarmonyOS NEXT 日誌採集最佳實踐
- TiDB監控實現--存活監控TiDB
- 前端異常日誌監控 – 使用Sentry前端
- mongodb profiling慢請求監控日誌MongoDB
- Zabbix如何監控Oracle的告警日誌Oracle
- Oracle 自動化運維-Python監控Oracle告警日誌Oracle運維Python
- Kubernetes監控實踐
- 跟我一起學docker(15)--監控日誌和日誌管理Docker
- 如何優雅地上報前端監控日誌前端
- 分散式系統監控(五)- 日誌分析分散式
- 使用zabbix監控oracle的後臺日誌Oracle
- 爬蟲日誌監控 -- Elastc Stack(ELK)部署爬蟲AST
- Kubernetes之日誌和監控(十五)
- Docker筆記(十三):容器日誌採集實踐Docker筆記
- Linux下使用GoAccess監控Nginx訪問日誌LinuxGoNginx
- C#輕量級日誌監控器EasyLogMonitorC#
- service mesh istio微服務實驗之監控日誌與視覺化微服務視覺化
- 監控採集上報和儲存監控資料策略
- 前端異常監控實踐前端
- Kustomize 生產實戰-注入監控 APM Agent
- EMQX Cloud 更新:日誌分析增加更多引數,監控運維更省心MQCloud運維
- Kubernetes監控實踐(2):可行監控方案之Prometheus和SensuPrometheus
- 在 Linux 上用 Bash 指令碼監控 messages 日誌Linux指令碼
- python監控伺服器應用日誌,推送釘釘機器人,實時關注日誌異常Python伺服器應用日誌機器人
- 金融系統IT運維監控的探索與實踐運維