{{- if .Values.monitoring.enabled -}}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-config
  namespace: amazon-cloudwatch
  labels:
    app: fluent-bit
    component: metric-collector
    part-of: logging-monitoring
data:
  fluent-bit.conf: |
    [SERVICE]
        Flush                     5
        Log_Level                 Debug
        Daemon                    off
        Parsers_File              parsers.conf
        storage.path              /var/fluent-bit/state/flb-storage/
        storage.sync              normal
        storage.checksum          off
        storage.backlog.mem_limit 5M

    @INCLUDE dataplane-log.conf
    @INCLUDE host-log.conf

  dataplane-log.conf: |
    [INPUT]
        Name                systemd
        Tag                 dataplane.systemd.*
        Systemd_Filter      _SYSTEMD_UNIT=docker.service
        DB                  /var/fluent-bit/state/systemd.db
        Path                /var/log/journal
        Read_From_Tail      ${READ_FROM_TAIL}

    [INPUT]
        Name                tail
        Tag                 dataplane.tail.*
        Path                /var/log/containers/aws-node*, /var/log/containers/kube-proxy*
        Docker_Mode         On
        Docker_Mode_Flush   5
        Docker_Mode_Parser  container_firstline
        Parser              docker
        DB                  /var/fluent-bit/state/flb_dataplane_tail.db
        Mem_Buf_Limit       50MB
        Skip_Long_Lines     On
        Refresh_Interval    10
        Rotate_Wait         30
        storage.type        filesystem
        Read_from_Head      ${READ_FROM_HEAD}

    [FILTER]
        Name                modify
        Match               dataplane.systemd.*
        Rename              _HOSTNAME                   hostname
        Rename              _SYSTEMD_UNIT               systemd_unit
        Rename              MESSAGE                     message
        Remove_regex        ^((?!hostname|systemd_unit|message).)*$

    [FILTER]
        Name                aws
        Match               dataplane.*
        imds_version        v1

    [OUTPUT]
        Name                cloudwatch_logs
        Match               dataplane.*
        region              ${AWS_REGION}
        log_group_name      /aws/containerinsights/${CLUSTER_NAME}/dataplane
        log_stream_prefix   ${HOST_NAME}-
        auto_create_group   true
        extra_user_agent    container-insights

{{- if .Values.fluentbit.output.elasticsearch }}
    [OUTPUT]
        Name                es
        Match               dataplane.*
        Host                {{ .Values.fluentbit.output.elasticsearch.host }}
        Port                {{ .Values.fluentbit.output.elasticsearch.port }}
        Index               dataplane.fluent.${CLUSTER_NAME}
        Generate_ID         On
        AWS_Auth            On
        AWS_Region          ${AWS_REGION}

{{- end }}
{{- if .Values.fluentbit.output.kinesis.dataplane }}
    [OUTPUT]
        Name                kinesis
        Match               dataplane.*
        region              ${AWS_REGION}
        stream              {{ .Values.fluentbit.output.kinesis.dataplane.stream }}

{{- end }}
{{- if .Values.fluentbit.output.s3.dataplane }}
    [OUTPUT]
        Name                s3
        Match               dataplane.*
        region              ${AWS_REGION}
        bucket              {{ .Values.fluentbit.output.s3.dataplane.bucket }}

{{- end }}
  host-log.conf: |
    [INPUT]
        Name                tail
        Tag                 host.dmesg
        Path                /var/log/dmesg
        Parser              syslog
        DB                  /var/fluent-bit/state/flb_dmesg.db
        Mem_Buf_Limit       5MB
        Skip_Long_Lines     On
        Refresh_Interval    10
        Read_from_Head      ${READ_FROM_HEAD}

    [INPUT]
        Name                tail
        Tag                 host.messages
        Path                /var/log/messages
        Parser              syslog
        DB                  /var/fluent-bit/state/flb_messages.db
        Mem_Buf_Limit       5MB
        Skip_Long_Lines     On
        Refresh_Interval    10
        Read_from_Head      ${READ_FROM_HEAD}

    [INPUT]
        Name                tail
        Tag                 host.secure
        Path                /var/log/secure
        Parser              syslog
        DB                  /var/fluent-bit/state/flb_secure.db
        Mem_Buf_Limit       5MB
        Skip_Long_Lines     On
        Refresh_Interval    10
        Read_from_Head      ${READ_FROM_HEAD}

    [FILTER]
        Name                aws
        Match               host.*
        imds_version        v1

    [OUTPUT]
        Name                cloudwatch_logs
        Match               host.*
        region              ${AWS_REGION}
        log_group_name      /aws/containerinsights/${CLUSTER_NAME}/host
        log_stream_prefix   ${HOST_NAME}.
        auto_create_group   true
        extra_user_agent    container-insights

{{- if .Values.fluentbit.output.elasticsearch }}
    [OUTPUT]
        Name                es
        Match               host.*
        Host                {{ .Values.fluentbit.output.elasticsearch.host }}
        Port                {{ .Values.fluentbit.output.elasticsearch.port }}
        Index               host.fluent.${CLUSTER_NAME}
        Generate_ID         On
        AWS_Auth            On
        AWS_Region          ${AWS_REGION}

