anthos-multi-cloud/customize-logs-fluentbit/kubernetes/fluentbit-configmap.yaml (124 lines of code) (raw):

# Copyright 2022 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. apiVersion: v1 kind: ConfigMap metadata: name: fluentbit-user-config namespace: logging-system labels: k8s-app: fluentbit-user data: fluent-bit.conf: | [SERVICE] # https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/configuration-file#config_section Flush 1 Log_Level info # New dns resolver switch was added in v1.9 which is still unstable. Configuring to use legacy one until dns resolver is stable. dns.resolver legacy Daemon off Parsers_File parsers.conf HTTP_Server On HTTP_Listen 127.0.0.1 HTTP_Port 29020 # https://docs.fluentbit.io/manual/configuration/buffering storage.path /var/log/fluent-bit-user-buffers/ storage.sync normal storage.checksum off storage.backlog.mem_limit 50M @INCLUDE input-containers.conf @INCLUDE filter-kubernetes.conf @INCLUDE output-stackdriver.conf input-containers.conf: | [INPUT] # https://docs.fluentbit.io/manual/input/tail # https://docs.fluentbit.io/manual/pipeline/filters/kubernetes#workflow-of-tail-kubernetes-filter Name tail Tag k8s_application.<namespace_name>.<pod_name>.<container_name> Tag_Regex var.log.containers.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$ Path /var/log/containers/*.log DB /var/log/fluent-bit-user-k8s-container-application.db Buffer_Chunk_Size 512KB Buffer_Max_Size 2MB Rotate_Wait 30 # Limit of memory that Tail plugin can use when appending data to the engine. Mem_Buf_Limit 50MB Skip_Long_Lines On Refresh_Interval 5 storage.type filesystem Read_from_Head True [FILTER] # https://docs.fluentbit.io/manual/pipeline/filters/modify Name modify Match k8s_application* Hard_rename log message # Parses the workload log lines and tries parsers one after another. # cri,glog and json are applied in order until one succeeds. [FILTER] Name parser Match k8s_application* Key_Name message Reserve_Data True Parser cri Parser appglog Parser json [FILTER] # https://docs.fluentbit.io/manual/pipeline/filters/modify Name modify Match k8s_application* Copy level severity [FILTER] # https://docs.fluentbit.io/manual/pipeline/filters/modify Name modify Match k8s_application* Condition Key_value_equals stream stdout Add severity I [FILTER] # https://docs.fluentbit.io/manual/pipeline/filters/modify Name modify Match k8s_application* Condition Key_value_equals stream stderr Add severity E replace_info.lua: | function replace_sensitive_info(tag, timestamp, record) -- mask social security number record["message"] = string.gsub(record["message"], "%d%d%d%-+%d%d%-+%d%d%d%d", "xxx-xx-xxxx") -- mask credit card number record["message"] = string.gsub(record["message"], "%d%d%d%d *%d%d%d%d *%d%d%d%d *%d%d%d%d", "xxxx xxxx xxxx xxxx") -- mask email address record["message"] = string.gsub(record["message"], "[%w+%.%-_]+@[%w+%.%-_]+%.%a%a+", "user@email.tld") return 1, timestamp, record end filter-kubernetes.conf: | [FILTER] Name kubernetes Match k8s_application.* Kube_URL https://kubernetes.default.svc:443 Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token Kube_Tag_Prefix kube.var.log.containers. # Try to merge the log messages Merge_Log On Merge_Log_Key log_processed K8S-Logging.Parser On K8S-Logging.Exclude Off ### Sample log scrubbing filters # [FILTER] # Name lua # Match k8s_application.* # # lua script to redact sensitive data in log messages # script replace_info.lua # call replace_sensitive_info ### End sample log scrubbing filters output-stackdriver.conf: | [OUTPUT] # https://docs.fluentbit.io/manual/pipeline/outputs/stackdriver Name stackdriver Match k8s_application.* Resource k8s_container k8s_cluster_name ${CLUSTER_TYPE}/${CLUSTER_NAME} k8s_cluster_location ${REGION} # Custom RegEx for matching the fields in the local_resource_id # https://github.com/fluent/fluent-bit/pull/3200 custom_k8s_regex ^(?<namespace_name>[^_.]+)\.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)\.(?<container_name>[^.]+)$ Severity_key severity tag_prefix k8s_application # https://docs.fluentbit.io/manual/administration/buffering-and-storage#output-section-configuration storage.total_limit_size 1G # https://docs.fluentbit.io/manual/administration/scheduling-and-retries#configuring-retries # Total retry time wil be 2^14 seconds ~= 4.5 hours which will makes offline buffer limit as 4.5 hours Retry_Limit 14 parsers.conf: | [PARSER] Name k8s-container-custom-tag Format regex Regex ^(?<namespace_name>[^_.]+)\.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)\.(?<container_name>[^.]+)$ [PARSER] # https://rubular.com/r/Vn30bO78GlkvyB Name cri Format regex # The timestamp is described in https://www.rfc-editor.org/rfc/rfc3339#section-5.6 Regex ^(?<time>[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt ][0-9]{2}:[0-9]{2}:[0-9]{2}(?:\.[0-9]+)?(?:[Zz]|[+-][0-9]{2}:[0-9]{2})) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<message>.*)$ Time_Key time Time_Format %Y-%m-%dT%H:%M:%S.%L%z [PARSER] # https://github.com/golang/glog/blob/master/glog.go Name glog Format regex Regex ^((?<severity>\w)\d{4} [^\s]*\s+\d+\s+(?<source_file>[^ \]]+)\:(?<source_line>\d+)\]\s)?"?(?<message>.*)"?$ [PARSER] # https://docs.fluentbit.io/manual/parser/json Name json Format json [PARSER] # https://github.com/golang/glog/blob/master/glog.go # glog parser used by workload logging. Name appglog Format regex Regex ^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source_file>[^ \]]+)\:(?<source_line>\d+)\]\s(?<message>.*)$ Time_Key time Time_Format %m%d %H:%M:%S.%L%z