配置 OBI 服务发现
OTEL_EBPF_AUTO_TARGET_EXE 和 OTEL_EBPF_OPEN_PORT 是环境变量,它们可以更轻松地配置 OBI 以检测单个服务或一组相关服务。
在某些场景下,OBI 会检测许多服务。例如,作为 Kubernetes DaemonSet 来检测节点上的所有服务。discovery YAML 部分允许您为 OBI 可以检测的服务指定更精细的选择标准。
| YAML 环境变量 | 描述 | 类型 | 默认值 |
|---|---|---|---|
instrument | 为不同的服务指定不同的选择标准,并覆盖其报告的名称或命名空间。有关详细信息,请参阅 发现服务 部分。 | list of objects | (未设置) |
exclude_instrument | 指定排除服务进行检测的选择标准。适用于避免检测通常在可观察性环境中找到的服务。有关详细信息,请参阅 排除要进行检测的服务 部分。 | list of objects | (未设置) |
default_exclude_instrument | 禁用 OBI 本身(自检测)、OpenTelemetry Collector 和其他可观察性组件的检测。设置为 empty 以允许 OBI 检测自身和其他组件。有关详细信息,请参阅 默认排除要进行检测的服务 部分。 | list of objects | 路径:{*beyla,*alloy,*prometheus-config-reloader,*ebpf-instrument,*otelcol,*otelcol-contrib,*otelcol-contrib[!/]*} 以及某些 Kubernetes 系统命名空间 |
skip_go_specific_tracersOTEL_EBPF_SKIP_GO_SPECIFIC_TRACERS | 在 **eBPF** 追踪器检测要进行检测的可执行文件时,禁用对 Go 特定的检测。追踪器将回退到使用通用检测,这通常效率较低。有关详细信息,请参阅 跳过特定 Go 追踪器 部分。 | 布尔值 | false |
exclude_otel_instrumented_servicesOTEL_EBPF_EXCLUDE_OTEL_INSTRUMENTED_SERVICES | 禁用 OBI 对已使用 OpenTelemetry 进行检测的服务进行检测。有关详细信息,请参阅 排除已 OTel 检测的服务 部分。 | 布尔值 | true |
exclude_otel_instrumented_services_span_metricsOTEL_EBPF_EXCLUDE_OTEL_INSTRUMENTED_SERVICES_SPAN_METRICS | 禁用 OBI 对已使用 OpenTelemetry 进行检测的服务的 Span 指标/服务图指标生成。有关详细信息,请参阅 排除已 OTel 检测的服务 部分。 | 布尔值 | false |
发现服务
您可以为不同类型的服务覆盖服务名称、命名空间和其他配置。
| YAML | 描述 | 类型 | 默认值 |
|---|---|---|---|
open_ports | 通过进程的开放端口(侦听端口)来选择要检测的进程。参阅 开放端口。 | 字符串 | (未设置) |
exe_path | 通过进程的可执行文件名称路径来选择要检测的进程。参阅 可执行文件路径。 | string (glob) | (未设置) |
containers_only | 选择在 OCI 容器中运行的进程进行检测。参阅 仅限容器。 | 布尔值 | false |
k8s_namespace | 按 Kubernetes 命名空间过滤服务。参阅 K8s 命名空间。 | string (glob) | (未设置) |
k8s_pod_name | 按 Kubernetes Pod 过滤服务。参阅 K8s Pod 名称。 | string (glob) | (未设置) |
k8s_deployment_name | 按 Kubernetes Deployment 过滤服务。参阅 K8s Deployment 名称。 | string (glob) | (未设置) |
k8s_replicaset_name | 按 Kubernetes ReplicaSet 过滤服务。参阅 K8s ReplicaSet 名称。 | string (glob) | (未设置) |
k8s_statefulset_name | 按 Kubernetes StatefulSet 过滤服务。参阅 K8s StatefulSet 名称。 | string (glob) | (未设置) |
k8s_daemonset_name | 按 Kubernetes DaemonSet 过滤服务。参阅 K8s DaemonSet 名称。 | string (glob) | (未设置) |
k8s_owner_name | 按 Kubernetes Pod Owner(Deployment、ReplicaSet、DaemonSet 或 StatefulSet)过滤服务。参阅 K8s Owner 名称。 | string (glob) | (未设置) |
k8s_pod_labels | 按 Kubernetes Pod 标签过滤服务。参阅 K8s Pod 标签。 | map[string]string (glob) | (未设置) |
k8s_pod_annotations | 按 Kubernetes Pod 注解过滤服务。参阅 K8s Pod 注解。 | map[string]string (glob) | (未设置) |
开放端口
通过进程的开放端口(侦听端口)来选择要检测的进程。此属性接受逗号分隔的端口列表,例如 80,以及端口范围,例如 8000-8999。如果可执行文件仅匹配列表中的一个端口,OBI 会认为它匹配。
例如,指定以下属性
discovery:
instrument:
- open_ports: 80,443,8000-8999
OBI 会选择任何开放端口 80、443 或 8000 到 8999 之间(含)任何端口的可执行文件。
如果您在同一个 instrument 条目中指定了其他选择器,则进程必须匹配所有选择器属性。
如果一个可执行文件开放了多个端口,您只需指定其中一个端口,OBI 就会检测到该可执行文件上的所有 HTTP/S 和 gRPC 请求。目前,您无法仅将检测限制在通过特定端口公开的方法上。
可执行文件路径
通过进程的可执行文件名称路径来选择要检测的进程。此属性接受一个 glob 模式,用于与完整可执行命令行进行匹配,包括可执行文件在文件系统上的位置目录。
OBI 会尝试检测可执行文件路径与此属性匹配的所有进程。例如,设置 exe_path: * 会让 OBI 尝试检测主机上的所有可执行文件。
如果您在同一个 instrument 条目中指定了其他选择器,则进程必须匹配所有选择器属性。
仅限容器
选择在 OCI 容器中运行的进程进行检测。为此检查,OBI 会检查进程的网络命名空间并将其与自身的网络命名空间进行匹配。如果 OBI 没有足够的权限执行网络命名空间检查,它将忽略此选项。
如果您在同一个 instrument 条目中指定了其他选择器,则进程必须匹配所有选择器属性。
K8s 命名空间
此选择器属性将检测限制在名称与提供的 glob 匹配的 Kubernetes 命名空间中运行的应用程序。
如果您在同一个 instrument 条目中指定了其他选择器,则进程必须匹配所有选择器属性。
K8s Pod 名称
此选择器属性将检测限制在名称与提供的 glob 匹配的 Kubernetes Pod 中运行的应用程序。
如果您在同一个 instrument 条目中指定了其他选择器,则进程必须匹配所有选择器属性。
K8s Deployment 名称
此选择器属性将检测限制在名称与提供的 glob 匹配的 Kubernetes Deployment 中运行的应用程序。
如果您在同一个 instrument 条目中指定了其他选择器,则进程必须匹配所有选择器属性。
K8s ReplicaSet 名称
此选择器属性将检测限制在名称与提供的 glob 匹配的 Kubernetes ReplicaSet 中运行的应用程序。
如果您在同一个 instrument 条目中指定了其他选择器,则进程必须匹配所有选择器属性。
K8s StatefulSet 名称
此选择器属性将检测限制在名称与提供的 glob 匹配的 Kubernetes StatefulSet 中运行的应用程序。
如果您在同一个 instrument 条目中指定了其他选择器,则进程必须匹配所有选择器属性。
K8s DaemonSet 名称
此选择器属性将检测限制在名称与提供的 glob 匹配的 Kubernetes DaemonSet 中运行的应用程序。
如果您在同一个 instrument 条目中指定了其他选择器,则进程必须匹配所有选择器属性。
K8s Owner 名称
此选择器属性将检测限制在由名称与提供的 glob 匹配的 Deployment、ReplicaSet、DaemonSet 或 StatefulSet 拥有的 Pod 中运行的应用程序。
如果您在同一个 instrument 条目中指定了其他选择器,则进程必须匹配所有选择器属性。
K8s Pod 标签
此选择器属性将检测限制在标签与提供的 glob 值匹配的 Pod 中运行的应用程序。
如果您在同一个 instrument 条目中指定了其他选择器,则进程必须匹配所有选择器属性。
例如
discovery:
instrument:
- k8s_namespace: frontend
k8s_pod_labels:
instrument: obi
前面的示例会发现 frontend 命名空间中所有具有标签 instrument 且值与 glob obi 匹配的 Pod。
K8s Pod 注解
此选择器属性将检测限制在注解值与提供的 glob 匹配的 Pod 中运行的应用程序。
如果您在同一个 instrument 条目中指定了其他选择器,则进程必须匹配所有选择器属性。
例如
discovery:
instrument:
- k8s_namespace: backend
k8s_pod_annotations:
obi.instrument: 'true'
前面的示例会发现 backend 命名空间中所有具有注解 obi.instrument 且值与 glob true 匹配的 Pod。
排除要进行检测的服务
exclude_instrument 部分允许您指定排除服务进行检测的选择标准。它遵循与本文档 发现服务 部分相同的定义格式。
此选项可帮助您避免检测通常在可观察性环境中找到的服务。例如,可以使用此选项排除检测 Prometheus。
默认排除要进行检测的服务
default_exclude_instrument 部分禁用 OBI 本身(自检测)、OpenTelemetry Collector 和其他可观察性组件的检测。它还禁用各种 Kubernetes 系统命名空间的检测,以降低指标生成的总体成本。以下部分包含所有排除的组件
- 按
exe_path排除的服务:*beyla,*alloy,*ebpf-instrument,*otelcol,*otelcol-contrib,*otelcol-contrib[!/]*。 - 按
k8s_namespace排除的服务:kube-system,kube-node-lease,local-path-storage,grafana-alloy,cert-manager,monitoring,gke-connect,gke-gmp-system,gke-managed-cim,gke-managed-filestorecsi,gke-managed-metrics-server,gke-managed-system,gke-system,gke-managed-volumepopulator,gatekeeper-system。
更改此选项以允许 OBI 检测自身或其他一些已排除的组件。
注意:要启用此类自检测,您仍需要将其包含在 instrument 部分,或者这些组件需要包含在更广泛的包含标准中。
跳过特定 Go 追踪器
skip_go_specific_tracers 选项在 **eBPF** 追踪器检测要进行检测的可执行文件时,禁用对 Go 特定的检测。追踪器将回退到使用通用检测,这通常效率较低。
排除 OTel 检测的服务
exclude_otel_instrumented_services 选项禁用 OBI 对已使用 OpenTelemetry 进行检测的服务的检测。由于 OBI 通常被部署来监控 Kubernetes 集群中的所有服务,因此监控已检测的服务可能会导致重复的遥测数据,除非您仔细制定检测(或排除)标准。为避免不必要的配置开销,OBI 会监控 OpenTelemetry SDK 调用以发布指标和追踪,并自动关闭已发布自身遥测数据的服务的检测。如果您的应用程序生成的遥测数据与 OBI 生成的指标和追踪冲突,请关闭此选项。
覆盖服务名称和命名空间
如果您通过 OpenTelemetry 或 Prometheus 导出检测数据,OBI 会遵循 OpenTelemetry Operator 的服务名称约定,以提高与其他检测解决方案的互操作性。
OBI 按以下顺序使用以下标准自动设置服务名称和命名空间
- 通过被检测进程或容器的
OTEL_RESOURCE_ATTRIBUTES和OTEL_SERVICE_NAME环境变量设置的资源属性。 - 在 Kubernetes 中,通过以下 Pod 注解设置的资源属性
resource.opentelemetry.io/service.nameresource.opentelemetry.io/service.namespace
- 在 Kubernetes 中,通过以下 Pod 标签设置的资源属性
app.kubernetes.io/name设置服务名称app.kubernetes.io/part-of设置服务命名空间
- 在 Kubernetes 中,根据 Pod Owner 的元数据计算资源属性,顺序如下(根据其可用性)
k8s.deployment.namek8s.replicaset.namek8s.statefulset.namek8s.daemonset.namek8s.cronjob.namek8s.job.namek8s.pod.namek8s.container.name
- 被检测进程的可执行文件名称。
您可以通过配置覆盖前面第 3 点中的 Kubernetes 标签。
在 YAML 中
attributes:
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
它们接受一个逗号分隔的注解和标签名称列表。