簡體   English   中英

無法將跟蹤導出到 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

我無法確認應用程序可以與此端口上的收集器 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-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 )是不正確的,因為它有效地繞過了守護程序集並將跟蹤直接發送到部署,這使得守護程序集無用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM