自动发现

编辑

当你在容器上运行应用程序时,它们会成为监控系统的移动目标。自动发现允许你跟踪它们,并在发生更改时调整设置。通过定义配置模板,自动发现子系统可以在服务开始运行时对其进行监控。

你在 filebeat.yml 配置文件的 filebeat.autodiscover 部分中定义自动发现设置。要启用自动发现,你需要指定一个提供程序列表。

提供程序

编辑

自动发现提供程序通过监视系统上的事件,并将这些事件转换为具有通用格式的内部自动发现事件来工作。配置提供程序时,你可以选择使用自动发现事件中的字段来设置条件,当满足条件时,将启动特定的配置。

启动时,Filebeat 将扫描现有容器并为它们启动正确的配置。然后它将监视新的启动/停止事件。这确保你无需担心状态,而只需定义所需的配置。

Docker
编辑

Docker 自动发现提供程序监视 Docker 容器的启动和停止。

它具有以下设置

host
(可选)Docker 套接字(UNIX 或 TCP 套接字)。默认使用 unix:///var/run/docker.sock
ssl
(可选)连接到 Docker 套接字时要使用的 SSL 配置。
cleanup_timeout
(可选)指定在停止容器的正在运行的配置之前的不活动时间,默认为 60 秒。
labels.dedot
(可选)默认为 false。如果设置为 true,则将标签中的点替换为 _

这些是配置模板中可用的字段。每个发出的事件都将提供 docker.* 字段。事件

  • host
  • port
  • docker.container.id
  • docker.container.image
  • docker.container.name
  • docker.container.labels

例如

{
  "host": "10.4.15.9",
  "port": 6379,
  "docker": {
    "container": {
      "id": "382184ecdb385cfd5d1f1a65f78911054c8511ae009635300ac28b4fc357ce51"
      "name": "redis",
      "image": "redis:3.2.11",
      "labels": {
        "io.kubernetes.pod.namespace": "default"
        ...
      }
    }
  }
}

你可以定义一组配置模板,当条件与事件匹配时应用这些模板。模板定义一个用于匹配自动发现事件的条件,以及当此条件发生时要启动的配置列表。

条件匹配来自提供程序的事件。提供程序使用与处理器相同的格式来定义 条件

配置模板可以包含来自自动发现事件的变量。可以通过 data 命名空间访问它们。例如,对于示例事件,“${data.port}”解析为 6379

Filebeat 支持输入和模块的模板。

filebeat.autodiscover:
  providers:
    - type: docker
      templates:
        - condition:
            contains:
              docker.container.image: redis
          config:
            - type: container
              paths:
                - /var/lib/docker/containers/${data.docker.container.id}/*.log
              exclude_lines: ["^\\s+[\\-`('.|_]"]  # drop asciiart lines

此配置为所有名称中带有 redis 的镜像运行的容器启动 docker 日志输入。对于 docker 自动发现,labels.dedot 默认为 true,这意味着 docker 标签中的点默认替换为 _。

如果你正在使用模块,则可以覆盖默认输入并改用 docker 输入。

filebeat.autodiscover:
  providers:
    - type: docker
      templates:
        - condition:
            contains:
              docker.container.image: redis
          config:
            - module: redis
              log:
                input:
                  type: container
                  paths:
                    - /var/lib/docker/containers/${data.docker.container.id}/*.log

使用自动发现时,定义配置模板时必须小心,尤其是在它们从保存多个容器信息的位置读取数据时。例如,在此文件结构下

/mnt/logs/<container_id>/*.log

你可以像这样定义一个配置模板

错误设置:

autodiscover.providers:
  - type: docker
    templates:
      - condition.contains:
          docker.container.image: nginx
        config:
          - type: log
            paths:
              - "/mnt/logs/*/*.log"

这将多次读取给定路径下的所有文件(每个 nginx 容器一次)。你真正想要的是将模板范围限定为与自动发现条件匹配的容器。正确设置

