接入、Lambda 埋點(diǎn)與 Trace 采樣控制全解析)
Serverless Framework Monitoring ObservabilityAWS 賬戶(hù)接入、Lambda 埋點(diǎn)與 Trace 采樣控制全解析【免費(fèi)下載鏈接】serverless? Serverless Framework – Effortlessly build apps that auto-scale, incur zero costs when idle, and require minimal maintenance using AWS Lambda and other managed cloud services.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/se/serverless本文圍繞 Serverless Framework 的 Monitoring Observability監(jiān)控與可觀測(cè)性功能展開(kāi)先講清它能在 Dashboard 中提供什么跨賬戶(hù) Metrics/Traces/Logs/Errors 全局視圖再完整覆蓋兩條官方接入路徑——Dashboard UI 與 CLI serverless.yml配置最后深入源碼解釋stages.stage.observability的解析邏輯、集成底層原理IAM Role、Kinesis Firehose、Lambda Layer 包裝器以及 Trace 采樣、AWS SDK/HTTP Span 的關(guān)閉方式。讀完本文你可以在自己的 AWS 賬戶(hù)上完成從接入、驗(yàn)證數(shù)據(jù)到按需關(guān)閉全部功能的操作并能排查常見(jiàn)的埋點(diǎn)失敗問(wèn)題。功能概覽Serverless Framework 的 Monitoring Observability 讓你無(wú)需自己搭建復(fù)雜的埋點(diǎn)鏈路就能在 Dashboard 中跨所有已接入的 AWS 賬戶(hù)和 Serverless Framework Service 查看 Lambda 函數(shù)的運(yùn)行數(shù)據(jù)。其核心能力包括跨所有已接入 AWS 賬戶(hù)的 Metrics、Traces、Logs、Errors 全局視圖通過(guò)強(qiáng)力的過(guò)濾器檢索數(shù)據(jù)即時(shí)錯(cuò)誤告警Instant error alerts自動(dòng)對(duì)高流量函數(shù)進(jìn)行 Trace 采樣以控制成本能識(shí)別代碼中定義的 API 路由例如 Express.js 的路由而不是 API Gateway 層的/{proxy}無(wú)需手動(dòng)埋點(diǎn)或復(fù)雜 instrumentation開(kāi)箱即用。一個(gè)重要的適用前提該功能不依賴(lài)你是否通過(guò) Serverless Framework 部署——只要把 AWS 賬戶(hù)接入平臺(tái)即使函數(shù)是用其他部署工具發(fā)布的也能開(kāi)啟監(jiān)控。支持范圍與接入前提在動(dòng)手之前先確認(rèn)你的環(huán)境滿(mǎn)足以下支持范圍以當(dāng)前倉(cāng)庫(kù)文檔為準(zhǔn)支持的 AWS Lambda Runtime見(jiàn) monitoring/README.mdnodejs14.x / nodejs16.x / nodejs18.xpython3.8 / python3.9 / python3.10 / python3.11文檔同時(shí)聲明整體支持 Node.js 12 與 Python 3.8 的 Lambda runtime且僅支持 AWS 商業(yè)區(qū)域Commercial Regions不支持 GovCloud 與中國(guó)區(qū)。接入的前提條件先注冊(cè)一個(gè) Serverless Framework 平臺(tái)賬戶(hù)在 Serverless Framework 官網(wǎng)創(chuàng)建通過(guò) IAM Role 把 AWS 賬戶(hù)直接連接給 Serverless Framework 平臺(tái)。該 IAM Role 所需權(quán)限在官方 Dashboard 倉(cāng)庫(kù)中以 CloudFormation 模板形式公開(kāi)可自行審閱注意開(kāi)啟功能會(huì)在被接入的 AWS 賬戶(hù)中創(chuàng)建少量資源如 CloudFormation Stack、Kinesis Firehose會(huì)帶來(lái)少量額外 AWS 成本。接入方式一通過(guò) Dashboard UI適合多賬戶(hù) / 大量函數(shù)官方文檔認(rèn)為對(duì)于多個(gè) AWS 賬戶(hù)或單賬戶(hù)內(nèi)大量 Lambda 函數(shù)的場(chǎng)景Dashboard UI 是最方便的接入方式。完整步驟如下在 Dashboard 左側(cè)導(dǎo)航欄點(diǎn)擊 Settings 圖標(biāo)進(jìn)入 Integrations 標(biāo)簽頁(yè)——這是連接 AWS 賬戶(hù)的入口在另一個(gè)瀏覽器窗口中登錄你想接入的 AWS 賬戶(hù)需要有權(quán)創(chuàng)建帶所需權(quán)限的 IAM Role在 Integrations 視圖點(diǎn)擊 Add Integrations。這會(huì)彈出一個(gè)新的瀏覽器窗口打開(kāi) AWS Console 的 CloudFormation Stack 創(chuàng)建頁(yè)面模板中已預(yù)置了包含 IAM Role含監(jiān)控所需全部權(quán)限的 CloudFormation Stack 模板在頁(yè)面底部點(diǎn)擊 CreateStack 創(chuàng)建期間切回 DashboardIntegrations 視圖會(huì)實(shí)時(shí)檢測(cè) Stack 創(chuàng)建狀態(tài)并持續(xù)刷新直到集成完成無(wú)需其他操作重復(fù)以上步驟即可接入任意數(shù)量的 AWS 賬戶(hù)。接入后還需要選擇要開(kāi)啟監(jiān)控的 Lambda 函數(shù)在 Integrations 視圖中能看到新建的 AWS Integration建議先給它命名例如 production、development方便在 Dashboard 查詢(xún)過(guò)濾器中識(shí)別點(diǎn)擊該 Integration 的 Edit 按鈕會(huì)列出該賬戶(hù)內(nèi)所有 AWS Lambda 函數(shù)對(duì)單個(gè)函數(shù)點(diǎn)擊 Instrument 開(kāi)關(guān)或點(diǎn)擊表頭開(kāi)關(guān)一次開(kāi)啟當(dāng)前頁(yè)全部函數(shù)多頁(yè)時(shí)需逐頁(yè)操作然后點(diǎn)擊 Save。埋點(diǎn)instrumentation在后臺(tái)異步進(jìn)行可以逐頁(yè)繼續(xù)開(kāi)啟之后前往 Metrics 或 Explorer 視圖確保函數(shù)確實(shí)在被調(diào)用幾分鐘后數(shù)據(jù)就會(huì)顯示出來(lái)。注意賬戶(hù)集成完成后Metrics、Traces 等數(shù)據(jù)通常需要最多 10 分鐘才能在 Dashboard 中可見(jiàn)。接入方式二通過(guò) CLI 與serverless.yml按 Stage 精確控制如果你的 Service 已經(jīng)連接 Dashboard可以直接在serverless.yml中控制每個(gè) stage 的可觀測(cè)性開(kāi)關(guān)。CLI 方式會(huì)自動(dòng)把 Serverless Framework 平臺(tái)連接到 AWS 賬戶(hù)并針對(duì)所選 stages 內(nèi)的所有 Lambda 函數(shù)啟用監(jiān)控。首先確認(rèn) Service 已連接 Dashboard——判斷依據(jù)是serverless.yml中存在org和app屬性若尚未連接先在該 Service 的工作目錄中運(yùn)行一次serverless命令完成連接。連接后在stages屬性下控制各 stage 的 observability 配置# Ensure these properties are present to connect to the Dashboard org: my-org app: my-app # Control observability instrumentation settings under stages stages: dev: observability: true # Turn on observability in the dev stage prod: observability: true # Turn on observability in the prod stage default: observability: false # Turn off observability in all other stages此后每次部署observability 都會(huì)按目標(biāo) stage 的取值自動(dòng)開(kāi)啟或關(guān)閉。上面這個(gè)例子中dev 和 prod 開(kāi)啟其余 stage 關(guān)閉。部署完成后到 Dashboard 的 Settings Integrations 中確認(rèn)應(yīng)能看到剛接入的 AWS 賬戶(hù)強(qiáng)烈建議命名以便在查詢(xún)過(guò)濾器中查找點(diǎn)擊該 Integration 的 Edit 按鈕可以看到賬戶(hù)內(nèi)所有 Lambda 函數(shù)以及各自處于啟用/禁用狀態(tài)。同樣地?cái)?shù)據(jù)出現(xiàn)前可能需要等待最多 10 分鐘。源碼視角observability配置是如何被解析的上面的 stage 優(yōu)先、default 兜底 行為并非約定俗成而是由源碼顯式實(shí)現(xiàn)的。在 observability 插件入口 中determineObservabilityProviderFromConfig函數(shù)先讀取stages[stageName].observability若為空再回退到stages.default.observability這與文檔描述完全一致。進(jìn)一步看determineStageSpecificObservabilityProvider的實(shí)現(xiàn)可以確認(rèn)幾種取值的處理規(guī)則從源碼結(jié)構(gòu)看實(shí)際支持的范圍比本文檔示例更多布爾值true映射為dashboardproviderfalse映射為disabled若設(shè)置為布爾值但未配置app屬性會(huì)拋出OBSERVABILITY_APP_NOT_SET錯(cuò)誤To instrument your service, you must set the app property in your config file.字符串支持axiom、dashboard、disabled三種已知 provider未知名稱(chēng)會(huì)拋出UNKNOWN_OBSERVABILITY_PROVIDER對(duì)象支持{ provider: name }形式例如接入 Axiom 后端 的 observability 配置。而在 Dashboard provider 判定模塊 中isDashboardObservabilityEnabled正是通過(guò) provider 解析結(jié)果等于DASHBOARD 來(lái)判斷當(dāng)前 stage 是否啟用 Dashboard 監(jiān)控它被部署等流程如 deploy 插件調(diào)用來(lái)決定本次部署是否為函數(shù)打上埋點(diǎn)。這解釋了為什么文檔強(qiáng)調(diào) 部署時(shí) observability 才會(huì)按 stage 生效它是部署鏈路中的一道判定而不是運(yùn)行時(shí)的動(dòng)態(tài)開(kāi)關(guān)。集成底層原理How Integration Works理解集成原理對(duì)排查問(wèn)題和評(píng)估成本都很有幫助。官方文檔說(shuō)明整個(gè)機(jī)制由一個(gè)在集成時(shí)創(chuàng)建的 AWS IAM Role 驅(qū)動(dòng)且你可以隨時(shí)刪除該 IAM Role但更推薦在 Dashboard 的 Integration 上點(diǎn) Remove因?yàn)槟菚?huì)自動(dòng)解除所有函數(shù)的埋點(diǎn)、刪除平臺(tái)創(chuàng)建的資源。數(shù)據(jù)鏈路Kinesis Firehose CloudWatch Logs 訂閱集成完成后平臺(tái)會(huì)先在你的 AWS 賬戶(hù)內(nèi)創(chuàng)建一個(gè) Kinesis Firehose并為每個(gè) Lambda 函數(shù)建立 CloudWatch Logs 訂閱把日志發(fā)布到該 FirehoseServerless Framework 平臺(tái)從 Firehose 攝取日志數(shù)據(jù)。每次函數(shù)調(diào)用期間SDK 會(huì)在 CloudWatch Logs 中記錄一個(gè)壓縮的 Trace 負(fù)載日志行以SERVERLESS_TELEMETRY開(kāi)頭便于人工核查。一個(gè)明確的邊界平臺(tái)攝取日志但不存儲(chǔ)日志只是掃描其中特定信息與 SDK 生成的 Trace 負(fù)載日志存儲(chǔ)目前不是 Dashboard 提供的能力。埋點(diǎn)機(jī)制Lambda Layer 環(huán)境變量Internal Extension對(duì)開(kāi)啟 Instrument 的每個(gè)函數(shù)平臺(tái)會(huì)自動(dòng)追加一個(gè) AWS Lambda Layer 和若干環(huán)境變量關(guān)閉開(kāi)關(guān)時(shí)這些又會(huì)被自動(dòng)移除。這個(gè) Layer 被設(shè)計(jì)為Internal Extension——通過(guò)包裝器腳本與環(huán)境變量AWS_LAMBDA_EXEC_WRAPPER把你的代碼包裝進(jìn) SDK。需要注意文檔中的強(qiáng)提示如果有其他工具也在用該變量包裝你的函數(shù)代碼Serverless Framework會(huì)覆蓋它那個(gè)工具將不再工作官方強(qiáng)調(diào)其 Layer 是 Internal Extension 而非 External Extension。文檔稱(chēng)經(jīng)過(guò)大量研究與基準(zhǔn)測(cè)試通過(guò) External Extension 增加可觀測(cè)性工具幾乎總是帶來(lái)可感知的性能與成本懲罰冷啟動(dòng)、調(diào)用時(shí)長(zhǎng)、后處理時(shí)長(zhǎng)。文檔對(duì)該 Layer 的優(yōu)化效果不增加冷啟動(dòng)/調(diào)用/后處理時(shí)延屬于官方描述可結(jié)合 troubleshoot 文檔 中給出的 Layer 命名如sls-sdk-node-v0-15-12、sls-sdk-python-v0-2-3與包裝器路徑Node.js 為/opt/sls-sdk-node/exec-wrapper.shPython 為/opt/sls-sdk-python/exec_wrapper.py在 AWS 控制臺(tái)逐一核對(duì)。CloudTrail 事件監(jiān)聽(tīng)集成還會(huì)監(jiān)聽(tīng) CloudTrail 事件在每次函數(shù)更新后自動(dòng)檢查 Layer 與環(huán)境變量是否仍然掛載僅針對(duì)開(kāi)啟 Instrument 的函數(shù)。這意味著你可以繼續(xù)用任意部署工具同時(shí)平臺(tái)保證 一旦標(biāo)記 Instrument就一定完成埋點(diǎn)從而降低部署/配置失誤的影響。Trace 采樣機(jī)制How Trace Sampling WorksTrace 采樣按單個(gè)函數(shù)而非賬戶(hù)級(jí)自動(dòng)生效設(shè)計(jì)目標(biāo)是對(duì)高流量函數(shù)按默認(rèn) 20% 的速率采樣對(duì)低流量函數(shù)則完全關(guān)閉采樣。具體觸發(fā)規(guī)則是當(dāng)同一容器內(nèi)相鄰兩次調(diào)用的平均間隔連續(xù) 5 次調(diào)用低于 1 秒/次時(shí)采樣開(kāi)啟反之以下場(chǎng)景采樣會(huì)被禁用冷啟動(dòng)后的前 5 次調(diào)用不采樣平均調(diào)用頻率低于 1.0 次/秒且流量平穩(wěn)非尖峰型時(shí)平均頻率遠(yuǎn)低于 1.0 次/秒、但出現(xiàn) 5 秒內(nèi)最多 5 次調(diào)用的尖峰時(shí)調(diào)用產(chǎn)生了 error 或 warning 事件時(shí)從不采樣保證問(wèn)題調(diào)用一定有 Trace通過(guò)環(huán)境變量SLS_DISABLE_TRACE_SAMPLING顯式關(guān)閉。官方給出的經(jīng)驗(yàn)值月調(diào)用量低于約 250 萬(wàn)次的大多數(shù)情況下采樣會(huì)自動(dòng)關(guān)閉但實(shí)際取決于調(diào)用分布、冷啟動(dòng)率與錯(cuò)誤/警告率。采樣何時(shí)生效的量化口徑1-2 百萬(wàn)次/月或突發(fā)流量觸發(fā)可參見(jiàn) troubleshoot 文檔。通過(guò) SDK 做高級(jí)埋點(diǎn)在開(kāi)箱即用的自動(dòng)埋點(diǎn)之外官方提供 Node.js 與 Python 兩個(gè) Serverless SDK用于更豐富的場(chǎng)景優(yōu)雅捕獲 handled error不讓函數(shù)失敗也能上報(bào)、自定義 Trace Span、捕獲 Error/Warning 事件、給 Trace 打自定義 Tag 提升可檢索性、與結(jié)構(gòu)化日志庫(kù)集成。完整用法見(jiàn)Node.js SDK 文檔Python SDK 文檔SDK 總覽還說(shuō)明了自動(dòng)注入機(jī)制開(kāi)啟 Instrumentation 后框架會(huì)自動(dòng)把 SDK 模塊注入 lambda 包并包裝 handler由于 Layer 在手工部署時(shí)可能被移除官方建議把 SDK 直接打進(jìn)函數(shù)包npm install serverless/sdk --save。若使用 esbuild 等 bundler 打包了 express / AWS SDKLayer 無(wú)法自動(dòng) instrument 被打包的依賴(lài)需改用serverless/aws-lambda-sdk手動(dòng)調(diào)用instrumentation.awsSdkV2/V3Client/expressApp.install(...)完成接入。此外SDK 配置文檔 提供了三個(gè) HTTP Span 抓取的細(xì)粒度環(huán)境變量SERVERLESS_ENTERPRISE_SPANS_CAPTURE_HOSTS—— 默認(rèn)*設(shè)為逗號(hào)分隔的主機(jī)名列表可只抓取指定主機(jī)SERVERLESS_ENTERPRISE_SPANS_IGNORE_HOSTS—— 默認(rèn)未設(shè)置設(shè)為逗號(hào)分隔列表排除指定主機(jī)SERVERLESS_ENTERPRISE_SPANS_CAPTURE_AWS_SDK_HTTP—— 默認(rèn)未設(shè)置設(shè)任意值可額外抓取來(lái)自botocore/aws-sdk的 HTTP Span。關(guān)閉與降級(jí)賬戶(hù)級(jí)、Service 級(jí)、采樣級(jí)、Span 級(jí)關(guān)閉整個(gè) AWS 賬戶(hù)進(jìn)入 Settings Integrations對(duì)目標(biāo)賬戶(hù)點(diǎn)擊 Remove。斷開(kāi)后平臺(tái)會(huì)自動(dòng)移除所有函數(shù)的埋點(diǎn)Layer 與環(huán)境變量、刪除集成時(shí)創(chuàng)建的資源、銷(xiāo)毀包含 IAM Role 的 CloudFormation Stack。注意若移除后立刻重建 Integration由于 AWS 資源刪除再創(chuàng)建的時(shí)序問(wèn)題新集成可能需要最多 20 分鐘才完全生效。關(guān)閉某個(gè) Service在stages屬性下將目標(biāo) stage 置為false。該操作會(huì)阻止函數(shù)被埋點(diǎn)如果函數(shù)已埋點(diǎn)還會(huì)解除已有埋點(diǎn)org: my-org app: my-app stages: prod: observability: false注意如果已經(jīng)建立了針對(duì)一個(gè)或多個(gè) AWS 賬戶(hù)的 Observability Integration仍需到 Serverless Framework Dashboard 中把這些 Integration 手動(dòng)刪除。關(guān)閉 Trace 采樣采樣默認(rèn)自動(dòng)進(jìn)行、按函數(shù)獨(dú)立計(jì)量在函數(shù)月調(diào)用量達(dá)到約 1-2 百萬(wàn)次或出現(xiàn)突發(fā)流量時(shí)觸發(fā)。若要關(guān)閉在serverless.yml中設(shè)置環(huán)境變量SLS_DISABLE_TRACE_SAMPLINGprovider: environment: SLS_DISABLE_TRACE_SAMPLING也可以在該屬性上對(duì)單個(gè)函數(shù)設(shè)置environment實(shí)現(xiàn)函數(shù)級(jí)粒度。關(guān)閉 AWS SDK Span 采集SDK 默認(rèn)會(huì) instrument AWS SDK 調(diào)用從而在 Trace 中可視化函數(shù)對(duì) DynamoDB、S3 等服務(wù)的訪問(wèn)及各自耗時(shí)。若不需要這類(lèi) Span設(shè)置provider: environment: SLS_DISABLE_AWS_SDK_MONITORING: true關(guān)閉 HTTP Span 采集同理函數(shù)發(fā)起的 HTTP(s) 外部請(qǐng)求會(huì)被采集為 Span含會(huì)話(huà)時(shí)長(zhǎng)。如需關(guān)閉provider: environment: SLS_DISABLE_HTTP_MONITORING: true以上三個(gè)環(huán)境變量都可以在provider.environment全局設(shè)置也可以下沉到單個(gè)函數(shù)的environment屬性做細(xì)粒度控制。常見(jiàn)問(wèn)題速查來(lái)自官方排障 Runbook當(dāng) Metrics/Traces 缺失或部分函數(shù)沒(méi)有數(shù)據(jù)時(shí)troubleshoot 文檔 提供了一份有序排障清單核心檢查項(xiàng)包括先產(chǎn)生調(diào)用集成完成且函數(shù)標(biāo)記為 Instrumented 之后才產(chǎn)生的調(diào)用才會(huì)有數(shù)據(jù)集成前的調(diào)用不會(huì)回填。等 10 分鐘移除后立即重建的集成需等最長(zhǎng) 20 分鐘。確認(rèn)函數(shù) Instrument 開(kāi)關(guān)已打開(kāi)在 Settings Integrations Edit 中核對(duì)。確認(rèn) CloudFormation Stack 存在且位于 us-east-1Stack 名形如Serverless-Inc-Role-Stack。核對(duì)兩類(lèi)常見(jiàn)埋點(diǎn)錯(cuò)誤Rate Limit Exceeded該函數(shù)已掛滿(mǎn) 2 個(gè) CloudWatch Logs 訂閱上限需先移除一個(gè)訂閱再在 Dashboard 中關(guān)閉并重新打開(kāi) Instrument 開(kāi)關(guān)記得點(diǎn) SaveCode uncompressed size is greater than the max allowed size函數(shù)代碼 Layer 未壓縮體積超限SDK 體積約 600KB通常需精簡(jiǎn)自身依賴(lài)。手動(dòng)核查埋點(diǎn)三要素Layer 是否掛載sls-sdk-node-*/sls-sdk-python-*、AWS_LAMBDA_EXEC_WRAPPER是否指向正確路徑、SLS_ORG_ID等必需環(huán)境變量是否齊全——文檔特別提到 Sentry 等工具會(huì)爭(zhēng)搶AWS_LAMBDA_EXEC_WRAPPER導(dǎo)致沖突。開(kāi)啟 SDK 調(diào)試設(shè)置SLS_SDK_DEBUGtrue后調(diào)用函數(shù)CloudWatch 日志中若出現(xiàn)SDK: Wrapper initialization說(shuō)明 SDK 初始化成功問(wèn)題更可能出在外部工具覆蓋或平臺(tái)攝取側(cè)。人工確認(rèn)遙測(cè)負(fù)載正確埋點(diǎn)的函數(shù)會(huì)在 CloudWatch Logs 輸出以SERVERLESS_TELEMETRY開(kāi)頭的壓縮負(fù)載若沒(méi)有該行日志說(shuō)明埋點(diǎn)鏈路未走通。小結(jié)Serverless Framework 的 Monitoring Observability 通過(guò) IAM Role 集成 Kinesis Firehose 日志管道 Lambda Layer 包裝器 三件套把跨賬戶(hù)的 Metrics/Traces/Logs/Errors 聚合到 Dashboard且明確不存儲(chǔ)原始日志、可按 stage 與環(huán)境變量精細(xì)控制開(kāi)啟范圍與采樣行為。配置面記住三處即可stages.stage.observability部署時(shí)按 stage 決定埋點(diǎn)、SLS_DISABLE_TRACE_SAMPLING關(guān)閉采樣、SLS_DISABLE_AWS_SDK_MONITORING/SLS_DISABLE_HTTP_MONITORING關(guān)閉對(duì)應(yīng) Span 采集排障時(shí)優(yōu)先核對(duì) Instrument 開(kāi)關(guān)、Serverless-Inc-Role-Stackus-east-1、AWS_LAMBDA_EXEC_WRAPPER與SERVERLESS_TELEMETRY日志這四項(xiàng)。更多細(xì)節(jié)可繼續(xù)閱讀 Metrics 視圖、Trace Explorer 與 排障 Runbook 三篇文檔?!久赓M(fèi)下載鏈接】serverless? Serverless Framework – Effortlessly build apps that auto-scale, incur zero costs when idle, and require minimal maintenance using AWS Lambda and other managed cloud services.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/se/serverless創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考