无法将跟踪导出到 Kubernetes 上的 OpenTelemetry 收集器

Unable to export traces to OpenTelemetry Collector on Kubernetes

我正在使用 opentelemetry-ruby otlp 导出器进行自动检测: https://github.com/open-telemetry/opentelemetry-ruby/tree/main/exporter/otlp

otel 收集器作为守护进程安装: https://github.com/open-telemetry/opentelemetry-helm-charts/tree/main/charts/opentelemetry-collector

我正在尝试让 OpenTelemetry 收集器从 Rails 应用程序收集跟踪。两者 运行 在同一个集群中,但在不同的命名空间中。

我们已在应用程序中启用自动检测,但 rails 日志目前显示这些错误:

E, [2022-04-05T22:37:47.838197 #6] ERROR -- : OpenTelemetry error: Unable to export 499 spans

我在应用程序中设置了以下环境变量:

OTEL_LOG_LEVEL=debug
OTEL_EXPORTER_OTLP_ENDPOINT=http://0.0.0.0:4318

我无法确认应用程序是否可以在此端口上与收集器 pods 通信。 从 rails/ruby 应用 returns“连接被拒绝”中卷曲此地址。但是我能够卷曲 http://<OTEL_POD_IP>:4318 找不到 returns 404 页面。

从 pod 内部:

# curl http://localhost:4318/
curl: (7) Failed to connect to localhost port 4318: Connection refused

# curl http://10.1.0.66:4318/
404 page not found

此 helm chart 创建了一个守护程序集,但没有服务 运行。是否需要启用某些设置才能使其正常工作?

我确认 otel-collector 运行 在集群中的每个节点上,并且守护程序集的 HostPort 设置为 4318。

这个设置有问题:

OTEL_EXPORTER_OTLP_ENDPOINT=http://0.0.0.0:4318

将您的 pod 想象成一个剥离出来的主机本身。您的 pod 的 Localhost 或 0.0.0.0,并且您的 pod 中没有部署收集器。

您需要使用收件人提供的地址。我检查了 shared repo 中可用的示例,对于 agent-and-standalonestandalone-only,您还有一个服务类型的 k8s 资源。

这样您就可以使用完整的服务名称(带命名空间)来配置您的环境变量。
此外,环境变量现在称为 OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,因此您需要这样的东西:

OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=<service-name>.<namespace>.svc.cluster.local:<service-port>

正确的解决方案是使用 Kubernetes Downward API 获取节点 IP 地址,这将允许您将跟踪直接导出到同一节点内的 daemonset pod:

  containers:
  - name: my-app
    image: my-image
    env:
    - name: HOST_IP
      valueFrom:
        fieldRef:
          fieldPath: status.hostIP
    - name: OTEL_EXPORTER_OTLP_ENDPOINT
      value: http://$(HOST_IP):4318

请注意,使用部署的服务作为端点 (<service-name>.<namespace>.svc.cluster.local) 是不正确的,因为它有效地绕过了 daemonset 并将跟踪直接发送到部署,这使得 daemonset 无用。