使用 falcon-log-agent 收集监控指标到 open-falcon
摘要
falcon-log-agent
是一个开源版的日志采集工具,旨在从流式的日志中抓取、统计日志中的特征信息。获取的特征信息,与开源版Open-Falcon监控系统打通。可用于业务指标的衡量、也可用于稳定性的建设。
前言
前面已经部署了 Open-falcon
实现了服务器基础指标的收集 《使用 Open-falcon 进行指标收集》,之后小结抛出了一个自定义指标收集的需求。
使用此方式进行收集把数据量压缩在了 agent
, 在每个 agent
中把所有有用的指标收集过来,过滤掉不需要的日志数据。这对于服务器资源受限的用户是极大的福音。
与之前写的 《使用 filebeat 收集日志到 kafka》 不同的是 filebeat
收集的是日志内容,把所有日志都写到 kafka
,这样对于收集端来说比较方便,一套规则基本可以适用所有项目。需要分析时,则可以到 kafka
中获取数据进行分析,由于 kafka
中的数据是全量的,分析起来更加方便,不过占用的硬盘相对会多很多。
falcon-log-agent
在每个 agent
中已经作了数据分析及处理,所以需要对每个被收集的项目编写一套收集规则,相应的分析则直接可以在 Open-falcon
的可视化界面中生成。
本文将使用开源项目 falcon-log-agent 来收集指标到 Open-falcon
。
安装
下载源码:
$ git clone https://github.com/didi/falcon-log-agent
可直接按官方提供的编译方案进行编译启动 falcon-log-agent:
## 打包 & 安装
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
docker 镜像
给官方的 PR 还未合并,先使用以下方式进行编译,这里选择使用 docker
的方式部署:
$ cd falcon-log-agent
$ cat <<EOF > Dockerfile
FROM golang:latest as pre-build
WORKDIR /go/src/github.com/didi/falcon-log-agent
COPY . .
RUN go build -o falcon-log-agent
FROM alpine:latest
WORKDIR /app
ENV TZ=Asia/Shanghai
RUN echo "http://mirrors.aliyun.com/alpine/v3.4/main/" > /etc/apk/repositories && \
apk update && apk add --no-cache tzdata && \
cp /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY --from=pre-build /go/src/github.com/didi/falcon-log-agent/falcon-log-agent .
COPY --from=pre-build /go/src/github.com/didi/falcon-log-agent/cfg/dev.cfg .
COPY --from=pre-build /go/src/github.com/didi/falcon-log-agent/cfg/strategy.dev.json .
EXPOSE 8003
CMD ['/app/falcon-log-agent', "-c", "/etc/conf/cfg.json", "-s", "/etc/conf/strategy.json"]
EOF
编译基础镜像
$ docker build -t falcon-log-agent .
配置说明
falcon-log-agent 有两个配置文件,dev.cfg
和 strategy.dev.json
这两个。使用以上镜像时,只需要把这两个配置文件以及日志目录挂载取容器中即可。
服务配置 dev.cfg
:
{
"log" : {
"log_path" : "./log",
"log_level" : "INFO",
"log_rotate_size" : 200,
"log_rotate_num" : 10
},
"http" : {
"http_port" : 8003
},
"strategy" : {
"update_duration" : 60,
"default_degree" : 6
},
"worker" : {
"worker_num" : 10,
"queue_size" : 1024000,
"push_interval" : 1,
"push_url" : "http://127.0.0.1:1988/v1/push"
},
"endpoint" : "host",
"max_cpu_rate": 0.2,
"max_mem_rate": 0.05
}
log
块配置规定了当前项目打印日志的目录、级别及自动滚动的尺寸及数量。http_port
服务启动的端口strategy
规则一些全局的策略push_url
推送到Open-falcon
的地址
其它配置说明:
log_path:程序输出的日志目录
log_level:日志等级
log_rotate_size:日志切割大小
log_rotate_num:按配置切割之后,保留多少个文件,其他的清理掉
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:默认的采集精度
日志收集配置 strategy.dev.json
:
[
{
"id": 1,
"name": "alerting_request_count",
"time_format": "yyyy-mm-dd HH:MM:SS",
"file_path": "/logs/alerting/access.log",
"pattern": "(/api/.*)\\?",
"step": 10,
"tags":
{
"route": "(/api/.*)\\?"
},
"func": "cnt",
"degree": 2,
"comment": "接口请求量"
}
]
其中日期格式是必须的,一行中匹配不到日期格式将会报错:
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
采集方式有如下几种:
- 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
收集规则检测:
方法: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
可以比较轻松的实现,如果是对复杂、多变的指标进行分析,ELK
或其它类似方案会更加得友好。