无法将跟踪导出到 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-standalone
和 standalone-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 无用。
我正在使用 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-standalone
和 standalone-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 无用。