{{- end }}
{{- if .Values.fluentbit.output.kinesis.host }}
    [OUTPUT]
        Name                kinesis
        Match               host.*
        region              ${AWS_REGION}
        stream              {{ .Values.fluentbit.output.kinesis.host.stream }}

{{- end }}
{{- if .Values.fluentbit.output.s3.host }}
    [OUTPUT]
        Name                s3
        Match               host.*
        region              ${AWS_REGION}
        bucket              {{ .Values.fluentbit.output.s3.host.bucket }}

{{- end}}
  application-log.conf: |
    [INPUT]
        Name                tail
        Tag                 application.*
        Exclude_Path        /var/log/containers/cloudwatch-agent*, /var/log/containers/fluent-bit*, /var/log/containers/aws-node*, /var/log/containers/kube-proxy*
        Path                /var/log/containers/*.log
        Docker_Mode         On
        Docker_Mode_Flush   5
        Docker_Mode_Parser  container_firstline
        Parser              docker
        DB                  /var/fluent-bit/state/flb_container.db
        Mem_Buf_Limit       50MB
        Skip_Long_Lines     On
        Refresh_Interval    10
        Rotate_Wait         30
        storage.type        filesystem
        Read_from_Head      ${READ_FROM_HEAD}

    [INPUT]
        Name                tail
        Tag                 application.*
        Path                /var/log/containers/fluent-bit*
        Parser              docker
        DB                  /var/fluent-bit/state/flb_log.db
        Mem_Buf_Limit       5MB
        Skip_Long_Lines     On
        Refresh_Interval    10
        Read_from_Head      ${READ_FROM_HEAD}

    [INPUT]
        Name                tail
        Tag                 application.*
        Path                /var/log/containers/cloudwatch-agent*
        Docker_Mode         On
        Docker_Mode_Flush   5
        Docker_Mode_Parser  cwagent_firstline
        Parser              docker
        DB                  /var/fluent-bit/state/flb_cwagent.db
        Mem_Buf_Limit       5MB
        Skip_Long_Lines     On
        Refresh_Interval    10
        Read_from_Head      ${READ_FROM_HEAD}

    [FILTER]
        Name                kubernetes
        Match               application.*
        Kube_URL            https://kubernetes.default.svc:443
        Kube_Tag_Prefix     application.var.log.containers.
        Merge_Log           On
        Merge_Log_Key       log_processed
        K8S-Logging.Parser  On
        K8S-Logging.Exclude Off
        Labels              Off
        Annotations         Off

    [FILTER]
        Name                aws
        Match               application.*
        imds_version        v1

    [OUTPUT]
        Name                cloudwatch_logs
        Match               host.*
        region              ${AWS_REGION}
        log_group_name      /aws/containerinsights/${CLUSTER_NAME}/application
        log_stream_prefix   ${HOST_NAME}.
        auto_create_group   true
        extra_user_agent    container-insights

{{- if .Values.fluentbit.output.elasticsearch }}
    [OUTPUT]
        Name                es
        Match               application.*
        Host                {{ .Values.fluentbit.output.elasticsearch.host }}
        Port                {{ .Values.fluentbit.output.elasticsearch.port }}
        Index               application.fluent.${CLUSTER_NAME}
        Generate_ID         On
        AWS_Auth            On
        AWS_Region          ${AWS_REGION}

{{- end }}
{{- if .Values.fluentbit.output.kinesis.application }}
    [OUTPUT]
        Name                kinesis
        Match               application.*
        region              ${AWS_REGION}
        stream              {{ .Values.fluentbit.output.kinesis.application.stream }}

{{- end }}
{{- if .Values.fluentbit.output.s3.application }}
    [OUTPUT]
        Name                s3
        Match               application.*
        region              ${AWS_REGION}
        bucket              {{ .Values.fluentbit.output.s3.application.bucket }}
{{- end }}

  parsers.conf: |
    [PARSER]
        Name                docker
        Format              json
        Time_Key            time
        Time_Format         %Y-%m-%dT%H:%M:%S.%LZ

    [PARSER]
        Name                syslog
        Format              regex
        Regex               ^(?<time>[^ ]* {1,2}[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? *(?<message>.*)$
        Time_Key            time
        Time_Format         %b %d %H:%M:%S

    [PARSER]
        Name                container_firstline
        Format              regex
        Regex               (?<log>(?<="log":")\S(?!\.).*?)(?<!\\)".*(?<stream>(?<="stream":").*?)".*(?<time>\d{4}-\d{1,2}-\d{1,2}T\d{2}:\d{2}:\d{2}\.\w*).*(?=})
        Time_Key            time
        Time_Format         %Y-%m-%dT%H:%M:%S.%LZ
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-cluster-info
  namespace: amazon-cloudwatch
  labels:
    app: fluent-bit
    component: metric-collector
    part-of: logging-monitoring
data:
  cluster.name: "{{ .Values.global.clusterName }}"
  logs.region: "{{ .Values.global.region }}"
  read.head: "True"
  read.tail: "On"
{{- end -}}