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