自动发现编辑

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

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

提供程序编辑

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

在启动时,Metricbeat 将扫描现有容器并为它们启动适当的配置。然后它将监控新的启动/停止事件。这确保您无需担心状态,只需定义所需的配置即可。

Docker编辑

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

它具有以下设置

主机
(可选) Docker 套接字(UNIX 或 TCP 套接字)。默认情况下,它使用 unix:///var/run/docker.sock
ssl
(可选) 连接到 Docker 套接字时要使用的 SSL 配置。
清理超时
(可选) 指定在停止容器的运行配置之前的不活动时间,默认情况下禁用。
标签。dedot
(可选) 默认设置为 false。如果设置为 true,则用 _ 替换标签中的点。

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

  • 主机
  • 端口
  • 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

Metricbeat 支持模块模板

metricbeat.autodiscover:
  providers:
    - type: docker
      labels.dedot: true
      templates:
        - condition:
            contains:
              docker.container.image: redis
          config:
            - module: redis
              metricsets: ["info", "keyspace"]
              hosts: "${data.host}:6379"

此配置为所有运行名称中包含 redis 的镜像的容器启动 redis 模块。labels.dedot 默认为 docker 自动发现的 true,这意味着默认情况下 docker 标签中的点会被替换为 _

此外,Metricbeat 自动发现支持利用 密钥库 来检索敏感数据(如密码)。以下是如何使用密钥库的配置示例

metricbeat.autodiscover:
  providers:
    - type: docker
      labels.dedot: true
      templates:
        - condition:
            contains:
              docker.container.image: redis
          config:
            - module: redis
              metricsets: ["info", "keyspace"]
              hosts: "${data.host}:6379"
              password: "${REDIS_PASSWORD}"

其中 REDIS_PASSWORD 是存储在 Metricbeat 本地密钥库中的密钥。

Kubernetes编辑

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

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

节点
(可选) 指定要将 metricbeat 限制的节点,以防无法准确检测到,例如在主机网络模式下运行 metricbeat 时。
命名空间
(可选) 选择要从中收集元数据的命名空间。如果没有设置,则处理器将从所有命名空间收集元数据。默认情况下它未设置。命名空间配置仅适用于具有命名空间范围的 kubernetes 资源。
清理超时
(可选) 指定在停止容器的运行配置之前的不活动时间,默认情况下禁用。
kube_config
(可选) 使用给定的配置文件作为 Kubernetes 客户端的配置。如果未设置 kube_config,则将检查 KUBECONFIG 环境变量,如果不存在,则将回退到 InCluster。
kube_client_options
(可选) 可以为 Kubernetes 客户端配置其他选项。目前支持客户端 QPS 和突发,如果未设置,将使用 Kubernetes 客户端的 默认 QPS 和突发。示例
      kube_client_options:
        qps: 5
        burst: 10
资源
(可选) 选择要对其执行发现的资源。目前支持的 Kubernetes 资源为 podservicenode。如果未配置,resource 默认设置为 pod
范围
(可选) 指定需要在哪个级别执行自动发现。scope 可以采用 nodecluster 作为值。node 范围允许发现指定节点中的资源。cluster 范围允许集群范围内的发现。只有 podnode 资源可以在节点范围内被发现。
add_resource_metadata

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

  • nodenamespace:指定来自节点和命名空间的额外元数据的标签和注释过滤器。默认情况下,所有标签都包含在内,而注释则不包含。要更改默认行为,可以定义 include_labelsexclude_labelsinclude_annotations。这些设置在存储需要特殊处理以避免过度加载存储输出的标签和注释时很有用。注意:这些设置不支持通配符。可以通过设置 enabled: false 来单独禁用 nodenamespace 元数据的丰富。
  • 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
独特的
(可选) 默认设置为 false。将自动发现提供程序标记为唯一会导致提供程序仅在获得领导者租约时才启用提供的模板。此设置只能与 cluster 范围结合使用。当启用 unique 时,resourceadd_resource_metadata 设置不会被考虑。
leader_lease
(可选) 默认设置为 metricbeat-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.* 字段

通用字段:编辑
  • 主机
Pod 特定:编辑
关键 类型 描述

端口

字符串

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

kubernetes.namespace

字符串

Pod 运行的命名空间

kubernetes.namespace_uuid

字符串

Pod 运行的命名空间的 UUID

kubernetes.namespace_annotations.*

对象

Pod 运行的命名空间的注释。注释应使用非缩写格式,例如 kubernetes.namespace_annotations.app.kubernetes.io/name

kubernetes.pod.name

字符串

Pod 的名称

kubernetes.pod.uid

字符串

Pod 的 UID

