在中檢測 Node.js 程式碼 AWS Lambda - AWS Lambda

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

在中檢測 Node.js 程式碼 AWS Lambda

Lambda 與 AWS X-Ray 整合,可協助您追蹤、偵錯和最佳化 Lambda 應用程式。您可以使用 X-Ray 來追蹤請求,因為它會周遊您應用程式中的資源,其中可能包含 Lambda 函數和其他 AWS 服務。

若要將追蹤資料傳送至 X-Ray,您可以使用以下兩個資SDK源庫之一:

將遙測資料傳送至 X-Ray 服務的每一種方式。SDKs然後,您可以使用 X-Ray 來檢視、篩選應用程式的效能指標並獲得洞察,從而識別問題和進行最佳化的機會。

重要

X-Ray 和 Powertools AWS Lambda SDKs 是由 AWS提供的緊密集成的儀器解決方案的一部分。ADOTLambda 層是業界範圍內追蹤儀器標準的一部分,一般會收集更多資料,但可能不適用於所有使用案例。您可以使用任一解決方案在 X-Ray 中實作 end-to-end 追蹤。要了解有關在它們之間進行選擇的更多信息,請參閱選擇開放遙測發行 AWS 版和 X-Ray SDKs

用ADOT來檢測您的 Node.js 函數

ADOT提供完全受管的 Lambda ,可封裝使用 OTelSDK. 透過取用此層,您可以檢測 Lambda 函數,而無需修改任何函數程式碼。您還可以配置圖層以執行的自定義初始化OTel。如需詳細資訊,請參閱ADOT文件中的 Lambda 上ADOT收集器的自訂組態

對於 Node.js 執行階段,您可以新增AWS 受管的 Lambda 圖層,以便自動檢測您的函數。ADOT如需如何新增此層的詳細指示,請參閱說明ADOT文件 JavaScript中的 OpenTelemetry Lambda Support 發行AWS 版

使用 X-Ray SDK 檢測您的 Node.js 功能

若要記錄 Lambda 函數對應用程式中其他資源所進行之呼叫的詳細資料,您也可以使用 適用於 Node.js 的 AWS X-Ray SDK。若要取得SDK,請將aws-xray-sdk-core套件新增至應用程式的相依性。

範例 blank-nodejs/package.json
{ "name": "blank-nodejs", "version": "1.0.0", "private": true, "devDependencies": { "jest": "29.7.0" }, "dependencies": { "@aws-sdk/client-lambda": "3.345.0", "aws-xray-sdk-core": "3.5.3" }, "scripts": { "test": "jest" } }

要在 AWS SDK for JavaScript v3 中檢測 AWS SDK客戶端,請使用該captureAWSv3Client方法包裝客戶端實例。

範例 blank-nodejs/function/index.js — 追蹤用 AWS SDK戶端
const AWSXRay = require('aws-xray-sdk-core'); const { LambdaClient, GetAccountSettingsCommand } = require('@aws-sdk/client-lambda'); // Create client outside of handler to reuse const lambda = AWSXRay.captureAWSv3Client(new LambdaClient()); // Handler exports.handler = async function(event, context) { event.Records.forEach(record => { ...

Lambda 執行階段會設定一些環境變數來設定 X-Ray SDK。例如,Lambda 設定AWS_XRAY_CONTEXT_MISSINGLOG_ERROR避免從 X-Ray 擲回執行階段錯誤SDK。若要設置自訂內容遺失策略,請覆寫函式組態中的環境變數以使其不要有值,然後您可以透過程式設計方式設置內容遺失策略。

範例 初始化程式碼範例
const AWSXRay = require('aws-xray-sdk-core'); // Configure the context missing strategy to do nothing AWSXRay.setContextMissingStrategy(() => {});

如需詳細資訊,請參閱使用 Lambda 環境變數來設定程式碼中的值

新增正確的相依性並進行必要的程式碼變更後,請透過 Lambda 主控台或API.

透過 Lambda 主控台來啟用追蹤

若要使用控制台在 Lambda 函數上切換主動追蹤,請按照下列步驟操作:

開啟主動追蹤
  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇一個函數。

  3. 選擇 組態 ,然後選擇 監控和操作工具

  4. 選擇 編輯

  5. X-Ray 下,打開 主動追蹤

  6. 選擇 Save (儲存)。

使用 Lambda 啟用追蹤 API

使用 AWS CLI 或設定 Lambda 函數的追蹤 AWS SDK,請使用下列API作業:

下列範例 AWS CLI 命令可在名為 my- function 的函式上啟用主動追蹤。

aws lambda update-function-configuration --function-name my-function \ --tracing-config Mode=Active

追蹤模式是您發布函數版本時版本特定組態的一部分。您無法變更已發佈版本上的追蹤模式。

使用啟動追蹤 AWS CloudFormation

若要啟動 AWS CloudFormation 範本中的AWS::Lambda::Function資源追蹤,請使用TracingConfig屬性。

範例 function-inline.yml - 追蹤組態
Resources: function: Type: AWS::Lambda::Function Properties: TracingConfig: Mode: Active ...

對於 AWS Serverless Application Model (AWS SAM) AWS::Serverless::Function 資源,請使用Tracing屬性。

範例 template.yml - 追蹤組態
Resources: function: Type: AWS::Serverless::Function Properties: Tracing: Active ...

解讀 X-Ray 追蹤

您的函數需要將追蹤資料上傳至 X-Ray 的許可。當您在 Lambda 主控台中啟用追蹤時,Lambda 會將必要的許可新增至函數的執行角色。否則,請將AWSXRayDaemonWriteAccess原則新增至執行角色。

設定主動追蹤之後,您可以透過應用程式來觀察特定請求。X-Ray 服務圖顯示了有關應用程式及其所有元件的資訊。下列範例顯示具有兩個函式的應用程式。主要函式會處理事件,有時會傳回錯誤。頂部的第二個函數處理出現在第一個日誌組中的錯誤,並使用調 AWS SDK用 X-Ray,Amazon 簡單存儲服務(Amazon S3)和亞馬遜 CloudWatch 日誌。

在 X-Ray 中顯示兩個單獨的應用程式,及其各自服務映射的圖表

X-Ray 無法追蹤應用程式的所有請求。X-Ray 會套用取樣演算法以確保追蹤的效率,同時仍提供所有請求的代表範本。取樣率為每秒 1 次請求和 5% 的額外請求。您無法為您的功能配置 X-Ray 採樣率。

在 X-Ray 中,追蹤會記錄一或多個服務所處理之要求的相關資訊。Lambda 會記錄每個追蹤 2 個區段,在服務圖表上建立兩個節點。下列影像會強調顯示這兩個節點:

具有單一函數的 X-Ray 服務映射。

左側第一個節點代表接收調用請求的 Lambda 服務。第二個節點代表您特定的 Lambda 函數。下列範例顯示了具有這 2 個區段的追蹤。兩者都被命名為我的函數,但一個具有的起源AWS::Lambda,另一個具有的AWS::Lambda::Function起源。如果AWS::Lambda區段顯示錯誤,表示 Lambda 服務發生問題。如果AWS::Lambda::Function區段顯示錯誤,表示您的函數發生問題。

顯示特定 Lambda 調用每個子區段延遲的 X-Ray 追蹤。

此範例會展開區AWS::Lambda::Function段以顯示其三個子區段。

注意

AWS 目前正在對 Lambda 服務實作變更。由於這些變更,您可能會看到系統記錄訊息的結構和內容,以及. AWS 帳戶

此處顯示的示例跟踪說明了舊式函數段。以下段落說明舊樣式和新樣式區段之間的差異。

這些變更將在未來幾週內實施,除了中國和 GovCloud 地區以 AWS 區域 外的所有功能都將轉換為使用新格式的日誌訊息和追蹤區段。

舊式函數段包含以下子段:

  • 初始化 - 表示載入函數和執行初始化程式碼所花費的時間。只有函數的每個執行個體所處理的第一個事件會顯示此子區段。

  • 調用 – 表示執行處理常式程式碼所花費的時間。

  • 額外負荷 - 表示 Lambda 執行期為做好準備以處理下一個事件所花費的時間。

新樣式的函數段不包含Invocation子段。相反,客戶子段直接附加到功能段。如需舊式和新型式函數區段結構的詳細資訊,請參閱〈〉了解 X-Ray 追蹤

您也可以檢測用HTTP戶端、記錄SQL查詢,以及使用註釋和中繼資料建立自訂子區段。如需詳細資訊,請參閱《AWS X-Ray 開發人員指南》中的 適用於 Node.js 的 AWS X-Ray SDK 許可。

定價

作為免費方案的一部分,您可以每月免費使用 X-Ray 追蹤,最多達到一定限制。 AWS 達到閾值後,X-Ray 會收取追蹤儲存及擷取的費用。如需詳細資訊,請參閱 AWS X-Ray 定價

在圖層中存儲運行時依賴關係(X-RaySDK)

如果您使用 X-Ray SDK 來檢測 AWS SDK客戶端的功能代碼,則您的部署包可能會變得相當大。若要避免每次更新函數程式碼時都上傳執行階段相依性,請將 X-Ray 封裝SDK在 Lambda 層中。

以下範例會顯示存放 適用於 Node.js 的 AWS X-Ray SDK的 AWS::Serverless::LayerVersion 資源。

範例 template.yml - 相依性層
Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: function/. Tracing: Active Layers: - !Ref libs ... libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-nodejs-lib Description: Dependencies for the blank sample app. ContentUri: lib/. CompatibleRuntimes: - nodejs16.x

透過此組態,您只有在變更執行時間相依性時才會更新程式庫層。由於函數部署套件僅含有您的程式碼,因此有助於減少上傳時間。

為相依性建立圖層需要建置變更,才能在部署之前產生圖層封存。如需工作範例,請參閱 blank-nodejs 範例應用程式。