open-falcon的falcon-log-agent日誌監控
falcon-log-agent
簡介
falcon-log-agent是一個開源版的日誌采集工具,旨在從流式的日誌中抓取、統計日誌中的特征信息。
獲取的特征信息,與開源版Open-Falcon監控系統打通。可用於業務指標的衡量、也可用於穩定性的建設。
Feature
- 準確可依賴:歷經滴滴線上業務近一年考驗,統計準確性高。
- 性能高、資源消耗可控:性能優化程度高,單核單策略可支撐日誌分析:20W條/秒
- 接入成本低:外掛式采集,只需要標準化日誌即可;輸出數據直接對接open-falcon。
附:我司agent升級前後資源占用對比圖
什麽是日誌采集
日誌采集,是一種外掛式的采集。通過讀取進程打印的日誌,來進行監控數據的采集與匯聚計算。
falcon-log-agent如何工作
本agent即日誌采集場景下的實時計算。實時讀取文件內容,實時計算,將計算結果直接推送至falcon。
限定條件
- 要求日誌必須包含時間:不包含時間的日誌,只能根據當前時間統計日誌條數,結果非常不準確。
- 不支持文件軟鏈
- 日誌時間必須有序:為了應對日誌延遲落盤等,agent會根據日誌的時間來判斷某一周期的數據是否采集完成,如果日誌時間順序錯亂,可能導致采集不準。
開始使用log-agent
構建
git clone https://github.com/didi/falcon-log-agent.git && cd falcon-log-agent && sh build.sh
修改配置文件
# base config
cp cfg/dev.cfg cfg/cfg.json
vim cfg/cfg.json
# strategy config
cp cfg/strategy.dev.json cfg/strategy.json
vim cfg/strategy.json
啟動/停止服務
# start
./control start
# stop
./control stop
# status
./control status
基礎配置項
基礎配置項,即程序本身的配置項。默認是cfg/cfg.json,可以通過-c參數來指定。
日誌相關
log_path:程序輸出的日誌目錄 log_level:日誌等級 log_rotate_size:日誌切割大小 log_rotate_num:按配置切割之後,保留多少個文件,其他的清理掉
worker相關
worker_num:每個日誌文件,進行計算的並發數
queue_size:讀文件和進行計算之間,有一個緩沖隊列,如果隊列滿了,意味著計算能力跟不上,就要丟日誌了。這個配置就是這個緩沖隊列的大小。
push_interval:循環判斷將計算完成的數據推送至發送隊列的時間
push_url:推送的odin-agent的url
資源限制
max_cpu_rate:最大使用的cpu百分比。(可用核數=ceil(總核數*max_cpu_rate))
max_mem_rate:最打使用內存百分比。(最大內存=(內存總大小*max_mem_rate),最小為500M)
策略相關
update_duration:策略的更新周期
default_degree:默認的采集精度
其他
http_port:自身狀態對外暴露的接口
采集策略
文件路徑
文件路徑,即file_path配置項。必須要求啟動agent的用戶,對這個文件有可讀權限。
文件路徑支持固定路徑和動態路徑兩種:
- 固定路徑:直接填寫即可,如/var/log/falcon-log-agent.log
- 動態路徑:可支持按照規則配置的根據時間變化的路徑。例如:
比如:線上有些模塊自己按照小時寫入文件,路徑為:
/xiaoju/application/log/20150723/application.log.2015072312
對應的我們的配置方式可以填寫為:
/xiaoju/application/log/${%Y%m%d}/application.log.${%Y%m%d%H} // ${}中不能包含/
時間格式
時間格式,即time_format配置項。
如果日誌中沒有時間格式,一旦遇到日誌延遲落盤、或者日誌量太大計算延遲的情況。會直接導致我們的監控采集不準。
因此,我們規定日誌中必須有合法的時間格式。且在配置中time_format項指定。
如果想要添加自己的時間格式,可以直接在common/utils/util.go裏添加。
目前已經支持的時間格式如下:
dd/mmm/yyyy:HH:MM:SS
dd/mmm/yyyy HH:MM:SS
yyyy-mm-ddTHH:MM:SS
dd-mmm-yyyy HH:MM:SS
yyyy-mm-dd HH:MM:SS
yyyy/mm/dd HH:MM:SS
yyyymmdd HH:MM:SS
mmm dd HH:MM:SS
PS:為了防止日誌積壓或性能不足導致的計算偏差,日誌采集的計算,依賴於日誌的時間戳。
因此如果配置了錯誤的時間格式,將無法得到正確的結果。
采集規則
采集正則,包含兩個配置項:pattern和exclude。
兩個采集項都是正則表達式,正則表達式的支持情況見:google/re2
pattern代表需要完全匹配出來的表達式。
exclude代表需要排除掉的表達式。
eg. 例如,我希望統計code=500或400的日誌數量,但是想排除掉關鍵字SpeciallyErrorNo。 配置如下:
pattern: code=[45]00
exclude: SpeciallyErrorNo
采集周期
采集周期(step),對應著監控系統的上報周期。意味著多久合並上報一次。
假設每秒產生1條符合采集規則的日誌,配置的采集方式為計數。
如果step為10 : 則每10s上報一次,值為10
如果step為60 : 則每60s上報一次,值為60
采集方式
采集方式(func)的意思是,當我們從日誌中篩選出一堆符合規則的日誌之後,應該以哪種規則來計算拿到最後的值來上報。
目前支持的采集方式有:
- cnt
- avg
- sum
- max
- min
舉例:
假設:
正則表達式配置為 Return Success : (\d+)s Used
某一個周期內日誌滾動:
2017/12/01 12:12:01 Return Success : 1s Used
2017/12/01 12:12:02 Return Success : 2s Used
2017/12/01 12:12:03 Return Success : 4s Used
2017/12/01 12:12:04 Return Success : 2s Used
2017/12/01 12:12:05 Return Success : 1s Used
首先,根據正則獲取到括號內的值:1、2、4、2、1
接下來,根據不同的計算方式,會得到不同的結果:
avg : (1 + 2 + 4 + 2 + 1) / 5 = 2
count : 5
sum : (1 + 2 + 4 + 2 + 1) = 10
max : Max(1, 2, 4, 2, 1) = 4
min : Min(1, 2, 4, 2, 1) = 1
采集名稱
采集名稱(name)對應open-falcon中的metric,即監控項。