autodiscover.providers:
  - type: docker
    templates:
      - condition.contains:
          docker.container.image: nginx
        config:
          - type: log
            paths:
              - "/mnt/logs/${data.docker.container.id}/*.log"
Kubernetes
编辑

Kubernetes 自动发现提供程序监视 Kubernetes 节点、Pod、服务的启动、更新和停止。

kubernetes 自动发现提供程序具有以下配置设置

node
(可选)指定在无法准确检测到时(例如在主机网络模式下运行 filebeat 时)将 filebeat 的范围限定为的节点。
namespace
(可选)选择要从中收集资源事件的命名空间。如果未设置,则提供程序将从所有命名空间收集它们。默认情况下为未设置。命名空间配置仅适用于具有命名空间范围的 kubernetes 资源,并且如果 unique 字段设置为 false
cleanup_timeout
(可选)指定在停止容器的正在运行的配置之前的不活动时间,默认为 60 秒。
kube_config
(可选)使用给定的配置文件作为 Kubernetes 客户端的配置。如果未设置 kube_config,将检查 KUBECONFIG 环境变量,如果不存在,则会回退到 InCluster。
kube_client_options
(可选)可以为 Kubernetes 客户端配置其他选项。目前支持客户端 QPS 和突发,如果未设置,则将使用 Kubernetes 客户端的 默认 QPS 和突发。示例
      kube_client_options:
        qps: 5
        burst: 10
resource
(可选)选择要执行发现的资源。当前支持的 Kubernetes 资源有 podservicenode。如果未配置,则 resource 默认为 pod
scope
(可选)指定需要在哪个级别执行自动发现。scope 可以取 nodecluster 作为值。node 范围允许发现指定节点中的资源。cluster 范围允许集群范围内的发现。只有 podnode 资源可以在节点范围内被发现。
add_resource_metadata

(可选)指定将添加到事件的额外元数据的过滤器和配置。配置参数

  • nodenamespace:指定来自节点和命名空间的额外元数据的标签和注释过滤器。默认情况下,包含所有标签,而注释不包含。要更改默认行为,可以定义 include_labelsexclude_labelsinclude_annotations。当存储需要特殊处理的标签和注释以避免存储输出过载时,这些设置很有用。注意:这些设置不支持通配符。可以通过设置 enabled: false 来单独禁用 nodenamespace 元数据的丰富。
  • deployment:如果资源是 pod 并且它是由 deployment 创建的,则默认情况下不会添加 deployment 名称,可以通过设置 deployment: true 来启用它。
  • cronjob:如果资源是 pod 并且它是由 cronjob 创建的,则默认情况下不会添加 cronjob 名称,可以通过设置 cronjob: true 来启用它。

    示例

      add_resource_metadata:
        namespace:
          include_labels: ["namespacelabel1"]
        node:
          include_labels: ["nodelabel2"]
          include_annotations: ["nodeannotation1"]
        # deployment: false
        # cronjob: false
unique
(可选)默认为 false。将自动发现提供程序标记为唯一会导致提供程序仅在获得领导者租约时才启用提供的模板。此设置只能与 cluster 范围结合使用。启用 unique 时,将不考虑 resourceadd_resource_metadata 设置。
leader_lease
(可选)默认为 filebeat-cluster-leader。这将是锁租约的名称。可以使用 kubectl describe lease beats-cluster-leader 来监视租约的状态。引用同一领导者租约的不同 Beats 将是争夺租约的竞争者,并且每次只有一个会被选为领导者。
leader_leaseduration
(可选)非领导者候选人等待强制获取租约领导的时间。默认为 15s
leader_renewdeadline
(可选)领导者在放弃之前重试刷新其领导身份的时间。默认为 10s
leader_retryperiod
(可选)运行以获取租约的 metricbeat 实例在尝试操作之间应等待的时间。默认为 2s

配置模板可以包含来自自动发现事件的变量。这些变量可以在 data 命名空间下访问,例如,要访问 Pod IP:${data.kubernetes.pod.ip}

