WRY

Where Are You?
You are on the brave land,
To experience, to remember...

0%

为Fission 添加可配置的日志收集能力

Fission 自带日志组件

Fission 的日志收集系统是从宿主机上识别到函数所依赖的pod的日志文件,将这些文件中的内容使用fluent日志收集组件发送到infulxdb。整个流程是十分高效的,但是日志配置是固定的,只能发送到influxdb。流程图如下:

Fission Logger

Fission 日志改造思想

在Fission原来的日志处理组件中,通过文件软链接十分方便的汇总了函数的日志文件,我们以这部分软链接为依托,通过动态配置fluentd的方式,实现函数日志的多途径投递。结构如图:

添加了Watcher组件监听函数以及相关的配置变化,添加Config Generate组件自动更新Fluentd配置文件,并触发Fluentd去重新载入配置。具体配置过程为,管理员可以在全局命名空间和各个函数的命名空间下配置日志输出,存储配置的ConfigMap名为fission-log-collection-config,一项名为kafka-default的配置可以如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<store>
@type kafka2
brokers my-kafka.development:9092
default_topic log_{{ .ObjectMeta.Namespace }}_{{ .ObjectMeta.Name }}
<format>
@type json
</format>
<buffer>
flush_mode interval
retry_type exponential_backoff
flush_interval 3
</buffer>
</store>

函数在自己的局部配置文件中可以通过保留keylog-collection-type 来声明多个输出项。配置组件会先在函数所在的命名空间下寻找具体的日志投递参数,若没有,再去全局配置所在的命名空间下寻找。将具体的投递参数拼凑成一个完整的配置文件存储在指定的空间下,同时申请fluentd重新载入配置。这个申请会被一个名为TimerCheck的组件接收,该组件会限制实际上对Fluentd的重新载入触发的频率,提升整体效率。针对一个函数的最终配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<source>
@type tail
path /var/log/fission/jd-buyer_base-test_*
pos_file /fluentd/pos/pos__jd-buyer_base-test.pos
read_from_head true
emit_unmatched_lines true
refresh_interval 20
tag jd-buyer.base-test
<parse>
@type json
</parse>
</source>

<filter jd-buyer.base-test>
@type record_transformer
<record>
tag ${tag}
</record>
</filter>

<match jd-buyer.base-test>
@type copy
<store>
@type kafka2
brokers kafka-dev.kafka-dev:9092
default_topic log-default
<format>
@type json
</format>
<buffer>
flush_mode interval
retry_type exponential_backoff
flush_interval 3
</buffer>
</store>
<store>
@type aliyun_sls
access_key_id xxxx
access_key_secret xxxx
project xxxx
region_endpoint xxxx
logstore fission-functions-xxxx
need_create_logstore true
<buffer>
flush_mode interval
retry_type exponential_backoff
flush_interval 3
</buffer>
</store>
</match>

存在的问题

  • 配置文件的正确性没有验证,部分错误的配置可能会导致Fluentd无法工作,需要文件的正确性验证。

鸣谢

Arvintian/fluentd-axes 参考了该项目整体思路和Fluentd Wrapper的具体实现

Arvintian/fluent-plugin-aliyun-sls Fluentd 推送阿里云的日志服务的组件

fluent/fluentd-docker-image 参考了该项目的Fluentd Dockerfile的编写