---
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ template "filebeat.fullname" . }}-config
  namespace: {{ .Release.Namespace }}
  labels:
    app: {{ template "filebeat.name" . }}
data:
  filebeat.yml: |-
    filebeat.autodiscover:
      providers:
      - type: kubernetes
        node: ${NODE_NAME}
        templates:
        - condition:
            or:
            - equals:
                kubernetes.container.name: "auditlog-sidecar"
          config:
          - type: container
            paths:
            - /var/log/containers/*-${data.kubernetes.container.id}.log

    processors:
    - dissect:
        tokenizer: "[%{}] [%{level}] %{}"
        field: "message"
        target_prefix: ""
        ignore_failure: true
    - dissect:
        tokenizer: "tidb%{possible_user_cluster_id}"
        field: "kubernetes.namespace"
        target_prefix: ""
        ignore_failure: true
    - rename:
        fields:
        - from: "host.name"
          to: "host_name"
        - from: "kubernetes.container.name"
          to: "container_name"
        - from: "kubernetes.pod.name"
          to: "instance"
        ignore_missing: true
        fail_on_error: false
    - add_fields:
        target: ""
        fields:
          user_cluster_env: {{ .Values.config.shootLabel }}
    - script:
        lang: javascript
        id: user_cluster_id_converter
        params:
          user_cluster_id_label: kubernetes.labels.tags_tidbcloud_com/cluster
        source: >
          var params = {};
          function register(scriptParams) {
            params = scriptParams;
          }
          function process(event) {
            var userClusterID = event.Get(params.user_cluster_id_label)
            if (userClusterID === null) {
              userClusterID = event.Get("possible_user_cluster_id")
            }
            event.Put("user_cluster_id", userClusterID)
            return event
          }
    - script:
        lang: javascript
        id: component_converter
        params:
          component_annotation: kubernetes.annotaions.debug_tidbcloud_com/log/component_name
          component_label: kubernetes.labels.app_kubernetes_io/component
          component_map_fallback:
            backup: br
            restore: br
            br: br
        source: >
          var params = {};
          function register(scriptParams) {
            params = scriptParams;
          }
          function process(event) {
            var componentName = event.Get(params.component_annotation)
            if (componentName === null) {
              var containerName = event.Get("container_name")
              componentName = params.component_map_fallback[containerName]
              if (componentName === undefined) {
                componentName = event.Get(params.component_label)
                if (componentName === null) {
                  componentName = containerName
                }
              }
            }
            event.Put("component", componentName)
            return event
          }
          function test() {
            var event = process(new Event({container_name: "backup"}));
            if (event.Get("component") !== "br") {
              throw "expected component === br";
            }
          }
    - script:
        lang: javascript
        id: log_file_converter
        params:
          log_file_map_annotation: kubernetes.annotaions.debug_tidbcloud_com/log/file_name
          log_file_map_fallback:
            tidb:
              stdout: tidb.log
              stderr: tidb_stderr.log
            slowlog: tidb-slow.log
            tikv: tikv.log
            raftlog: raftdb
            rocksdblog: rocksdb
            tiflash: tiflash_tikv.log
            errorlog: tiflash_error.log
            clusterlog: tiflash_cluster_manager.log
            serverlog: tiflash.log
            backup: backup.log
            restore: restore.log
            br: br_binary.log
        source: >
          var params = {};
          function register(scriptParams) {
            params = scriptParams;
          }
          function process(event) {
            var logFileMap = event.Get(params.log_file_map_annotation)
            if (logFileMap === null) {
              logFileMap = params.log_file_map_fallback
            }
            var containerName = event.Get("container_name")
            var logFile = logFileMap[containerName]
            if (logFile) {
              var stream = event.Get("stream")
              var streamLogFile = logFile[stream]
              if (streamLogFile) {
                event.Put("log_file", streamLogFile)
              } else {
                event.Put("log_file", logFile)
              }
            }
            return event
          }
          function test() {
            var event = process(new Event({container_name: "slowlog"}));
            if (event.Get("log_file") !== "tidb-slow.log") {
              throw "expected log_file === tidb-slow.log";
            }
          }
    - include_fields:
        fields: ["host_name", "stream", "message", "user_cluster_id", "user_cluster_env", "instance", "level", "component", "log_file", "container_name", "kubernetes.namespace"]

    output.elasticsearch:
      hosts: ["{{ .Values.config.awsESHost }}"]
      username: {{ .Values.config.awsESUserName }}
      password: ${AWS_ES_PWD}
      index: "filebeat-%{[container_name]:unknown}-%{+yyyy.MM.dd}"
    setup.template:
      name: "filebeat-log"
      pattern: "filebeat-*"
      settings:
        index:
          number_of_shards: 1
          number_of_replicas: 1

    setup.kibana:
      host: "{{ .Values.config.awsESHost }}/_plugin/kibana/"

    setup.ilm.enabled: false
    setup.pack.security.enabled: false
    setup.xpack.graph.enabled: false
    setup.xpack.watcher.enabled: false
    setup.xpack.monitoring.enabled: false
    setup.xpack.reporting.enabled: false
