对红帽构建的 OpenTelemetry 进行故障排除
诊断并解决 Collector 和检测问题
摘要
第 1 章 故障排除 复制链接链接已复制到粘贴板!
OpenTelemetry Collector 提供了多种方法来测量其健康状况,并调查数据监控问题。
1.1. 从命令行收集诊断数据 复制链接链接已复制到粘贴板!
在提交问题单时,向红帽提供包含有关集群的诊断信息会很有帮助。您可以使用 oc adm must-gather 工具来收集各种类型的资源的诊断数据,如 OpenTelemetryCollector、Instrumentation 以及创建的资源,如 Deployment、Pod 或 ConfigMap。oc adm must-gather 工具会创建一个收集此数据的新 pod。
流程
从您要保存收集的数据的目录中,运行
oc adm must-gather命令来收集数据:oc adm must-gather --image=ghcr.io/open-telemetry/opentelemetry-operator/must-gather -- \ /usr/bin/must-gather --operator-namespace <operator_namespace>
$ oc adm must-gather --image=ghcr.io/open-telemetry/opentelemetry-operator/must-gather -- \ /usr/bin/must-gather --operator-namespace <operator_namespace>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 安装 Operator 的默认命名空间是
openshift-opentelemetry-operator。
验证
- 验证新目录是否已创建并包含收集的数据。
1.2. 获取 OpenTelemetry Collector 日志 复制链接链接已复制到粘贴板!
您可以按照如下所示,获取 OpenTelemetry Collector 的日志。
流程
在
OpenTelemetryCollector自定义资源(CR) 中设置相关的日志级别:config: service: telemetry: logs: level: debugconfig: service: telemetry: logs: level: debug1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 收集器的日志级别。支持的值包括
info、warn、error或debug。默认为info。
-
使用
oc logs命令或 Web 控制台来检索日志。
1.3. 公开指标 复制链接链接已复制到粘贴板!
OpenTelemetry Collector 会公开有关它已处理的数据卷的指标。
otelcol_receiver_accepted_spans- 成功推送到管道中的 span 数量。
otelcol_receiver_refused_spans- 无法推送到管道中的 span 数量。
otelcol_exporter_sent_spans- 成功发送到目的地的 span 数量。
otelcol_exporter_enqueue_failed_spans- 无法添加到发送队列的 span 数量。
otelcol_receiver_accepted_logs- 成功推送到管道的日志数量。
otelcol_receiver_refused_logs- 无法推送到管道的日志数量。
otelcol_exporter_sent_logs- 成功发送到目的地的日志数量。
otelcol_exporter_enqueue_failed_logs- 无法添加到发送队列中的日志数量。
otelcol_receiver_accepted_metrics- 成功推送到管道的指标数量。
otelcol_receiver_refused_metrics- 无法推送到管道的指标数量。
otelcol_exporter_sent_metrics- 成功发送到目的地的指标数量。
otelcol_exporter_enqueue_failed_metrics- 无法添加到发送队列中的指标数量。
您可以使用这些指标来排除 Collector 的问题。例如,如果 otelcol_receiver_refused_spans 指标具有较高值,这表示 Collector 无法处理传入的 span。
Operator 会创建一个 <cr_name>-collector-monitoring 遥测服务,可用于提取指标端点。
流程
通过在
OpenTelemetryCollector自定义资源(CR)中添加以下行来启用 telemetry 服务:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 公开内部收集器指标的端口。默认值为
:8888。
运行以下命令来检索指标,该命令使用端口转发 Collector pod:
oc port-forward <collector_pod>
$ oc port-forward <collector_pod>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
OpenTelemetryCollectorCR 中,将enableMetrics字段设置为true以提取内部指标:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据 OpenTelemetry Collector 的部署模式,使用
PodMonitor或ServiceMonitor提取内部指标。注意另外,如果您没有将
enableMetrics字段设置为true,您可以访问http://localhost:8888/metrics的指标端点。可选: 如果 web 控制台中启用了 User Workload Monitoring 功能,进入 web 控制台中的 Observe → Dashboards,然后从下拉列表中选择 OpenTelemetry Collector 仪表板。有关用户工作负载监控功能的更多信息,请参阅监控 中的"为用户定义的项目启用监控"。
提示您可以过滤由 Collector 实例、命名空间或 OpenTelemetry 组件(如处理器、接收器或导出器)的 span 或 metrics 等视觉化数据。
1.4. Debug Exporter 复制链接链接已复制到粘贴板!
您可以配置 Debug Exporter,将收集的数据导出到标准输出。
流程
配置
OpenTelemetryCollector自定义资源,如下所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
使用
oc logs命令或 Web 控制台将日志导出到标准输出。
1.5. 禁用网络策略 复制链接链接已复制到粘贴板!
红帽构建的 OpenTelemetry Operator 会创建网络策略来控制 Operator 和操作对象的流量以提高安全性。默认情况下,网络策略会被启用并配置为允许到所有所需组件的流量。不需要额外的配置。
如果您遇到 OpenTelemetry Collector 或其 Target Allocator 组件的流量问题,则问题可能是默认的网络策略配置。您可以为 OpenTelemetry Collector 禁用网络策略来排除这个问题。
先决条件
-
您可以使用具有
cluster-admin角色的集群管理员访问集群。
流程
通过配置 OpenTelemetryCollector 自定义资源(CR)来禁用
OpenTelemetry Collector的网络策略:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 通过将
networkPolicy.enabled设置为true(默认)或false来指定是否启用网络策略。将它设置为false可禁用网络策略的创建。
1.6. 使用 Network Observability Operator 进行故障排除 复制链接链接已复制到粘贴板!
您可以使用 Network Observability Operator 来调试可观察性组件之间的流量。
先决条件
- 您已安装了 Network Observability Operator,如"安装 Network Observability Operator"中所述。
流程
- 在 OpenShift Container Platform web 控制台中进入 Observe → Network Traffic → Topology。
- 选择 Namespace 根据部署 OpenTelemetry Collector 的命名空间过滤工作负载。
- 使用流量可视化来排查可能的问题。如需了解更多详细信息,请参阅"从 Topology 视图保留网络流量"。
1.7. 对工具进行故障排除 复制链接链接已复制到粘贴板!
要对工具进行故障排除,请查找以下问题:
- 在工作负载中检测注入的问题
- 检测库生成数据的问题
1.7.1. 对工作负载注入的故障排除 复制链接链接已复制到粘贴板!
要排除检测注入的问题,您可以执行以下操作:
-
检查是否创建了
Instrumentation对象 - 检查 init-container 是否已启动
- 检查资源是否以正确顺序部署
- 搜索 Operator 日志中的错误
- 仔细检查 pod 注解
流程
运行以下命令验证
Instrumentation对象是否已成功创建:oc get instrumentation -n <workload_project>
$ oc get instrumentation -n <workload_project>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 创建检测的命名空间。
运行以下命令,以验证
opentelemetry-auto-instrumentationinit-container 是否已成功启动,这是检测注入工作负载的先决条件:oc get events -n <workload_project>
$ oc get events -n <workload_project>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 为工作负载注入检测的命名空间。
输出示例
... Created container opentelemetry-auto-instrumentation ... Started container opentelemetry-auto-instrumentation
... Created container opentelemetry-auto-instrumentation ... Started container opentelemetry-auto-instrumentationCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证资源是否已正确部署,以便自动检测正常工作。正确的顺序是在部署应用程序前部署
Instrumentation自定义资源(CR)。有关InstrumentationCR 的详情,请参考"配置工具"部分。注意当 pod 启动时,Red Hat build of OpenTelemetry Operator 会检查
InstrumentationCR 中的注解,其中包含注入自动检测的说明。通常,Operator 会将 init-container 添加到应用程序的 pod 中,该 pod 会将自动检测和环境变量注入应用程序的容器中。如果在部署应用程序时 Operator 无法使用InstrumentationCR,Operator 无法注入自动检测。修复部署顺序需要以下步骤:
- 更新检测设置。
- 删除检测对象。
- 重新部署应用。
运行以下命令检查 Operator 日志中的检测错误:
oc logs -l app.kubernetes.io/name=opentelemetry-operator --container manager -n openshift-opentelemetry-operator --follow
$ oc logs -l app.kubernetes.io/name=opentelemetry-operator --container manager -n openshift-opentelemetry-operator --followCopy to Clipboard Copied! Toggle word wrap Toggle overflow 对特定编程语言的检测的 pod 注解进行故障排除。请参阅"配置检测"中的所需的注解字段和值。
验证您要检测的应用程序 pod 是否使用正确的注解标记,并且应用了适当的自动检测设置。
Example
instrumentation.opentelemetry.io/inject-python="true"
instrumentation.opentelemetry.io/inject-python="true"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 获取检测 Python 应用程序的 pod 注解的命令示例
oc get pods -n <workload_project> -o jsonpath='{range .items[?(@.metadata.annotations["instrumentation.opentelemetry.io/inject-python"]=="true")]}{.metadata.name}{"\n"}{end}'$ oc get pods -n <workload_project> -o jsonpath='{range .items[?(@.metadata.annotations["instrumentation.opentelemetry.io/inject-python"]=="true")]}{.metadata.name}{"\n"}{end}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 验证应用于检测对象的注解是否正确,适用于您检测的编程语言。
如果同一命名空间中有多个检测,请在注解中指定
Instrumentation对象的名称。Example
instrumentation.opentelemetry.io/inject-nodejs: "<instrumentation_object>"
instrumentation.opentelemetry.io/inject-nodejs: "<instrumentation_object>"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果
Instrumentation对象位于不同的命名空间中,请在注解中指定命名空间。Example
instrumentation.opentelemetry.io/inject-nodejs: "<other_namespace>/<instrumentation_object>"
instrumentation.opentelemetry.io/inject-nodejs: "<other_namespace>/<instrumentation_object>"Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
验证
OpenTelemetryCollector自定义资源是否在spec.template.metadata.annotations下指定 auto-instrumentation 注解。如果 auto-instrumentation 注解位于spec.metadata.annotations中,请将其移到spec.template.metadata.annotations中。
1.7.2. 通过检测库生成遥测数据故障排除 复制链接链接已复制到粘贴板!
您可以通过检查端点、在应用程序日志中查找错误,并验证 Collector 收到遥测数据,从而通过检测库对遥测数据进行故障排除。
流程
验证检测是否将数据传送到正确的端点:
oc get instrumentation <instrumentation_name> -n <workload_project> -o jsonpath='{.spec.endpoint}'$ oc get instrumentation <instrumentation_name> -n <workload_project> -o jsonpath='{.spec.endpoint}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Instrumentation对象的默认端点http://localhost:4317仅适用于部署为应用程序 pod 中的 sidecar 的 Collector 实例。如果您使用不正确的端点,请通过编辑Instrumentation对象并重新部署应用程序来纠正该端点。检查应用程序日志中可能表明检测已出现故障的错误消息:
oc logs <application_pod> -n <workload_project>
$ oc logs <application_pod> -n <workload_project>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 如果应用程序日志包含表明检测可能会出现故障的错误消息,请在本地安装 OpenTelemetry SDK 和库。然后,在本地运行应用程序并进行故障排除,以便在没有 OpenShift Container Platform 的情况下检测库和应用程序间的问题。
- 使用 Debug Exporter 验证遥测数据是否到达目的地 OpenTelemetry Collector 实例。如需更多信息,请参阅"Debug Exporter"。