beats icon indicating copy to clipboard operation
beats copied to clipboard

Filebeat 8.12.0 does not collect kubernetes.deployment.name field of Kubernetes Pods logs

Open RomanIzvozchikov opened this issue 1 year ago • 5 comments

Hi all!

Problem: Filebeat 8.12.0 does not collect kubernetes.deployment.name field of logs while it collects for example kubernetes.statefulset.name, kubernetes.daemonset.name. So, in general Kubernetes Pods logs are collected. The only problem is with absence of kubernetes.deployment.name field for pods that are controlled by Deployment (to be more precise for pods that are controlled by ReplicaSets that are controlled by Deployments). I noticed that kubernetes.deployment.name is collected correctly by Filebeat 7.17.16 with the same configuration. I don't have any errors in Filebeat logs 8.12.0 as well as 7.17.16.

Usage scenario: We use Elastic Cloud in Kubernetes + Filebeat to collect logs from Kubernetes Pods. Our Kubernetes cluster is AWS EKS cluster.

Versions: ElasticSearch: 8.11.3 Filebeat: 8.12.0

Operating System: We use docker.elastic.co/beats/filebeat:8.12.0 image.

Filebeat config:

filebeat.inputs:
  - type: container
    paths:
      - /var/log/containers/*.log
    processors:
      - add_kubernetes_metadata:
          host: ${NODE_NAME}
          matchers:
            - logs_path:
                logs_path: "/var/log/containers/"
      - drop_event:
          when.or:
            - equals.kubernetes.namespace: "ingress-nginx"
            - equals.kubernetes.namespace: "monitoring"
            - equals.kubernetes.deployment.name: "cluster-autoscaler"
            - equals.kubernetes.deployment.name: "vault-secrets"
      - drop_fields:
          fields: [
            "container.id",
            "container.runtime",
            "input.type",
            "kubernetes.container.image",
            "kubernetes.labels.pod-template-hash",
            "kubernetes.namespace_labels.kubernetes_io/metadata_name",
            "kubernetes.namespace_uid",
            "kubernetes.node.hostname",
            "kubernetes.node.labels.arch",
            "kubernetes.node.labels.beta_kubernetes_io/arch",
            "kubernetes.node.labels.beta_kubernetes_io/instance-type",
            "kubernetes.node.labels.beta_kubernetes_io/os",
            "kubernetes.node.labels.eks_amazonaws_com/capacityType",
            "kubernetes.node.labels.eks_amazonaws_com/nodegroup",
            "kubernetes.node.labels.eks_amazonaws_com/nodegroup-image",
            "kubernetes.node.labels.eks_amazonaws_com/sourceLaunchTemplateId",
            "kubernetes.node.labels.eks_amazonaws_com/sourceLaunchTemplateVersion",
            "kubernetes.node.labels.failure-domain_beta_kubernetes_io/region",
            "kubernetes.node.labels.failure-domain_beta_kubernetes_io/zone",
            "kubernetes.node.labels.instanceBillingType",
            "kubernetes.node.labels.k8s_io/cloud-provider-aws",
            "kubernetes.node.labels.kubernetes_io/arch",
            "kubernetes.node.labels.kubernetes_io/hostname",
            "kubernetes.node.labels.kubernetes_io/os",
            "kubernetes.node.labels.node_kubernetes_io/instance-type",
            "kubernetes.node.labels.topology_ebs_csi_aws_com/zone",
            "kubernetes.node.labels.topology_kubernetes_io/zone",
            "kubernetes.node.labels.usageType",
            "kubernetes.node.name",
            "kubernetes.node.uid",
            "kubernetes.pod.ip",
            "kubernetes.pod.uid",
            "kubernetes.replicaset.name",
            "log.file.path",
            "log.offset",
          ]
          ignore_missing: true

processors:
  - add_fields:
      target: ''
      fields:
        env: 'dev'

  - decode_json_fields:
      fields: [ "message"]
      process_array: false
      max_depth: 1
      target: "logs"
      overwrite_keys: false
      add_error_key: false

output.elasticsearch:
  hosts: [ '${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}' ]
  username: ${ELASTICSEARCH_USERNAME}
  password: ${ELASTICSEARCH_PASSWORD}
  protocol: https

setup:
  kibana:
    host: '${KIBANA_HOST:elasticsearch}:${KIBANA_PORT:9200}'
    username: ${ELASTICSEARCH_USERNAME}
    password: ${ELASTICSEARCH_PASSWORD}
    
  template.settings:
    index.number_of_replicas: 0

Filebeat cluster role:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: filebeat
  labels:
    k8s-app: filebeat
rules:
  - verbs:
      - get
      - watch
      - list
    apiGroups:
      - ''
    resources:
      - namespaces
      - pods
      - nodes
  - verbs:
      - get
      - list
      - watch
    apiGroups:
      - apps
    resources:
      - replicasets

Example stdout output with Filebeat 8.12.0 (I replaced any sesitive information with <SENSITIVE_INFORMATION> placeholder):

{
  "@timestamp": "2024-01-22T10:26:44.429Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "8.12.0"
  },
  "ecs": {
    "version": "8.0.0"
  },
  "env": "dev",
  "logs": {
    "!BADKEY": 0,
    "<SENSITIVE_INFORMATION>": 601883,
    "time": "2024-01-22T10:26:44.429523284Z",
    "level": "DEBUG",
    "msg": "<SENSITIVE_INFORMATION>",
    "version": "<SENSITIVE_INFORMATION>",
    "revision": "<SENSITIVE_INFORMATION>"
  },
  "stream": "stdout",
  "message": "<SENSITIVE_INFORMATION>",
  "input": {},
  "container": {
    "image": {
      "name": "<SENSITIVE_INFORMATION>"
    }
  },
  "log": {
    "file": {}
  },
  "kubernetes": {
    "container": {
      "name": "<SENSITIVE_INFORMATION>"
    },
    "node": {
      "labels": {
        "topology_kubernetes_io/region": "eu-west-1"
      }
    },
    "pod": {
      "name": "<SENSITIVE_INFORMATION>"
    },
    "namespace": "<SENSITIVE_INFORMATION>",
    "namespace_labels": {},
    "replicaset": {},
    "labels": {
      "io_kompose_service": "<SENSITIVE_INFORMATION>"
    }
  },
  "host": {
    "name": "<SENSITIVE_INFORMATION>"
  },
  "agent": {
    "ephemeral_id": "<SENSITIVE_INFORMATION>",
    "id": "<SENSITIVE_INFORMATION>",
    "name": "<SENSITIVE_INFORMATION>",
    "type": "filebeat",
    "version": "8.12.0"
  }
}

Example stdout output with Filebeat 8.12.0 (I replaced any sesitive information with <SENSITIVE_INFORMATION> placeholder):

{
  "@timestamp": "2024-01-22T10:24:02.676Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.17.16"
  },
  "stream": "stdout",
  "message": "<SENSITIVE_INFORMATION>",
  "host": {
    "name": "<SENSITIVE_INFORMATION>"
  },
  "logs": {
    "time": "2024-01-22T10:24:02.676572399Z",
    "level": "DEBUG",
    "msg": "<SENSITIVE_INFORMATION>",
    "version": "<SENSITIVE_INFORMATION>",
    "revision": "<SENSITIVE_INFORMATION>",
    "!BADKEY": 0,
    "<SENSITIVE_INFORMATION>": 601880
  },
  "env": "dev",
  "log": {
    "file": {}
  },
  "input": {},
  "container": {
    "image": {
      "name": "<SENSITIVE_INFORMATION>"
    }
  },
  "kubernetes": {
    "replicaset": {},
    "labels": {
      "io_kompose_service": "<SENSITIVE_INFORMATION>"
    },
    "node": {
      "labels": {
        "topology_kubernetes_io/region": "eu-west-1"
      }
    },
    "namespace": "<SENSITIVE_INFORMATION>",
    "namespace_labels": {},
    "container": {
      "name": "<SENSITIVE_INFORMATION>"
    },
    "deployment": {
      "name": "<SENSITIVE_INFORMATION>"
    },
    "pod": {
      "name": "<SENSITIVE_INFORMATION>"
    }
  },
  "agent": {
    "version": "7.17.16",
    "hostname": "<SENSITIVE_INFORMATION>",
    "ephemeral_id": "<SENSITIVE_INFORMATION>",
    "id": "<SENSITIVE_INFORMATION>",
    "name": "<SENSITIVE_INFORMATION>",
    "type": "filebeat"
  },
  "ecs": {
    "version": "1.12.0"
  }
}

We can observe that in Filebeat 7.17.16 there is kubernetes.deployment.name field. I added kubernetes.replicaset.name to my drop_fields configuration, but I have empty kubernetes.replicaset.name even without respective drop_fields configuration.

I hope that I added all required information to check this issue. I respect any mention.

Thank you for you attention!

RomanIzvozchikov avatar Jan 22 '24 11:01 RomanIzvozchikov

This issue doesn't have a Team:<team> label.

botelastic[bot] avatar Jan 22 '24 11:01 botelastic[bot]

Hey @RomanIzvozchikov

can you please try to add to add_kubernetes_metadata processor deployment: true configuration and check if it fixes the issue?

tetianakravchenko avatar Jan 23 '24 10:01 tetianakravchenko

Hi @tetianakravchenko,

Thank you for your reply! I have already tried to set deployment: true. It did not help me, because as I red in documentation deployment: true is default value.

RomanIzvozchikov avatar Jan 23 '24 11:01 RomanIzvozchikov

This also happens on filebeat 8.11.4: with the following config:

logging.level: debug
logging.selectors:
- processors
- publish
filebeat.autodiscover:
  providers:
  - type: kubernetes
    hints:
      enabled: true
      default_config:
        type: filestream
        id: kubernetes-container-logs-${data.kubernetes.pod.name}-${data.kubernetes.container.id}
        take_over: true
        enabled: false # This is for opt-in log collection with co.elastic.logs/enabled=true
        paths:
        - /var/log/containers/*-${data.kubernetes.container.id}.log  # CRI path
        parsers:
        - container: 
            stream: all
            format: auto
        prospector:
          scanner:
            symlinks: true
    add_ressource_metadata: # Considers namespace annotations for hints
      deployment: true
      namespace:
        include_annotations:
          - "nsannotations1"
processors:
- rename:
    ignore_missing: true
    fail_on_error: false
    fields:
    - from: kubernetes.labels.<REDACTED>
      to: <REDACTED>
    - from: kubernetes.labels.<REDACTED>
      to: <REDACTED>
    - from: kubernetes.labels.<REDACTED>
      to: <REDACTED>
    - from: kubernetes.namespace_labels.<REDACTED>
      to: <REDACTED>
    - from: kubernetes.namespace_labels.<REDACTED>
      to: <REDACTED>
    - from: kubernetes.namespace_labels.<REDACTED>
      to: <REDACTED>
- copy_fields:
    fields:
    - from: <REDACTED>
      to: <REDACTED>
    when:
      not:
        has_fields:
        - <REDACTED>
output:
  kafka:
    version: 2
    hosts:
  <REDACTED>

8.10.4 produce the following events (taken from filebeat log with debug + processors):

{
  "@timestamp": "2024-02-29T15:29:38.379Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "8.10.4"
  },
  "input": {
    "type": "filestream"
  },
  "agent": {
    "ephemeral_id": "6be1298f-361d-43a0-9931-aa8e3e5647cb",
    "id": "9306e44f-d4ab-45cf-8022-81a821ab841a",
    "name": "<CLUSTERNAME>-filebeat-filebeat-4qm8f",
    "type": "filebeat",
    "version": "8.10.4"
  },
  "host": {
    "name": "tpridak8s-filebeat-filebeat-4qm8f"
  },
  ... (redacted fields, added by processors from k8s labels)
  "log": {
    "file": {
      "path": "/var/log/containers/test-filebeat-55795d7b56-xdj5x_mgautier_alpine-7f5b519751e4a9bf1dc626bdbbb9c432cc52fb5e6279dd071b9ce1cde6d43745.log",
      "device_id": 64771,
      "inode": 2120385
    },
    "offset": 1505474
  },
  "stream": "stdout",
  "container": {
    "id": "7f5b519751e4a9bf1dc626bdbbb9c432cc52fb5e6279dd071b9ce1cde6d43745",
    "runtime": "containerd",
    "image": {
      "name": "alpine"
    }
  },
  "ecs": {
    "version": "8.0.0"
  },
  "message": "Thu Feb 29 15:29:38 UTC 2024",
  "kubernetes": {
    "pod": {
      "name": "test-filebeat-55795d7b56-xdj5x",
      "uid": "a6c6871a-fb63-48df-abe6-568588f6b050",
      "ip": "10.249.145.220"
    },
    "container": {
      "name": "alpine"
    },
    "namespace_labels": {
      "kubernetes_io/metadata_name": "mgautier"
    },
    "deployment": {
      "name": "test-filebeat"
    },
    "labels": {
      "app": "test-filebeat",
      "pod-template-hash": "55795d7b56"
    },
    "replicaset": {
      "name": "test-filebeat-55795d7b56"
    },
    "node": {
      "hostname": "<REDACTED>",
      "name": "<REDACTED>",
      "uid": "43e8b4fa-466d-459b-a170-7ab7e81ac768",
      "labels": {
        "kubernetes_io/hostname": "<REDACTED>",
        "kubernetes_io/os": "linux",
        "topology_kubernetes_io/zone": "pair",
        "beta_kubernetes_io/arch": "amd64",
        "beta_kubernetes_io/os": "linux",
        "kubernetes_io/arch": "amd64"
      }
    },
    "namespace_uid": "a6cb1cce-47b8-4bef-a18b-5461f815f626",
    "namespace": "mgautier"
  }
}

And 8.11.4

{
  "@timestamp": "2024-02-29T15:19:08.354Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "8.11.4"
  },
  "stream": "stdout",
  "message": "Thu Feb 29 15:19:08 UTC 2024",
  "input": {
    "type": "filestream"
  },
  "agent": {
    "ephemeral_id": "1e7c2f0e-8398-4521-a78d-5d5bc9204379",
    "id": "9306e44f-d4ab-45cf-8022-81a821ab841a",
    "name": "<CLUSTERNAME>-filebeat-filebeat-5r6td",
    "type": "filebeat",
    "version": "8.11.4"
  },
  "log": {
    "offset": 1500439,
    "file": {
      "device_id": "64771",
      "inode": "2120385",
      "path": "/var/log/containers/test-filebeat-55795d7b56-xdj5x_mgautier_alpine-7f5b519751e4a9bf1dc626bdbbb9c432cc52fb5e6279dd071b9ce1cde6d43745.log"
    }
  },
  "kubernetes": {
    "node": {
      "labels": {
        "beta_kubernetes_io/os": "linux",
        "kubernetes_io/arch": "amd64",
        "kubernetes_io/hostname": "<REDACTED>",
        "kubernetes_io/os": "linux",
        "topology_kubernetes_io/zone": "pair",
        "beta_kubernetes_io/arch": "amd64"
      },
      "hostname": "<REDACTED>",
      "name": "<REDACTED>",
      "uid": "43e8b4fa-466d-459b-a170-7ab7e81ac768"
    },
    "pod": {
      "uid": "a6c6871a-fb63-48df-abe6-568588f6b050",
      "ip": "10.249.145.220",
      "name": "test-filebeat-55795d7b56-xdj5x"
    },
    "namespace": "mgautier",
    "namespace_uid": "a6cb1cce-47b8-4bef-a18b-5461f815f626",
    "namespace_labels": {
      "kubernetes_io/metadata_name": "mgautier"
    },
    "replicaset": {
      "name": "test-filebeat-55795d7b56"
    },
    "labels": {
      "pod-template-hash": "55795d7b56",
      "app": "test-filebeat"
    },
    "container": {
      "name": "alpine"
    }
  },
  "container": {
    "id": "7f5b519751e4a9bf1dc626bdbbb9c432cc52fb5e6279dd071b9ce1cde6d43745",
    "runtime": "containerd",
    "image": {
      "name": "alpine"
    }
  },
  "host": {
    "name": "<CLUSTERNAME>-filebeat-filebeat-5r6td"
  },
  "ecs": {
    "version": "8.0.0"
  },
  // processed fields from labels (REDACTED)
  
}

VannTen avatar Feb 29 '24 15:02 VannTen

I had the same problem with Filebeat 8.11.4 before switching to 8.12.0. Probably, this problem exists in both these versions.

RomanIzvozchikov avatar Feb 29 '24 16:02 RomanIzvozchikov

Deployment metadata enrichment is disabled by default since 8.11.0, see https://www.elastic.co/guide/en/beats/libbeat/current/release-notes-8.11.0.html

It was disabled because it might cause a memory leak.

But you can add the same functionality by using a ingest pipeline, as described here: https://github.com/elastic/integrations/issues/8176

Using a processor should also work (make sure to drop the replicaset name afterwards):

      - copy_fields:
          fields:
          - from: "kubernetes.replicaset.name"
            to: "kubernetes.deployment.name"
        when.has_fields: ['kubernetes.replicaset.name']
      - replace:
          fields:
          - field: "kubernetes.deployment.name"
            pattern: "(-[a-z0-9]+)$"
            replacement: ""
        when.has_fields: ['kubernetes.deployment.name']

thechristschn avatar Apr 23 '24 13:04 thechristschn

Thanks a lot @thechristschn for this useful information! I din't find this information in documentation during investigating the issue.

RomanIzvozchikov avatar Apr 23 '24 14:04 RomanIzvozchikov

@thechristschn I used your processor idea (but had to slightly modify it to be valid - indentation of when.has_fields):

      - copy_fields:
          fields:
          - from: "kubernetes.replicaset.name"
            to: "kubernetes.deployment.name"
          when.has_fields: ['kubernetes.replicaset.name']
      - replace:
          fields:
          - field: "kubernetes.deployment.name"
            pattern: "(-[a-z0-9]+)$"
            replacement: ""
          when.has_fields: ['kubernetes.deployment.name']

But what do you mean with "make sure to drop the replicaset name afterwards"?

kipusoep avatar Jul 19 '24 10:07 kipusoep