簡體   English   中英

使用 Google Cloud Run 進行 Stackdriver Trace

[英]Stackdriver Trace with Google Cloud Run

我一直在深入研究 Google Cloud Run 上的 Stackdriver Trace 集成。 我可以讓它與代理一起工作,但有幾個問題困擾着我。

鑒於

  • Stackdriver 代理在一個小緩沖區中聚合跟蹤並定期發送它們。
  • 當 Cloud Run 服務未處理請求時,CPU 訪問會受到限制。
  • Cloud Run 服務沒有關閉鈎子; 您無法在關閉前清除緩沖區:容器只會收到SIGKILL 這是您無法從應用程序中捕捉到的信號。
  • 運行在請求-響應周期之外發送信息的后台進程似乎違反了Knative Container Runtime 合同
  • 日志數據的集合被記錄在案,不需要我運行代理,但沒有這樣的遙測解決方案。
  • 我發現了一份報告,稱有人使用基於代理的方法在 Cloud Run 上丟失了蹤跡

谷歌是如何做到的

我進入了 Cloud Endpoints ESP 的源代碼(Cloud Run 集成處於測試階段),看看他們是否以不同的方式解決它,但使用了相同的模式:有一個帶有跟蹤 (1s) 和它會定期清除。

雖然我的跟蹤集成似乎在我的測試設置中工作,但我擔心在生產環境中運行它時不完整和丟失的跟蹤。

  • 這是一個假設的問題還是一個真實的問題?

  • 看起來解決這個問題的正確方法是將遙測數據寫入日志,而不是使用代理進程。 Stackdriver Trace 支持嗎?

這是一個假設的問題還是一個真實的問題?

如果您考慮 Cloud Run 服務接收單個請求,那么這絕對是一個問題,因為在容器實例的 CPU 受到限制之前,庫將沒有時間刷新數據。

但是,在現實生活中的用例中:

  • Cloud Run 服務經常連續或頻繁地接收請求,這意味着其容器實例將:持續擁有 CPU 或不時擁有可用 CPU。
  • 刪除跟蹤是可以的:如果由於實例被拒絕而沒有收集某些跟蹤,則很可能在發生這種情況之前您已經收集了足夠多樣化的樣本集。 此外,您可能只對聚合報告感興趣,在這種情況下,收集單個跟蹤無關緊要。

請注意,Trace 庫本身通常會對請求進行采樣以進行跟蹤,它們很少會跟蹤 100% 的請求。

看起來解決這個問題的正確方法是將遙測數據寫入日志,而不是使用代理進程。 Stackdriver Trace 支持嗎?

不,Stackdriver Trace 從發送到其 API 的 span 中獲取數據。 請注意,要將數據發送到 Stackdriver Trace,您可以使用 OpenCenss 和 OpenTelemetry 等庫,專有 Stackdriver Trace 庫不是推薦的方式。

你是對的。 這是一個公平的問題,因為大多數跟蹤庫傾向於在后台采樣/上傳跟蹤跨度。

由於 (1) 當容器不處理任何請求時,您的 CPU 幾乎縮放為零,並且 (2) 容器實例可能會因不活動而隨時被終止,因此您無法可靠地上傳應用程序中收集的那些跟蹤范圍。 正如您所說,由於我們沒有完全停止 CPU,它有時可能會起作用,但它並不總是起作用。

看起來某些 Stackdriver(和/或 OpenTelemetry fka OpenCensus)庫讓您可以控制推送跟蹤跨度的生命周期。

例如,OpenCensus Stackdriver 導出器的 Go 包有一個Flush()方法,您可以在完成請求之前調用該方法,而不是依賴運行時定期上傳跟蹤范圍: https : //godoc.org/contrib.go.opencensus .io/exporter/stackdriver#Exporter.Flush

我假設其他語言的其他跟蹤庫也公開了類似的 Flush() 方法,如果沒有,請在評論中告訴我,這將是對這些庫的有效功能請求。

Cloud Run 現在支持發送 SIGTERM。 如果您的應用程序處理 SIGTERM,它將在關閉前獲得 10 秒的寬限時間。

您可以使用這 10 秒來:

  • 刷新有未發送數據的緩沖區
  • 關閉與其他系統的連接

文檔: 容器運行時合約

暫無
暫無

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

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