自动发现
编辑自动发现编辑
当您在容器上运行应用程序时,它们会成为监控系统的移动目标。自动发现允许您跟踪它们并在发生更改时调整设置。通过定义配置模板,自动发现子系统可以在服务开始运行时对其进行监控。
您可以在 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.*
字段将在每个发出的事件中可用。 event
- 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
日志输入。labels.dedot
对于 docker 自动发现,默认值为 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 资源。
-
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 资源有
pod
、service
和node
。如果未配置,resource
默认为pod
。 -
scope
- (可选)指定需要在哪个级别进行自动发现。
scope
可以取node
或cluster
作为值。node
范围允许在指定节点中发现资源。cluster
范围允许集群范围的发现。只有pod
和node
资源可以在节点范围内发现。 -
add_resource_metadata
-
(可选)为将添加到事件中的额外元数据指定过滤器和配置。 配置参数
-
node
或namespace
:为来自节点和命名空间的额外元数据指定标签和注释过滤器。默认情况下,将包含所有标签,但不包含注释。要更改默认行为,可以定义include_labels
、exclude_labels
和include_annotations
。当存储需要特殊处理以避免存储输出过载的标签和注释时,这些设置非常有用。注意:这些设置不支持通配符。可以通过设置enabled: false
来单独禁用node
或namespace
元数据的扩充。 -
deployment
:如果资源是pod
并且是从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
时,不会考虑resource
和add_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 特定:编辑
键 | 类型 | 描述 |
---|---|---|
|
|
Pod 端口。如果 pod 公开了多个端口,则应改用 |
|
|
Pod 正在运行的命名空间 |
|
|
Pod 正在运行的命名空间的 UUID |
|
|
Pod 正在运行的命名空间的注释。注释应使用非点分格式,例如 |
|
|
Pod 的名称 |
|
|
Pod 的 UID |
|
|
Pod 的 IP |
|
|
Pod 标签的对象。标签应使用非点分格式,例如 |
|
|
Pod 注释的对象。注释应使用非点分格式,例如 |
|
|
容器的名称 |
|
|
容器的运行时 |
|
|
容器的 ID |
|
|
容器的映像 |
|
|
节点名称 |
|
|
节点 UID |
|
|
节点主机名 |
节点特定:编辑
键 | 类型 | 描述 |
---|---|---|
|
|
节点标签对象 |
|
|
节点注释对象 |
|
|
节点名称 |
|
|
节点 UID |
|
|
节点主机名 |
服务特定:编辑
键 | 类型 | 描述 |
---|---|---|
|
|
服务端口 |
|
|
服务命名空间 |
|
|
服务命名空间的 UUID |
|
|
服务命名空间的注释。注释应使用非点分格式,例如 |
|
|
服务标签对象 |
|
|
服务注释对象 |
|
|
服务名称 |
|
|
服务 UID |
如果在提供程序配置中添加了 include_annotations
配置,则配置中存在的注释列表将添加到事件中。
如果在提供程序配置中添加了 include_labels
配置,则配置中存在的标签列表将添加到事件中。
如果在提供程序配置中添加了 exclude_labels
配置,则配置中存在的标签列表将从事件中排除。
如果在提供程序配置中将 labels.dedot
配置设置为 true
,则标签中的 .
将替换为 _
。默认值为 true
。
如果在提供程序配置中将 annotations.dedot
配置设置为 true
,则注释中的 .
将替换为 _
。默认值为 true
。
从 8.6 版本开始,无论 labels.dedot
的值是什么,在配置模板中使用的 kubernetes.labels.*
都不会进行点分隔符替换。此配置参数仅影响添加到最终 Elasticsearch 文档中的字段。例如,对于标签为 app.kubernetes.io/name=ingress-nginx
的 Pod,匹配条件应为 condition.equals: kubernetes.labels.app.kubernetes.io/name: "ingress-nginx"
。如果 labels.dedot
设置为 true
(默认值),则标签将存储在 Elasticsearch 中,格式为 kubernetes.labels.app_kubernetes_io/name
。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 秒)
Jolokia Discovery 机制受 1.2.0 版本以来的所有 Jolokia 代理支持,当 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
可以采用node
或cluster
作为值。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,就无法生成用于读取容器日志的正确路径。