使用 Ruby 中介軟體的 X-Ray SDK 追蹤傳入的要求 - AWS X-Ray

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Ruby 中介軟體的 X-Ray SDK 追蹤傳入的要求

您可以使用 X-Ray 開發套件來追蹤應用程式在 Amazon EC2 或 Amazon ECS 的 EC2 執行個體上提供的傳入 HTTP 請求。 AWS Elastic Beanstalk

若您使用 Rails,請使用 Rails 中介軟體來檢測傳入的 HTTP 請求。當您將中介軟體新增至應用程式並設定區段名稱時,Ruby 的 X-Ray SDK 會為每個取樣要求建立區段。任何由額外檢測建立的區段都會成為子區段,位於提供 HTTP 請求及回應資訊的請求層級區段之下。此資訊包括時間、方法,以及請求的處置方式。

每個區段都有一個名稱,可在服務對應中識別您的應用程式。區段可以以靜態方式命名,也可以設定 SDK 根據傳入要求中的主機標頭動態命名區段。動態命名可讓您根據要求中的網域名稱對追蹤進行分組,並在名稱與預期的模式不符時套用預設名稱 (例如,如果主機標頭是偽造的)。

轉寄的要求

如果負載平衡器或其他中介機構將要求轉寄至您的應用程式,X-Ray 會從要求中的X-Forwarded-For標頭取得用戶端 IP,而不是從 IP 封包中的來源 IP 取得。為轉寄要求所記錄的用戶端 IP 可以偽造,因此不應該受信任。

轉送請求時,SDK 會在區段中設定一個額外的欄位來指出這一點。如果區段包含x_forwarded_for設定為的欄位true,則會從 HTTP 要求中的X-Forwarded-For標頭取得用戶端 IP。

中介軟體會使用 http 區塊為每個傳入的請求建立區段,其中包含以下資訊:

  • HTTP 方法-獲取,發布,把,刪除等。

  • [用戶端位址] — 傳送要求的用戶端 IP 位址。

  • 回應碼 — 已完成要求的 HTTP 回應碼。

  • 間 — 開始時間 (收到請求的時間) 和結束時間 (傳送回應的時間)。

  • 使用者代理程式user-agent 來自請求的。

  • 內容長度」— 響應content-length中的內容。

使用 Rails 中介軟體

若要使用中介軟體,請更新您的 gemfile 以包含必要的 railtie

範例 Gemfile - rails
gem 'aws-xray-sdk', require: ['aws-xray-sdk/facets/rails/railtie']

若要使用中介軟體,您還必須使用代表追蹤對映中應用程式的名稱來設定記錄器。

範例 config/initializers/aws_xray.rb
Rails.application.config.xray = { name: 'my app' }

手動檢測程式碼

若您沒有使用 Rails,請手動建立區段。您可以為每個傳入要求建立區段,或在已修補的 HTTP 或 AWS SDK 用戶端周圍建立區段,以提供錄製程式新增子區段的內容。

# Start a segment segment = XRay.recorder.begin_segment 'my_service' # Start a subsegment subsegment = XRay.recorder.begin_subsegment 'outbound_call', namespace: 'remote' # Add metadata or annotation here if necessary my_annotations = { k1: 'v1', k2: 1024 } segment.annotations.update my_annotations # Add metadata to default namespace subsegment.metadata[:k1] = 'v1' # Set user for the segment (subsegment is not supported) segment.user = 'my_name' # End segment/subsegment XRay.recorder.end_subsegment XRay.recorder.end_segment

設定區段命名策略

AWS X-Ray 使用服務名稱來識別您的應用程式,並將其與應用程式使用的其他應用程式、資料庫、外部 API 和 AWS 資源區分開來。X-Ray SDK 為傳入要求產生區段時,會在區段的名稱欄位中記錄應用程式的服務名稱

X-Ray SDK 可以在 HTTP 要求標頭中的主機名稱之後命名區段。但是,此標頭可能會被偽造,這可能會導致服務對應中出現非預期的節點。若要避免 SDK 因為具有偽造主機標頭的要求而不正確地命名區段,您必須為傳入要求指定預設名稱。

如果您的應用程式為多個網域提供要求,您可以將 SDK 設定為使用動態命名策略,在區段名稱中反映此問題。動態命名策略可讓 SDK 針對符合預期模式的要求使用主機名稱,並將預設名稱套用至不符合要求的要求。

例如,您可能有一個應用程式向三個子網域提供要求 — www.example.com api.example.com、和static.example.com。您可以將動態命名策略與模式搭配使用,*.example.com以識別具有不同名稱的每個子網域的區段,從而在服務對應上產生三個服務節點。如果您的應用程式收到的主機名稱與模式不符的要求,您會在服務對應上看到第四個節點,其中包含您指定的後援名稱。

若要為所有請求區段使用相同的名稱,請如上一節所述,在設定記錄器時指定您應用程式的名稱。

動態命名策略可定義主機名稱應相符的模式,以及如果 HTTP 請求中的主機名稱不符合模式時要使用的預設名稱。若要動態命名區段,請在組態雜湊中指定命名模式。

範例 主 .rb-動態命名
config = { naming_pattern: '*mydomain*', name: 'my app', } XRay.recorder.configure(config)

您可以在模式中使用 '*' 來比對任何字串,或是 '?' 來比對任何單一字元。

注意

您可以使用 AWS_XRAY_TRACING_NAME 環境變數來覆寫您在程式碼中定義的預設服務名稱。