#grafana #falcon-log-agent #open-falcon #监控 #golang #graph

使用 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.cfgstrategy.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 或其它类似方案会更加得友好。

Author Mo 最后更新: 2019-06-03 23:16:47