Go to file
2019-01-22 10:50:43 +08:00
cfg support endpoint config 2018-10-30 19:39:04 +08:00
common copy ParseSucc filed in DeepCopyStrategy 2018-12-06 17:39:48 +08:00
http add check api 2018-08-24 10:06:37 +08:00
pic update readme 2018-07-26 17:46:34 +08:00
reader gofmt -s && golint && go_vet && gocyclo 2018-08-07 18:23:51 +08:00
strategy support strategy configs folder 2018-11-04 10:43:05 +08:00
vendor add github.com/pkg/ vendor 2018-07-07 21:21:47 +08:00
worker support endpoint config 2018-10-30 19:39:04 +08:00
.gitignore support strategy configs folder 2018-11-04 10:43:05 +08:00
control update readme: update build method 2018-08-07 15:15:08 +08:00
glide.lock first commit 2018-07-01 19:48:03 +08:00
glide.yaml 修复glide使用问题 2018-07-13 15:55:21 +08:00
LICENSE Create MIT License 2018-08-07 18:58:13 +08:00
main.go gofmt -s && golint && go_vet && gocyclo 2018-08-07 18:23:51 +08:00
Makefile fix Makefile bug 2018-09-04 14:30:02 +08:00
readme.md 更正错别字 2018-12-07 15:26:54 +08:00

falcon-log-agent

log-agent

Build Status Build Status Build Status

目录

简介

falcon-log-agent是一个开源版的日志采集工具旨在从流式的日志中抓取、统计日志中的特征信息。

获取的特征信息与开源版Open-Falcon监控系统打通。可用于业务指标的衡量、也可用于稳定性的建设。

Feature

  • 准确可依赖:历经滴滴线上业务近一年考验,统计准确性高。
  • 性能高、资源消耗可控:性能优化程度高,单核单策略可支撑日志分析:20W条/秒
  • 接入成本低外挂式采集只需要标准化日志即可输出数据直接对接open-falcon。

我司agent升级前后资源占用对比图 资源对比图

什么是日志采集

日志采集,是一种外挂式的采集。通过读取进程打印的日志,来进行监控数据的采集与汇聚计算。

falcon-log-agent如何工作

本agent即日志采集场景下的实时计算。实时读取文件内容实时计算将计算结果直接推送至falcon。

限定条件

  • 要求日志必须包含时间:不包含时间的日志,只能根据当前时间统计日志条数,结果非常不准确。
  • 不支持文件软链
  • 日志时间必须有序为了应对日志延迟落盘等agent会根据日志的时间来判断某一周期的数据是否采集完成如果日志时间顺序错乱可能导致采集不准。

开始使用log-agent

构建

go get https://github.com/didi/falcon-log-agent.git && cd $GOPATH:/src/github.com/didi/falcon-log-agent
make build

修改配置文件

# 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

打包 & 安装

make pack
export WorkDir="$HOME/falcon-log-agent"
mkdir -p $WorkDir
tar -xzvf falcon-log-agent.tar.gz -C $WorkDir
cd $WorkDir

启动/停止服务

 # 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:自身状态对外暴露的接口
endpoint:上报至open-falcon的endpoint配置。(可选host或ip,host为主机名,ip为本机ip)

采集策略

文件路径

文件路径即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即监控项。

标签

标签(tags)与open-falcon中的tags相对应。可以理解为确定监控项的补充。

说明机器A的第一个核的cpu空闲率。

采集名称(metric): cpu空闲率(cpu.idle)
标签(tags):两个标签: host=机器A;核数=第一个核

在主正则匹配完成后然后匹配出tag的值一起进行上报。

若无法匹配出tag的值则视为该条数据未匹配到该条日志将不再计入统计

其他

  • degree: 精度
  • comment: 备注

检验日志格式

启动agent会自动加载所有策略。此时通过**/check**接口,可以实时验证日志是否可以匹配到策略。 /check接口会将该条日志能命中的采集规则一起返回并返回命中详情。

方法POST
参数log=${日志原文}  // postForm

eg.
curl -s -XPOST localhost:8003/check -d  'log=01/Jan/2018:12:12:12 service error 500, num=10 province=33' | python -m json.tool

自身状态暴露

falcon-log-agent本身对外提供了一个http服务用来暴露自身状态。

主要提供的url如下

  • /health 自身存活状态
  • /strategy :当前生效的策略列表
  • /cached 最近1min内上报的点

自监控

common/proc/metric/metric.go定义了一个自监控结构体。

在程序运行过程中会不断收集信息,主要包括如下:

MemUsedMB       进程内存占用
ReadLineCnt     读日志行数
DropLineCnt     队列打满后,扔掉的日志行数
AnalysisCnt     分析完成的日志行数
AnalysisSuccCnt 分析成功匹配的日志行数
PushCnt         推送的监控数据点数
PushErrorCnt    推送错误的监控数据点数
PushLatency     推送监控数据延迟

这些数据,目前自监控的处理方式是:定时输出日志。

如果需要对接自己公司的监控系统,在common/proc/metric/metric.go修改HandleMetrics方法即可。