kubernetes.pod.ip

字符串

Pod 的 IP

kubernetes.labels.*

对象

Pod 标签的对象。标签应使用非缩写格式,例如 kubernetes.labels.app.kubernetes.io/name

kubernetes.annotations.*

对象

Pod 注释的对象。注释应使用非缩写格式,例如 kubernetes.annotations.test.io/test

kubernetes.container.name

字符串

容器的名称

kubernetes.container.runtime

字符串

容器的运行时

kubernetes.container.id

字符串

容器的 ID

kubernetes.container.image

字符串

容器的镜像

kubernetes.node.name

字符串

节点的名称

kubernetes.node.uid

字符串

节点的 UID

kubernetes.node.hostname

字符串

节点的主机名

节点特定:编辑
关键 类型 描述

kubernetes.labels.*

对象

节点标签的对象

kubernetes.annotations.*

对象

节点注释的对象

kubernetes.node.name

字符串

节点的名称

kubernetes.node.uid

字符串

节点的 UID

kubernetes.node.hostname

字符串

节点的主机名

服务特定:编辑
关键 类型 描述

端口

字符串

服务端口

kubernetes.namespace

字符串

服务的命名空间

kubernetes.namespace_uuid

字符串

服务的命名空间的 UUID

kubernetes.namespace_annotations.*

对象

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

kubernetes.labels.*

对象

服务标签的对象

kubernetes.annotations.*

对象

服务注释的对象

kubernetes.service.name

字符串

服务的名称

kubernetes.service.uid

字符串

服务的 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(默认值),则标签将在 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"
    }
  },
}

示例

metricbeat.autodiscover:
  providers:
    - type: kubernetes
      scope: cluster
      node: ${NODE_NAME}
      unique: true
      identifier: leader-election-metricbeat
      templates:
        - config:
            - module: kubernetes
              hosts: ["kube-state-metrics:8080"]
              period: 10s
              add_metadata: true
              metricsets:
                - state_node

当在多个 Metribceat 实例上部署上述配置时,将仅为获得领导者租约/锁的 Metricbeat 实例启用 state_node 度量集。通过这种部署策略,我们可以确保在将 Beat 部署为 DaemonSet 时,集群范围内的度量集仅由一个 Beat 实例启用。

Metricbeat 支持模块模板

metricbeat.autodiscover:
  providers:
    - type: kubernetes
      include_annotations: ["prometheus.io.scrape"]
      templates:
        - condition:
            contains:
              kubernetes.annotations.prometheus.io/scrape: "true"
          config:
            - module: prometheus
              metricsets: ["collector"]
              hosts: "${data.host}:${data.port}"

此配置将为所有具有 prometheus.io/scrape=true 注解的 Pod 的容器启动一个 prometheus 模块。

使用 Kubernetes 手动定义端口edit

如果可能,请在 Pod 规范中声明公开的端口。否则,您将需要使用多个模板,并使用复杂的过滤规则。{port} 变量将不存在,您需要硬编码端口。例如:{data.host}:1234

当端口未声明时,Autodiscover 将使用您提供的模板为每个 Pod 生成一个配置,并为每个容器生成一个配置。这些生成的配置在生成后将被去重。如果多个容器的生成的配置相同,它们将合并为一个配置。

Pod 共享一个相同的主机。如果仅对 {data.host} 变量进行插值,则将为每个主机生成一个配置。这些配置将相同。在它们被去重后,将只使用一个配置。

为了定位一个特定的公开端口,可以在模板配置中使用 {data.host}:{data.ports.web},其中 web 是公开的容器端口的名称。

Metricbeat Autodiscover 密钥管理edit
本地密钥库edit

Metricbeat autodiscover 支持利用 密钥库 来检索敏感数据,例如密码。以下是如何使用密钥库的配置示例

metricbeat.autodiscover:
  providers:
    - type: kubernetes
      templates:
        - condition:
            contains:
              kubernetes.labels.app: "redis"
          config:
            - module: redis
              metricsets: ["info", "keyspace"]
              hosts: "${data.host}:6379"
              password: "${REDIS_PASSWORD}"

其中 REDIS_PASSWORD 是存储在 Metricbeat 本地密钥库中的密钥。

Kubernetes 密钥edit

Metricbeat autodiscover 支持利用 Kubernetes 密钥 来检索敏感数据,例如密码。为了启用此功能,请在 Metricbeat 的 ClusterRole 规则中添加以下部分

- apiGroups: [""]
  resources:
    - secrets
  verbs: ["get"]