这些是配置模板中可用的字段。每个发出的事件都将提供 kubernetes.* 字段

通用字段
编辑
  • host
Pod 特定
编辑
类型 描述

port

string

Pod 端口。如果 Pod 暴露了多个端口,则应使用 ports.<port-name> 代替

kubernetes.namespace

string

Pod 运行所在的命名空间

kubernetes.namespace_uuid

string

Pod 运行所在的命名空间的 UUID

kubernetes.namespace_annotations.*

object

Pod 运行所在的命名空间的注释。注释应以非取消点的格式使用,例如 kubernetes.namespace_annotations.app.kubernetes.io/name

kubernetes.pod.name

string

Pod 的名称

kubernetes.pod.uid

string

Pod 的 UID

kubernetes.pod.ip

string

Pod 的 IP

kubernetes.labels.*

object

Pod 标签的对象。标签应以非取消点的格式使用,例如 kubernetes.labels.app.kubernetes.io/name

kubernetes.annotations.*

object

Pod 注释的对象。注释应以非取消点的格式使用,例如 kubernetes.annotations.test.io/test

kubernetes.container.name

string

容器的名称

kubernetes.container.runtime

string

容器的运行时

kubernetes.container.id

string

容器的 ID

kubernetes.container.image

string

容器的镜像

kubernetes.node.name

string

节点的名称

kubernetes.node.uid

string

节点的 UID

kubernetes.node.hostname

string

节点的主机名

节点特定
编辑
类型 描述

kubernetes.labels.*

object

节点标签的对象

kubernetes.annotations.*

object

节点注释的对象

kubernetes.node.name

string

节点的名称

kubernetes.node.uid

string

节点的 UID

kubernetes.node.hostname

string

节点的主机名

服务特定
编辑
类型 描述

port

string

服务端口

kubernetes.namespace

string

服务的命名空间

kubernetes.namespace_uuid

string

服务的命名空间的 UUID

kubernetes.namespace_annotations.*

object

服务的命名空间的注释。注释应以非取消点的格式使用,例如 kubernetes.namespace_annotations.app.kubernetes.io/name

kubernetes.labels.*

object

服务标签的对象

kubernetes.annotations.*

object

服务注释的对象

kubernetes.service.name

string

服务的名称

kubernetes.service.uid

string

服务的 UID

如果将 include_annotations 配置添加到提供程序配置,则会将配置中存在的注释列表添加到事件中。

如果将 include_labels 配置添加到提供程序配置,则会将配置中存在的标签列表添加到事件中。

如果将 exclude_labels 配置添加到提供程序配置,则会从事件中排除配置中存在的标签列表。

如果 labels.dedot 配置在提供程序配置中设置为 true,则标签中的 . 将替换为 _。默认情况下为 true

如果提供程序配置中 annotations.dedot 配置设置为 true,则注解中的 . 将被替换为 _。默认情况下,此设置为 true

从 8.6 版本开始,在配置模板中使用的 kubernetes.labels.* 不会进行去点处理,无论 labels.dedot 的值如何。此配置参数仅影响最终 Elasticsearch 文档中添加的字段。例如,对于标签为 app.kubernetes.io/name=ingress-nginx 的 pod,匹配条件应为 condition.equals: kubernetes.labels.app.kubernetes.io/name: "ingress-nginx"。如果 labels.dedot 设置为 true(默认值),则该标签将以 kubernetes.labels.app_kubernetes_io/name 的形式存储在 Elasticsearch 中。这同样适用于 Kubernetes 注解。

例如

{
  "host": "172.17.0.21",
  "port": 9090,
  "kubernetes": {
    "container": {
      "id": "bb3a50625c01b16a88aa224779c39262a9ad14264c3034669a50cd9a90af1527",
      "image": "prom/prometheus",
      "name": "prometheus"
    },
    "labels": {
      "project": "prometheus",
      ...
    },
    "namespace": "default",
    "node": {
      "name": "minikube"
    },
    "pod": {
      "name": "prometheus-2657348378-k1pnh"
    }
  },
}

