菜单
文档breadcrumb arrow Beylabreadcrumb arrow 配置breadcrumb arrow 服务发现
Grafana Cloud

配置 Beyla 服务发现

executable_nameopen_portservice_nameservice_namespace 是顶级属性,用于简化 Beyla 配置,以便对单个服务或一组相关服务进行代码注入。

在某些场景下,Beyla 将对多种服务进行代码注入;例如,作为 Kubernetes DaemonSet 对节点上的所有服务进行代码注入。discovery YAML 部分允许您在 Beyla 可以注入的服务中指定更高的区分度。

例如,它允许按服务类型覆盖服务名称和命名空间。

YAML环境变量类型默认值
servicesN/A对象列表(未设置)

本节允许为不同的服务指定不同的选择条件,并覆盖其部分元数据,例如报告的名称或命名空间。

有关本节的更多详细信息,请参阅本文档的服务发现部分

YAML环境变量类型默认值
exclude_servicesN/A对象列表(未设置)

本节允许指定排除无需进行代码注入的服务的选择标准。其定义格式与本文档的服务发现部分中所述相同。

此选项有助于避免对通常在可观测性环境中找到的服务进行代码注入。例如,使用此选项排除对 Prometheus 的代码注入。

YAML环境变量类型默认值
default_exclude_servicesN/A对象列表路径:(?:^|\/)(beyla$|alloy$|otelcol[^\/]*$)

禁用 Beyla 本身(自注入)以及 Grafana Alloy 和 OpenTelemetry Collector 的代码注入。设为空以允许 Beyla 对自身以及这些其他组件进行代码注入。注意:要启用此类自注入,仍然需要将它们包含在 services 部分中。

YAML环境变量类型默认值
skip_go_specific_tracersBEYLA_SKIP_GO_SPECIFIC_TRACERS布尔值false

禁用 ebpf tracer 在检查要进行代码注入的可执行文件时对 Go 特性的检测。tracer 将回退到使用通用代码注入,这通常效率较低。

YAML环境变量类型默认值
exclude_otel_instrumented_servicesBEYLA_EXCLUDE_OTEL_INSTRUMENTED_SERVICES布尔值true

禁用 Beyla 对已通过 OpenTelemetry 进行代码注入的服务的代码注入。由于 Beyla 通常部署用于监控 Kubernetes 集群中的所有服务,监控已进行代码注入的服务可能会导致重复的遥测数据,除非代码注入选择(或排除)标准经过精心设计。为了避免不必要的配置开销,Beyla 会监控 OpenTelemetry SDK 调用以发布指标和追踪,并自动关闭对发布自身遥测数据的服务的代码注入。如果您应用程序生成的遥测数据与 Beyla 生成的指标和追踪不冲突,请关闭此选项。

服务发现部分

允许选择多组服务的 YAML 文件示例

yaml
discovery:
  services:
    - exe_path: (worker)|(backend)|(frontend)
      namespace: MyApplication
    - exe_path: loadgen
      namespace: testing
      name: "TestLoadGenerator"

上述 YAML 示例将选择两组可执行文件。第一组将由可执行路径包含 workerbackendfrontend 文本的任何进程组成。对于每个服务,Beyla 将从可执行文件名称中获取服务名称属性。与此组匹配的所有进程报告的服务命名空间将是 MyApplication

上述 YAML 示例中的第二组将选择可执行路径包含 regexp 的任何可执行文件,但不是从可执行文件名称中获取服务名称,而是将服务名称覆盖为 TestLoadGenerator

本节的其余部分描述了 services 列表中的每个条目接受的属性。

每个 services 条目都是一个映射,其中的属性可以根据两个目的进行分组

  • 覆盖报告的服务名称和命名空间:namenamespace 属性。
  • 选择要进行代码注入的进程:其余属性,在本文档中称为选择器
YAML环境变量类型默认值
namestring(参见描述)

已废弃

为匹配的已注入服务定义名称。它将用于在导出的指标/追踪中填充 service.name OTEL 属性和 service_name Prometheus 属性。

此选项已废弃,因为同一个 services 条目中的多个匹配项会导致多个服务共享同一个名称。请参阅覆盖服务名称和命名空间部分,以启用从多种元数据源自动配置服务名称和命名空间。

