[英]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
我無法確認應用程序可以與此端口上的收集器 pod 通信。 從 rails/ruby 應用程序中卷曲此地址會返回“拒絕連接”。 但是我可以 curl http://<OTEL_POD_IP>:4318
返回 404 page not found。
從 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 圖表創建了一個守護程序集,但沒有運行任何服務。 我需要啟用一些設置才能使其正常工作嗎?
我確認 otel-collector 正在集群中的每個節點上運行,並且守護程序集的 HostPort 設置為 4318。
問題在於這個設置:
OTEL_EXPORTER_OTLP_ENDPOINT=http://0.0.0.0:4318
將您的 pod 想象成一個剝離的主機本身。 本地主機或您的 pod 的 0.0.0.0,並且您的 pod 中沒有部署收集器。
您需要使用收藏家的地址。 我檢查了共享存儲庫中可用的示例,對於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
)是不正確的,因為它有效地繞過了守護程序集並將跟蹤直接發送到部署,這使得守護程序集無用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.