role: Agent
image:
  repository: "{{ .ImageRepo }}"
  tag: "{{ .ImageTag }}"
resources: {{ .Resources }}
podPriorityClassName: "{{ .PriorityClassName }}"
service:
  enabled: false
secrets:
  generic:
    awsAccessKeyId: "{{ .AccessKeyID }}"
    awsSecretAccessKey: "{{ .SecretAccessKey }}"
env:
  - name: AWS_ACCESS_KEY_ID
    valueFrom:
      secretKeyRef:
        key: awsAccessKeyId
        name: o11y-vector
  - name: AWS_SECRET_ACCESS_KEY
    valueFrom:
      secretKeyRef:
        key: awsSecretAccessKey
        name: o11y-vector
  - name: VECTOR_SELF_NODE_NAME
    valueFrom:
      fieldRef:
        apiVersion: v1
        fieldPath: spec.nodeName
tolerations:
  - operator: Exists
containerPorts:
  - name: prom-exporter
    containerPort: 9598
    protocol: TCP
  - name: api
    containerPort: 8686
    protocol: TCP
readinessProbe:
  httpGet:
    path: /health
    port: api
  timeoutSeconds: 10
livenessProbe:
  httpGet:
    path: /health
    port: api
  initialDelaySeconds: 30
  periodSeconds: 30
  failureThreshold: 10
  timeoutSeconds: 10
podSecurityContext:
  runAsNonRoot: true
  runAsUser: 1000
  runAsGroup: 0
  supplementalGroups:
  - 190
securityContext:
  readOnlyRootFilesystem: true
  allowPrivilegeEscalation: false
  privileged: false
  capabilities:
    drop:
    - NET_RAW

extraVolumes:
  - name: machine-id
    hostPath:
      path: /etc/machine-id
      type: File
extraVolumeMounts:
  - name: machine-id
    mountPath: /etc/machine-id
    readOnly: true

initContainers:
  - name: volume-permission-fix
    image: "{{ .InitContainerImage }}"
    command: ['sh', '-c', 'chown -R 1000:2000 /vector-data-dir']
    volumeMounts:
    - name: data
      mountPath: /vector-data-dir
    securityContext:
      runAsNonRoot: false
      runAsUser: 0
      runAsGroup: 0
      readOnlyRootFilesystem: false
      allowPrivilegeEscalation: true
persistence:
  enabled: true
  hostPath:
    enabled: true
    path: "/var/lib/vector/01"
