×

OpenTelemetry 检测配置选项

Red Hat 版本的 OpenTelemetry 可以将 OpenTelemetry 自动检测库注入到您的工作负载中并对其进行配置。目前,该项目支持从 Go、Java、Node.js、Python、.NET 和 Apache HTTP Server (httpd) 注入检测库。

OpenTelemetry 中的自动检测是指框架无需手动更改代码即可自动检测应用程序的功能。这使开发人员和管理员能够以最小的努力和对现有代码库的更改来获得对其应用程序的可观察性。

Red Hat 版本的 OpenTelemetry Operator 仅支持检测库的注入机制,不支持检测库或上游镜像。客户可以构建自己的检测镜像或使用社区镜像。

检测选项

检测选项在Instrumentation自定义资源 (CR) 中指定。

Instrumentation CR 示例
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: java-instrumentation
spec:
  env:
    - name: OTEL_EXPORTER_OTLP_TIMEOUT
      value: "20"
  exporter:
    endpoint: http://production-collector.observability.svc.cluster.local:4317
  propagators:
    - w3c
  sampler:
    type: parentbased_traceidratio
    argument: "0.25"
  java:
    env:
    - name: OTEL_JAVAAGENT_DEBUG
      value: "true"
表 1. 操作符用于定义检测的参数
参数 描述

env

在所有检测中定义的通用环境变量。

exporter

导出器配置。

propagators

Propagators 定义进程间上下文传播配置。

tracecontext, baggage, b3, b3multi, jaeger, ottrace, none

resource

资源属性配置。

sampler

采样配置。

apacheHttpd

Apache HTTP Server 检测的配置。

dotnet

.NET 检测的配置。

go

Go 检测的配置。

java

Java 检测的配置。

nodejs

Node.js 检测的配置。

python

Python 检测的配置。

表 2. 自动检测的默认协议
自动检测 默认协议

Java 1.x

otlp/grpc

Java 2.x

otlp/http

Python

otlp/http

.NET

otlp/http

Go

otlp/http

Apache HTTP Server

otlp/grpc

OpenTelemetry SDK 变量的配置

您可以在 OpenTelemetry Collector 自定义资源中使用instrumentation.opentelemetry.io/inject-sdk注释来指示 Red Hat 版本的 OpenTelemetry Operator 根据Instrumentation CR 将以下一些 OpenTelemetry SDK 环境变量注入到您的 Pod 中

  • OTEL_SERVICE_NAME

  • OTEL_TRACES_SAMPLER

  • OTEL_TRACES_SAMPLER_ARG

  • OTEL_PROPAGATORS

  • OTEL_RESOURCE_ATTRIBUTES

  • OTEL_EXPORTER_OTLP_ENDPOINT

  • OTEL_EXPORTER_OTLP_CERTIFICATE

  • OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE

  • OTEL_EXPORTER_OTLP_CLIENT_KEY

表 3. instrumentation.opentelemetry.io/inject-sdk 注释的值
描述

"true"

使用来自当前命名空间的默认名称注入Instrumentation资源。

"false"

不注入任何Instrumentation资源。

"<instrumentation_name>"

指定要从当前命名空间注入的Instrumentation资源的名称。

"<namespace>/<instrumentation_name>"

指定要从另一个命名空间注入的Instrumentation资源的名称。

导出器配置

尽管Instrumentation自定义资源支持为每个信号设置一个或多个导出器,但自动检测仅配置OTLP导出器。因此,您必须将端点配置为指向收集器上的OTLP接收器。

使用配置映射的导出器TLS CA配置示例
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
# ...
spec
# ...
  exporter:
    endpoint: https://production-collector.observability.svc.cluster.local:4317  (1)
    tls:
      configMapName: ca-bundle  (2)
      ca_file: service-ca.crt (3)
# ...
1 使用HTTPS方案和TLS指定OTLP端点。
2 指定配置映射的名称。配置映射必须已存在于注入自动检测的Pod的命名空间中。
3 指向配置映射中的CA证书,或者如果证书已存在于工作负载文件系统中,则指向证书的绝对路径。
使用密钥的导出器mTLS配置示例
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
# ...
spec
# ...
  exporter:
    endpoint: https://production-collector.observability.svc.cluster.local:4317  (1)
    tls:
      secretName: serving-certs (2)
      ca_file: service-ca.crt (3)
      cert_file: tls.crt (4)
      key_file: tls.key (5)