如果属性未设置,则会默认采用以下任何属性,优先级如下

  • 如果 Kubernetes 已启用
    1. 运行已注入进程的 Deployment 名称(如果存在)。
    2. 运行已注入进程的 ReplicaSet/DaemonSet/StatefulSet 名称(如果存在)。
    3. 运行已注入进程的 Pod 名称。
  • 如果 Kubernetes 未启用
    1. 进程可执行文件的名称。

如果多个进程匹配下面描述的服务选择标准,则所有实例的指标和追踪可能共享相同的服务名称;例如,当多个已注入进程在同一个 Deployment 下运行,或具有相同的可执行文件名称时。在这种情况下,报告的 instance 属性将允许区分服务的不同实例。

YAML环境变量类型默认值
namespacestring(空或 K8s 命名空间)

已废弃.

为匹配的已注入服务定义命名空间。如果未设置此属性,则如果 Kubernetes 可用,它将默认为运行已注入进程的 Kubernetes 命名空间;如果 Kubernetes 不可用,则为空。

此选项已废弃。请参阅覆盖服务名称和命名空间部分,以启用从多种元数据源自动配置服务名称和命名空间。

需要注意的是,此命名空间不是 Kubernetes 命名空间的选择器。它的值将用于设置标准遥测属性的值。例如,OpenTelemetry service.namespace 属性

YAML环境变量类型默认值
open_portsstring(未设置)

根据进程开放(监听)的端口选择要进行代码注入的进程。此属性接受以逗号分隔的端口列表(例如,80)和端口范围(例如,8000-8999)。如果可执行文件匹配列表中的任一端口,则被视为匹配选择标准。

例如,指定以下属性

open_port: 80,443,8000-8999

将使 Beyla 选择任何打开端口 80、443 或 8000 到 8999 之间(包括)任何端口的可执行文件。

如果在同一个 services 条目中指定了其他选择器,则要选择的进程需要匹配所有选择器属性。

如果可执行文件打开了多个端口,只需指定其中一个端口即可使 Beyla 对所有应用程序端口上的所有 HTTP/S 和 GRPC 请求进行代码注入。目前,无法将代码注入仅限于通过特定端口公开的方法。

YAML环境变量类型默认值
exe_pathstring(正则表达式)(未设置)

根据进程的可执行文件名称路径选择要进行代码注入的进程。此属性接受一个正则表达式,用于匹配完整的可执行命令行,包括可执行文件在文件系统中的目录。

Beyla 将尝试对所有可执行路径匹配此属性的进程进行代码注入。例如,设置 exe_path: .* 将使 Beyla 尝试对主机中的所有可执行文件进行代码注入。

如果在同一个 services 条目中指定了其他选择器,则要选择的进程需要匹配所有选择器属性。

YAML环境变量类型默认值
containers_only布尔值false

选择在 OCI 容器中运行的进程进行代码注入。为了执行此检查,Beyla 会检查进程的网络命名空间并与其自身的网络命名空间进行匹配。如果赋予 Beyla 进程的权限不足以执行网络命名空间检查,则忽略此选项。

如果在同一个 services 条目中指定了其他选择器,则要选择的进程需要匹配所有选择器属性。

YAML环境变量类型默认值
k8s_namespacestring(正则表达式)(未设置)

此选择器属性将把代码注入限制在名称与提供的正则表达式匹配的 Kubernetes 命名空间中运行的应用。

如果在同一个 services 条目中指定了其他选择器,则要选择的进程需要匹配所有选择器属性。

YAML环境变量类型默认值
k8s_pod_namestring(正则表达式)(未设置)

此选择器属性将把代码注入限制在名称与提供的正则表达式匹配的 Kubernetes Pod 中运行的应用。

如果在同一个 services 条目中指定了其他选择器,则要选择的进程需要匹配所有选择器属性。

YAML环境变量类型默认值
k8s_deployment_namestring(正则表达式)(未设置)

此选择器属性将把代码注入限制在名称与提供的正则表达式匹配的 Kubernetes Deployments 中运行的应用。

如果在同一个 services 条目中指定了其他选择器,则要选择的进程需要匹配所有选择器属性。

YAML环境变量类型默认值
k8s_replicaset_namestring(正则表达式)(未设置)