上述规则将授予 Metricbeat Pod 访问 Kubernetes 密钥 API 的权限。这意味着任何拥有 Metricbeat Pod 访问权限的人(例如 kubectl exec)都可以访问 Kubernetes 密钥 API 并获取特定密钥,无论该密钥属于哪个命名空间。在使用提示的情况下,应仔细考虑此选项,尤其是当与提示一起使用时。

一种只为一个命名空间(而不是集群范围)授予权限的选项是使用针对目标命名空间的特定角色,以便更好地控制访问权限

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: marketing-team
  name: secret-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["secrets"]
  verbs: ["get"]

您可以在官方 Kubernetes 文档 中找到有关角色和集群角色的更多信息。

以下是如何使用 Kubernetes 密钥的配置示例

metricbeat.autodiscover:
  providers:
    - type: kubernetes
      templates:
        - condition:
            contains:
              kubernetes.labels.app: "redis"
          config:
            - module: redis
              metricsets: ["info", "keyspace"]
              hosts: "${data.host}:6379"
              password: "${kubernetes.default.somesecret.value}"

其中 kubernetes.default.somesecret.value 指定了一个存储为 Kubernetes 密钥的密钥,如下所示

  1. Kubernetes 命名空间:default
  2. Kubernetes 密钥名称:somesecret
  3. 密钥数据密钥:value

可以使用以下命令在 Kubernetes 环境中创建此密钥

cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: somesecret
type: Opaque
data:
  value: $(echo -n "passpass" | base64)
EOF

请注意,Pod 只能使用属于相同 Kubernetes 命名空间的密钥。例如,如果 Pod my-redisstaging 命名空间下运行,则它不能访问 testing 命名空间下的密钥,例如 kubernetes.testing.xxx.yyy

Jolokiaedit

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,并且发现是通过向该组发送查询来完成的。您需要考虑到,必须允许 Metricbeat 和 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

Metricbeat 支持模块模板

metricbeat.autodiscover:
  providers:
    - type: jolokia
      interfaces:
      - name: br*
        interval: 5s
        grace_period: 10s
      - name: en*
      templates:
      - condition:
          contains:
            jolokia.server.product: "tomcat"
        config:
        - module: jolokia
          metricsets: ["jmx"]
          hosts: "${data.jolokia.url}"
          namespace: test
          jmx.mappings:
          - mbean: "java.lang:type=Runtime"
            attributes:
            - attr: Uptime
              field: uptime

此配置将启动一个 jolokia 模块,该模块收集每个发现的 tomcat 实例的正常运行时间。发现探测是使用所有以 bren 开头的接口发送的,对于 br 接口,intervalgrace_period 分别减少到 5 秒和 10 秒。

Amazon EC2 实例edit

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

Amazon EC2 自动发现提供程序会发现 EC2 实例。这对于用户启动 Metricbeat 模块以监控在 AWS EC2 实例上运行的服务很有用。

例如,您可以使用此提供程序从在具有特定标签 service: mysql 的 EC2 实例上运行的 MySQL 服务器收集 MySQL 度量。

此提供程序将使用标准 AWS 环境变量和共享凭证文件加载 AWS 凭证,有关更多信息,请参阅 管理 AWS 访问密钥的最佳实践。如果您不想使用这些,可以明确设置 access_key_idsecret_access_key 变量。

以下是在配置模板化过程中可用的字段。aws.ec2.* 字段和 cloud.* 字段将在每个发出的事件中可用。

  • cloud.availability_zone
  • cloud.instance.id
  • cloud.machine.type
  • cloud.provider
  • cloud.region
  • aws.ec2.architecture
  • aws.ec2.image.id
  • aws.ec2.kernel.id
  • aws.ec2.monitoring.state
  • aws.ec2.private.dns_name
  • aws.ec2.private.ip
  • aws.ec2.public.dns_name
  • aws.ec2.public.ip
  • aws.ec2.root_device_name
  • aws.ec2.state.code
  • aws.ec2.state.name
  • aws.ec2.subnet.id
  • aws.ec2.tags
  • aws.ec2.vpc.id

Metricbeat 支持模块模板

metricbeat.autodiscover:
  providers:
    - type: aws_ec2
      period: 1m
      credential_profile_name: elastic-beats
      templates:
        - condition:
            equals:
              aws.ec2.tags.service: "mysql"
          config:
            - module: mysql
              metricsets: ["status", "galera_status"]
              period: 10s
              hosts: ["root:password@tcp(${data.aws.ec2.public.ip}:3306)/"]
              username: root
              password: password

此自动发现提供程序采用我们的标准 AWS 凭证选项。使用此配置,mysql metricbeat 模块将为所有具有 service: mysql 标签的 EC2 实例启动。

此自动发现提供程序采用我们的标准 AWS 凭证选项