# ...
1 使用HTTPS方案和TLS指定OTLP端点。
2 指定ca_filecert_filekey_file值的密钥的名称。密钥必须已存在于注入自动检测的Pod的命名空间中。
3 指向密钥中的CA证书,或者如果证书已存在于工作负载文件系统中,则指向证书的绝对路径。
4 指向密钥中的客户端证书,或者如果证书已存在于工作负载文件系统中,则指向证书的绝对路径。
5 指向密钥中的客户端密钥,或者如果密钥已存在于工作负载文件系统中,则指向密钥的绝对路径。

您可以使用配置映射或密钥提供CA证书。如果您同时提供两者,则配置映射的优先级高于密钥。

使用配置映射和Instrumentation CR注入CA捆绑包的配置示例
apiVersion: v1
kind: ConfigMap
metadata:
  name: otelcol-cabundle
  namespace: tutorial-application
  annotations:
    service.beta.openshift.io/inject-cabundle: "true"
# ...
---
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: my-instrumentation
spec:
  exporter:
    endpoint: https://simplest-collector.tracing-system.svc.cluster.local:4317
    tls:
      configMapName: otelcol-cabundle
      ca: service-ca.crt
# ...

Apache HTTP Server自动检测的配置

Apache HTTP Server自动检测只是一个技术预览功能。技术预览功能不受Red Hat生产服务级别协议(SLA)的支持,并且可能功能不完整。Red Hat不建议在生产环境中使用它们。这些功能可以提前访问即将推出的产品功能,使客户能够在开发过程中测试功能并提供反馈。

有关Red Hat技术预览功能的支持范围的更多信息,请参阅技术预览功能支持范围

表4. .spec.apacheHttpd 字段的参数
名称 描述 默认值

attrs

Apache HTTP Server特有的属性。

configPath

Apache HTTP Server配置的位置。

/usr/local/apache2/conf

env

Apache HTTP Server特有的环境变量。

image

包含Apache SDK和自动检测的容器镜像。

resourceRequirements

计算资源需求。

version

Apache HTTP Server版本。

2.4

启用注入的PodSpec注解
instrumentation.opentelemetry.io/inject-apache-httpd: "true"

.NET自动检测的配置

.NET自动检测只是一个技术预览功能。技术预览功能不受Red Hat生产服务级别协议(SLA)的支持,并且可能功能不完整。Red Hat不建议在生产环境中使用它们。这些功能可以提前访问即将推出的产品功能,使客户能够在开发过程中测试功能并提供反馈。

有关Red Hat技术预览功能的支持范围的更多信息,请参阅技术预览功能支持范围

默认情况下,此功能会注入不受支持的上游检测库。

名称 描述

env

.NET特有的环境变量。

image

包含.NET SDK和自动检测的容器镜像。

resourceRequirements

计算资源需求。

对于.NET自动检测,如果导出器的端点设置为4317,则必须设置所需的OTEL_EXPORTER_OTLP_ENDPOINT环境变量。.NET自动检测默认使用http/proto,遥测数据必须设置为4318端口。

启用注入的PodSpec注解
instrumentation.opentelemetry.io/inject-dotnet: "true"

Go自动检测的配置

Go自动检测只是一个技术预览功能。技术预览功能不受Red Hat生产服务级别协议(SLA)的支持,并且可能功能不完整。Red Hat不建议在生产环境中使用它们。这些功能可以提前访问即将推出的产品功能,使客户能够在开发过程中测试功能并提供反馈。

有关Red Hat技术预览功能的支持范围的更多信息,请参阅技术预览功能支持范围

默认情况下,此功能会注入不受支持的上游检测库。

名称 描述

env

Go特有的环境变量。

image

包含Go SDK和自动检测的容器镜像。

resourceRequirements

计算资源需求。

启用注入的PodSpec注解
instrumentation.opentelemetry.io/inject-go: "true"
OpenShift集群中Go自动检测所需的额外权限
apiVersion: security.openshift.io/v1
kind: SecurityContextConstraints
metadata:
  name: otel-go-instrumentation-scc