Filebeat 支持输入和模块的模板。

filebeat.autodiscover:
  providers:
    - type: kubernetes
      templates:
        - condition:
            equals:
              kubernetes.namespace: kube-system
          config:
            - type: container
              paths:
                - /var/log/containers/*-${data.kubernetes.container.id}.log
              exclude_lines: ["^\\s+[\\-`('.|_]"]  # drop asciiart lines

此配置为在 Kubernetes 命名空间 kube-system 中运行的 pod 的所有容器启动 docker 日志输入。

如果你正在使用模块,则可以覆盖默认输入并改用 docker 输入。

filebeat.autodiscover:
  providers:
    - type: kubernetes
      templates:
        - condition:
            equals:
              kubernetes.container.image: "redis"
          config:
            - module: redis
              log:
                input:
                  type: container
                  paths:
                    - /var/log/containers/*-${data.kubernetes.container.id}.log
Jolokia
编辑

Jolokia 自动发现提供程序使用 Jolokia Discovery 来查找在主机或网络中运行的代理。

此提供程序的配置包含一组网络接口以及与其他提供程序相同的模板。网络接口将用于发现探测,interfaces 的每个项目都具有以下设置:

name
接口的名称(例如,br0),它可以包含一个通配符作为后缀,以便将相同的设置应用于同一类型的多个网络接口(例如,br*)。
interval
探测之间的时间间隔(默认为 10 秒)
grace_period
自上次回复以来,将实例视为停止的时间(默认为 30 秒)
probe_timeout
自发送探测以来等待响应的最大时间(默认为 1 秒)

自 1.2.0 版本起,任何 Jolokia 代理都支持 Jolokia Discovery 机制。当 Jolokia 作为 JVM 代理包含在应用程序中时,默认启用该机制,但在其他情况下(如 OSGI 或 WAR (Java EE) 代理)则禁用。无论如何,此功能由两个属性控制:

  • discoveryEnabled,用于启用该功能
  • discoveryAgentUrl,如果设置,这是代理在被发现时公布的 URL。设置此参数会隐式启用该功能

设置这些属性的方法有很多种,并且它们可能因应用程序而异,请参阅您的应用程序的文档,以找到最适合您情况的设置方法。

Jolokia Discovery 基于 UDP 多播请求。代理加入多播组 239.192.48.84,端口 24884,并通过向该组发送查询来完成发现。您必须考虑到 Filebeat 和 Jolokia 代理之间的 UDP 流量必须被允许。另请注意,此多播地址位于 239.0.0.0/8 范围内,该范围保留供组织内部私有使用,因此只能在专用网络中使用。

这些是在配置模板期间可用的字段。 jolokia.* 字段将在每个发出的事件中可用。

  • jolokia.agent.id
  • jolokia.agent.version
  • jolokia.secured
  • jolokia.server.product
  • jolokia.server.vendor
  • jolokia.server.version
  • jolokia.url

Filebeat 支持输入和模块的模板

filebeat.autodiscover:
  providers:
    - type: jolokia
      interfaces:
      - name: lo
      templates:
      - condition:
          contains:
            jolokia.server.product: "kafka"
        config:
        - module: kafka
          log:
            enabled: true
            var.paths:
            - /var/log/kafka/*.log

此配置启动一个 jolokia 模块,该模块收集正在运行的 kafka 的日志。发现探测是通过本地接口发送的。

Nomad
编辑

此功能处于技术预览阶段,可能会在未来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览中的功能不受官方 GA 功能的支持 SLA 约束。

Nomad 自动发现提供程序监视 Nomad 作业的启动、更新和停止。

nomad 自动发现提供程序具有以下配置设置:

address
(可选)指定 Nomad 代理的地址。默认情况下,它将尝试与本地运行的 Nomad 代理 (http://127.0.0.1:4646) 通信。
region
(可选)要使用的区域。如果未提供,则使用默认代理区域。
namespace
(可选)要使用的命名空间。如果未提供,则使用 default 命名空间。
secret_id
(可选)如果 Nomad 中启用了 ACL,则使用 SecretID。这是应用于令牌的 ACL 策略示例。
namespace "*" {
  policy = "read"
}
node {
  policy = "read"
}
agent {
  policy = "read"
}
node
(可选)指定 filebeat 的作用域节点,以防在使用 node 作用域时无法准确检测到该节点。
scope
(可选)指定需要在哪个级别完成自动发现。scope 可以采用 nodecluster 作为值。node 作用域允许发现指定节点中的资源。cluster 作用域允许集群范围的发现。默认为 node
wait_time
(可选)限制 Watch 将阻塞的时间。如果未指定(或设置为 0),则将使用代理的默认配置。
allow_stale
(可选)允许任何 Nomad 服务器(非领导者)服务读取。这通常意味着分配 filebeat 的本地节点将服务 filebeat 的请求。默认为 true

模板和条件的配置与 Docker 提供程序类似。配置模板可以包含来自自动发现事件的变量。它们可以在 data 命名空间下访问。

这些是在配置模板期间可用的字段。 nomad.* 字段将在每个发出的事件中可用。

  • nomad.allocation.id
  • nomad.allocation.name
  • nomad.allocation.status
  • nomad.datacenter
  • nomad.job.name
  • nomad.job.type
  • nomad.namespace
  • nomad.region
  • nomad.task.name
  • nomad.task.service.canary_tags
  • nomad.task.service.name
  • nomad.task.service.tags

如果将 include_labels 配置添加到提供程序配置,则会将配置中存在的标签列表添加到事件中。

如果将 exclude_labels 配置添加到提供程序配置,则会从事件中排除配置中存在的标签列表。

如果提供程序配置中 labels.dedot 配置设置为 true,则标签中的 . 将被替换为 _

例如

{
  ...
  "region": "europe",
  "allocation": {
    "name": "coffeshop.api[0]",
    "id": "35eba07f-e5e4-20ac-6def-85117bee6efb",
    "status": "running"
  },
  "datacenters": [
    "europe-west4"
  ],
  "namespace": "default",
  "job": {
    "type": "service",
    "name": "coffeshop"
  },
  "task": {
    "service": {
      "name": [
        "coffeshop"
      ],
      "tags": [
        "coffeshop",
        "nginx"
      ],
      "canary_tags": [
        "coffeshop"
      ]
    },
    "name": "api"
  },
  ...
}

Filebeat 支持输入和模块的模板。

filebeat.autodiscover:
  providers:
    - type: nomad
      node: nomad1
      scope: local
      hints.enabled: true
      allow_stale: true
      templates:
        - condition:
            equals:
              nomad.namespace: web
          config:
            - type: log
              paths:
                - /var/lib/nomad/alloc/${data.nomad.allocation.id}/alloc/logs/${data.nomad.task.name}.stderr.[0-9]*
              exclude_lines: ["^\\s+[\\-`('.|_]"]  # drop asciiart lines

此配置为 web Nomad 命名空间下的所有作业启动 log 输入。

如果您正在使用模块,则可以覆盖默认输入并对其进行自定义,以便从 ${data.nomad.task.name}.stdout 和/或 ${data.nomad.task.name}.stderr 文件读取。

filebeat.autodiscover:
  providers:
    - type: nomad
      templates:
        - condition:
            equals:
              nomad.task.service.tags: "redis"
          config:
            - module: redis
              log:
                input:
                  type: log
                  paths:
                    - /var/lib/nomad/alloc/${data.nomad.allocation.id}/alloc/logs/${data.nomad.task.name}.*

目前不支持 docker 输入。Nomad 不会公开与分配关联的容器 ID。如果没有容器 ID,则无法生成用于读取容器日志的正确路径。