此选择器属性将把代码注入限制在名称与提供的正则表达式匹配的 Kubernetes ReplicaSets 中运行的应用。

如果在同一个 services 条目中指定了其他选择器,则要选择的进程需要匹配所有选择器属性。

YAML环境变量类型默认值
k8s_statefulset_namestring(正则表达式)(未设置)

此选择器属性将把代码注入限制在名称与提供的正则表达式匹配的 Kubernetes StatefulSets 中运行的应用。

如果在同一个 services 条目中指定了其他选择器,则要选择的进程需要匹配所有选择器属性。

YAML环境变量类型默认值
k8s_daemonset_namestring(正则表达式)(未设置)

此选择器属性将把代码注入限制在名称与提供的正则表达式匹配的 Kubernetes DaemonSet 中运行的应用。

如果在同一个 services 条目中指定了其他选择器,则要选择的进程需要匹配所有选择器属性。

YAML环境变量类型默认值
k8s_owner_namestring(正则表达式)(未设置)

此选择器属性将把代码注入限制在由名称与提供的正则表达式匹配的 DeploymentReplicaSetDaemonSetStatefulSet 所拥有的 Pod 中运行的应用。

如果在同一个 services 条目中指定了其他选择器,则要选择的进程需要匹配所有选择器属性。

YAML环境变量类型默认值
k8s_pod_labelsmap[string]string(正则表达式)(未设置)

此选择器属性将把代码注入限制在具有键与提供的正则表达式匹配的标签的 Pod 中运行的应用。

如果在同一个 services 条目中指定了其他选择器,则要选择的进程需要匹配所有选择器属性。

例如

yaml
discovery:
  services:
    - k8s_namespace: frontend
      k8s_pod_labels:
        instrument: beyla

上述示例发现 frontend 命名空间中所有具有标签 instrument 且其值匹配正则表达式 beyla 的 Pod。

YAML环境变量类型默认值
k8s_pod_annotationsmap[string]string(正则表达式)(未设置)

此选择器属性将把代码注入限制在具有键与提供的正则表达式匹配的注解的 Pod 中运行的应用。

如果在同一个 services 条目中指定了其他选择器,则要选择的进程需要匹配所有选择器属性。

例如

yaml
discovery:
  services:
    - k8s_namespace: backend
      k8s_pod_annotations:
        beyla.instrument: "true"

上述示例发现 backend 命名空间中所有具有注解 beyla.instrument 且其值匹配正则表达式 true 的 Pod。

覆盖服务名称和命名空间

如果通过 OpenTelemetry 或 Prometheus 导出代码注入数据,Beyla 将遵循OpenTelemetry operator 的服务命名约定,以提高 Beyla 与其他代码注入解决方案的互操作性。

Beyla 按以下顺序使用以下标准自动设置服务名称和命名空间:

  1. 通过已注入进程或容器的 OTEL_RESOURCE_ATTRIBUTESOTEL_SERVICE_NAME 环境变量设置的资源属性。
  2. 在 Kubernetes 中,通过以下 Pod 注解设置的资源属性
    • resource.opentelemetry.io/service.name
    • resource.opentelemetry.io/service.namespace
  3. 在 Kubernetes 中,通过以下 Pod 标签设置的资源属性
    • app.kubernetes.io/name 设置服务名称
    • app.kubernetes.io/part-of 设置服务命名空间
  4. 在 Kubernetes 中,根据 Pod 所有者元数据计算的资源属性,按以下顺序(根据其可用性)
    • k8s.deployment.name
    • k8s.replicaset.name
    • k8s.statefulset.name
    • k8s.daemonset.name
    • k8s.cronjob.name
    • k8s.job.name
    • k8s.pod.name
    • k8s.container.name
  5. 已注入进程的可执行文件名称。

可以通过配置覆盖上一条第 3 点中的 Kubernetes 标签。

在 YAML 中

yaml
kubernetes:
  resource_labels:
    service.name:
      # gets service name from the first existing Pod label
      - override-svc-name
      - app.kubernetes.io/name
    service.namespace:
      # gets service namespace from the first existing Pod label
      - override-svc-ns
      - app.kubernetes.io/part-of

它们接受逗号分隔的注解和标签名称列表。