allowHostDirVolumePlugin: true
allowPrivilegeEscalation: true
allowPrivilegedContainer: true
allowedCapabilities:
- "SYS_PTRACE"
fsGroup:
  type: RunAsAny
runAsUser:
  type: RunAsAny
seLinuxContext:
  type: RunAsAny
seccompProfiles:
- '*'
supplementalGroups:
  type: RunAsAny

在OpenShift集群中应用Go自动检测权限的CLI命令如下所示

$ oc adm policy add-scc-to-user otel-go-instrumentation-scc -z <service_account>

Java自动检测的配置

Java自动检测只是一个技术预览功能。技术预览功能不受Red Hat生产服务级别协议(SLA)的支持,并且可能功能不完整。Red Hat不建议在生产环境中使用它们。这些功能可以提前访问即将推出的产品功能,使客户能够在开发过程中测试功能并提供反馈。

有关Red Hat技术预览功能的支持范围的更多信息,请参阅技术预览功能支持范围

默认情况下,此功能会注入不受支持的上游检测库。

名称 描述

env

Java特有的环境变量。

image

包含Java SDK和自动检测的容器镜像。

resourceRequirements

计算资源需求。

启用注入的PodSpec注解
instrumentation.opentelemetry.io/inject-java: "true"

Node.js自动检测的配置

Node.js自动检测只是一个技术预览功能。技术预览功能不受Red Hat生产服务级别协议(SLA)的支持,并且可能功能不完整。Red Hat不建议在生产环境中使用它们。这些功能可以提前访问即将推出的产品功能,使客户能够在开发过程中测试功能并提供反馈。

有关Red Hat技术预览功能的支持范围的更多信息,请参阅技术预览功能支持范围

默认情况下,此功能会注入不受支持的上游检测库。

名称 描述

env

Node.js特有的环境变量。

image

包含Node.js SDK和自动检测的容器镜像。

resourceRequirements

计算资源需求。

启用注入的PodSpec注解
instrumentation.opentelemetry.io/inject-nodejs: "true"
instrumentation.opentelemetry.io/otel-go-auto-target-exe: "/path/to/container/executable"

instrumentation.opentelemetry.io/otel-go-auto-target-exe 注解设置所需 OTEL_GO_AUTO_TARGET_EXE 环境变量的值。

Python自动检测的配置

Python自动检测只是一个技术预览功能。技术预览功能不受Red Hat生产服务级别协议(SLA)的支持,并且可能功能不完整。Red Hat不建议在生产环境中使用它们。这些功能可以提前访问即将推出的产品功能,使客户能够在开发过程中测试功能并提供反馈。

有关Red Hat技术预览功能的支持范围的更多信息,请参阅技术预览功能支持范围

默认情况下,此功能会注入不受支持的上游检测库。

名称 描述

env

Python特有的环境变量。

image

包含Python SDK和自动检测的容器镜像。

resourceRequirements

计算资源需求。

对于Python自动检测,如果导出器的端点设置为4317,则必须设置OTEL_EXPORTER_OTLP_ENDPOINT环境变量。Python自动检测默认使用http/proto,遥测数据必须设置为4318端口。

启用注入的PodSpec注解
instrumentation.opentelemetry.io/inject-python: "true"

多容器Pod

默认情况下,检测会在根据Pod规范可用的第一个容器上运行。在某些情况下,您也可以指定要注入的目标容器。

Pod 注解
instrumentation.opentelemetry.io/container-names: "<container_1>,<container_2>"

Go 自动检测不支持多容器自动检测注入。

具有多个检测器的多容器 Pod

为多容器 Pod 中的一个或多个容器注入应用程序语言的检测器需要以下注解

instrumentation.opentelemetry.io/<application_language>-container-names: "<container_1>,<container_2>" (1)
1 每个容器只能注入一种语言的检测器。有关支持的<application_language> 值的列表,请参见下表。
表 5. <application_language> 的支持值
语言 <application_language> 的值

ApacheHTTPD

apache

DotNet

dotnet

Java

java

NGINX

inject-nginx

NodeJS

nodejs

Python

python

SDK

sdk

将检测器 CR 与 Service Mesh 配合使用

将检测器自定义资源 (CR) 与 Red Hat OpenShift Service Mesh 配合使用时,必须使用b3multi 传播器。