dataDir: /vector-data-dir
customConfig:
  data_dir: /vector-data-dir
  api:
    enabled: true
    address: 0.0.0.0:8686
    playground: false
  sources:
    kubernetes_logs:
      type: kubernetes_logs
      rotate_wait_secs: 60 # 1 minutes
    journald:
      type: journald
    internal_logs:
      type: internal_logs
    internal_metrics:
      type: internal_metrics
  transforms:
    journald_add_metadata:
      type: remap
      inputs:
        - journald
      source: .o11y.component = "journald"
    internal_logs_add_metadata:
      type: remap
      inputs:
        - internal_logs
      source: .o11y.component = "vector"
    kubernetes_logs_add_metadata:
      type: remap
      inputs:
        - kubernetes_logs
      source: |-
        # Component
        if !is_null(.kubernetes.container_name) && (.kubernetes.container_name == "slowlog" || .kubernetes.container_name == "ti-slowlog") {
          .o11y.component = "slowlog"
        } else if !is_null(.kubernetes.pod_labels."app.kubernetes.io/component") {
          .o11y.component = .kubernetes.pod_labels."app.kubernetes.io/component"
        } else if !is_null(.kubernetes.container_name) {
          .o11y.component = .kubernetes.container_name
        } else {
          .o11y.component = "unknown"
        }
        # Tenant ID
        if !is_null(.kubernetes.pod_labels."tags.tidbcloud.com/tenant") {
          .o11y.tenant_id = .kubernetes.pod_labels."tags.tidbcloud.com/tenant"
        } else {
          .o11y.tenant_id = "unknown"
        }
        # Cluster ID
        if !is_null(.kubernetes.pod_labels."tags.tidbcloud.com/cluster") {
          .o11y.cluster_id = .kubernetes.pod_labels."tags.tidbcloud.com/cluster"
        } else {
          .o11y.cluster_id = "unknown"
        }
        # SharedPool ID
        if !is_null(.kubernetes.pod_labels."tags.tidbcloud.com/resource-pool") {
          .o11y.sharedpool_id = .kubernetes.pod_labels."tags.tidbcloud.com/resource-pool"
        } else {
          .o11y.sharedpool_id = "unknown"
        }
        # TiDB Cluster ID (cluster_id if not unknown, else sharedpool_id)
        if .o11y.cluster_id != "unknown" {
          .o11y.tidb_cluster_id = .o11y.cluster_id
        } else {
          .o11y.tidb_cluster_id = .o11y.sharedpool_id
        }
    kubernetes_logs_routes:
      type: route
      inputs:
        - kubernetes_logs_add_metadata
      route:
        slow_logs: .o11y.component == "slowlog"
    kubernetes_logs_slow_logs_merged:
      type: reduce
      inputs:
        - kubernetes_logs_routes.slow_logs
      starts_when:
        type: vrl
        source: |-
          res, err = starts_with(.message, "# Time: ")
          if err != null {
            false
          } else {
            res
          }
      merge_strategies:
        message: concat_newline
    kubernetes_logs_add_prefix:
      type: remap
      inputs:
        - kubernetes_logs_slow_logs_merged
        - kubernetes_logs_routes._unmatched
      source: |-
        t = to_string!(.timestamp)
        node = .kubernetes.pod_node_name
        pod_namespace = .kubernetes.pod_namespace
        pod_name = .kubernetes.pod_name
        container_name = .kubernetes.container_name
        prefix = join!([t, node, pod_namespace, pod_name, container_name], ";")
        new_message, err = prefix + " " + .message
        if err == null {
          .message = new_message
        }
    kubernetes_logs_add_prefix_routes:
      type: route
      inputs:
        - kubernetes_logs_add_prefix
      route:
        tidb_logs: .o11y.component == "slowlog" || .o11y.component == "tidb"
        shared_pool_logs: .o11y.sharedpool_id != "unknown" && .o11y.component != "slowlog" && .o11y.component != "tidb"
  sinks:
    loki_kubernetes_logs:
      type: loki
      inputs:
        - kubernetes_logs_slow_logs_merged
        - kubernetes_logs_routes._unmatched
      endpoint: "{{ .LokiURL }}"
      labels:
        cluster_env: "{{ .ClusterEnv }}"
        cluster: "{{ .ClusterName }}"
        component: {{ "'{{ `{{ o11y.component }}` }}'" }}
        tenant_id: {{ "'{{ `{{ o11y.tenant_id }}` }}'" }}
        cluster_id: {{ "'{{ `{{ o11y.cluster_id }}` }}'" }}
        sharedpool_id: {{ "'{{ `{{ o11y.sharedpool_id }}` }}'" }}
        tidb_cluster_id: {{ "'{{ `{{ o11y.tidb_cluster_id }}` }}'" }}
        node: {{ "'{{ `{{ kubernetes.pod_node_name }}` }}'" }}
        namespace: {{ "'{{ `{{ kubernetes.pod_namespace }}` }}'" }}
        instance: {{ "'{{ `{{ kubernetes.pod_name }}` }}'" }}
        container: {{ "'{{ `{{ kubernetes.container_name }}` }}'" }}
        stream: {{ "'{{ `{{ stream }}` }}'" }}
      batch:
        max_bytes: 10240 # 10 KiB
        timeout_secs: 1 # 1 second
      buffer:
        type: disk
        max_size: 1073741824 # 1 GiB
        when_full: drop_newest
      compression: gzip
      encoding:
        codec: text
      out_of_order_action: "accept"
    loki_journald:
      type: loki
      inputs:
        - journald_add_metadata
      endpoint: "{{ .LokiURL }}"
      labels:
        cluster_env: "{{ .ClusterEnv }}"
        cluster: "{{ .ClusterName }}"
        instance_id: {{ "'{{ `{{ host }}` }}'" }}
        node: "${VECTOR_SELF_NODE_NAME}"
        syslog: {{ "'{{ `{{ SYSLOG_IDENTIFIER }}` }}'" }}
      batch:
        max_bytes: 10240 # 10 KiB
        timeout_secs: 1 # 1 second
      buffer:
        type: disk
        max_size: 1073741824 # 1 GiB
        when_full: drop_newest
      compression: gzip
      encoding:
        codec: text
      out_of_order_action: "accept"
    loki_internal_logs:
      type: loki
      inputs:
        - internal_logs_add_metadata
      endpoint: "{{ .LokiURL }}"
      labels:
        cluster_env: "{{ .ClusterEnv }}"
        cluster: "{{ .ClusterName }}"
        node: "${VECTOR_SELF_NODE_NAME}"
        instance_id: {{ "'{{ `{{ host }}` }}'" }}
        app: vector_log_agent
      batch:
        max_bytes: 10240 # 10 KiB
        timeout_secs: 1 # 1 second
      buffer:
        type: disk
        max_size: 1073741824 # 1 GiB
        when_full: drop_newest
      compression: gzip
      encoding:
        codec: text
      out_of_order_action: "accept"
    aws_s3_tidb_logs:
      type: aws_s3
      inputs:
        - kubernetes_logs_add_prefix_routes.tidb_logs
      region: "{{ .Region }}"
      bucket: "{{ .Bucket }}"
      key_prefix: "0/next-gen/{{ "{{ `{{ o11y.cluster_id }}` }}" }}/logs/{{ "{{ `{{ o11y.component }}` }}" }}/"
      endpoint: "http://oss-{{ .Region }}-internal.aliyuncs.com"
      force_path_style: false
      compression: gzip
      batch:
        max_bytes: 104857600 # 100 MiB
        timeout_secs: 180 # 3 minutes
      buffer:
        type: disk
        max_size: 1073741824 # 1 GiB
        when_full: drop_newest
      encoding:
        codec: text
      healthcheck:
        enabled: false
    aws_s3_other_logs:
      type: aws_s3
      inputs:
        - kubernetes_logs_add_prefix_routes._unmatched
      region: "{{ .Region }}"
      bucket: "{{ .Bucket }}"
      key_prefix: "0/next-gen-dataplane/{{ .ClusterName }}/logs/{{ "{{ `{{ o11y.component }}` }}" }}/"
      endpoint: "http://oss-{{ .Region }}-internal.aliyuncs.com"
      force_path_style: false
      compression: gzip
      batch:
        max_bytes: 104857600 # 100 MiB
        timeout_secs: 180 # 3 minutes
      buffer:
        type: disk
        max_size: 1073741824 # 1 GiB
        when_full: drop_newest
      encoding:
        codec: text
      healthcheck:
        enabled: false
    aws_s3_shared_pool_logs:
      type: aws_s3
      inputs:
        - kubernetes_logs_add_prefix_routes.shared_pool_logs
      region: "{{ .Region }}"
      bucket: "{{ .Bucket }}"
      key_prefix: "0/shared_pool/{{ "{{ `{{ o11y.sharedpool_id }}` }}" }}/logs/{{ "{{ `{{ o11y.component }}` }}" }}/"
      endpoint: "http://oss-{{ .Region }}-internal.aliyuncs.com"
      force_path_style: false
      compression: gzip
      batch:
        max_bytes: 104857600 # 100 MiB
        timeout_secs: 180 # 3 minutes
      buffer:
        type: disk
        max_size: 1073741824 # 1 GiB
        when_full: drop_newest
      encoding:
        codec: text
      healthcheck:
        enabled: false
    internal_metrics_exporter:
      type: prometheus_exporter
      inputs:
        - internal_metrics
      address: "0.0.0.0:9598"
