請求級別指標幫助您更好地洞察每一次函數調用,掌握函數執行情況。您可以基于請求指標快速發現并定位問題,分析應用瓶頸。開啟請求級別指標,您將能夠更好地管理和優化您的函數應用。
什么是請求級別指標
請求級別指標是函數請求級別的執行狀態匯總。開啟請求級別指標后,系統會收集函數每次執行的指標信息,包括性能指標、異常指標及追蹤指標,并將這些指標信息投遞到您在日志配置時選擇的日志倉庫中。
性能指標:內存使用情況、函數執行時間、初始化時間及冷啟動信息等。
異常指標:是否執行失敗、錯誤詳情等。
追蹤指標:系統關鍵鏈路執行耗時、集成的鏈路追蹤是否采樣以及HTTP函數的Path、狀態碼和客戶端IP等。
開啟請求級別指標后,函數計算會將每次請求的執行指標投遞到您的日志庫中,具體形式如下。
使用場景
基于請求指標查看函數執行詳情、性能指標及錯誤信息等。
控制臺基于請求級別指標提供請求列表,您可以通過該界面查看每個請求的詳細信息,包含請求執行情況、請求對應的實例ID、執行耗時、占用內存和請求日志等信息。如下圖所示。
說明不開啟請求級別指標也可以查看請求列表,但是請求列表在以下場景可能不準確。
多個相同RequestId反復出現時,無法定位指定請求的日志,多見于異步調用的重試場景。
Custom Runtime與Custom Container運行時中如果打印了
FC Invoke Start RequestId: xxx
與FC Invoke End RequestId: xxx
,會出現一次調用在請求列表中出現兩次的情況。
基于請求指標進行自定義搜索,創建自定義大盤。
請求指標以
key:val
的形式投遞到您的日志庫中,您可以基于業務訴求創建自定義儀表盤。具體操作,請參見創建儀表盤。
注意事項
生效范圍
請求級別指標日志是服務的配置項,開啟后對服務下的所有函數生效,每個函數的每次執行都會記錄一條日志。
費用
日志投遞到日志服務中,會產生一定的日志存儲費用。關于日志服務定價,請參見產品定價。
開啟請求級別指標
通過控制臺開啟請求級別指標
前提條件
操作步驟
- 登錄函數計算控制臺,在左側導航欄,單擊服務及函數。
- 在頂部菜單欄,選擇地域,然后在服務列表頁面,單擊目標服務操作列的配置。
在編輯服務頁面的日志配置區域,按需設置以下配置項,然后單擊保存。
主要配置項說明如下,其余配置項保持默認值即可。
配置項
說明
示例值
日志功能
是否支持將函數調用執行的日志存儲至日志服務SLS。關于日志功能的詳細信息,請參見配置日志。
啟用
日志項目
選擇已配置的日志項目。
aliyun-fc-hangzhou-2238f0df-a742-524f-9f90-976ba*******
日志庫
選擇已配置的日志庫。
function-log
請求級別指標
是否查看請求級別指標。啟用后,函數每次調用執行的指標信息將被收集,并被投遞到您在日志配置時選擇的Logstore。
啟用
通過ServerlessDevs工具開啟請求級別指標
前提條件
操作步驟
創建代碼目錄,目錄結構如下所示。
. ├── code │ └── index.js └── s.yaml
s.yaml文件示例如下。
示例中字段enableRequestMetrics用于配置請求級別指標功能,開啟請求級別指標前需先開啟日志功能,并設置logstore和project為您賬號下已存在的日志項目和日志庫。
edition: 1.0.0 name: hello-world-app access: "default" vars: region: "cn-hangzhou" service: name: "hello-world-service" description: 'hello world by serverless devs' logConfig: # logstore和project需按照實際修改,您也可以使用logConfig:auto,自動創建project和logstore project: 'your-project' logstore: 'your-logstore' enableRequestMetrics: true # 請求級別指標開關,開啟后系統會收集函數每次執行的指標信息 enableInstanceMetrics: true role: 'acs:ram::<accountID>:role/aliyunfcdefaultrole' # 請將<accountID>替換為您的阿里云賬號ID services: helloworld: component: fc props: region: ${vars.region} service: ${vars.service} function: name: "hello-world" description: 'hello world by serverless devs' runtime: nodejs14 codeUri: ./code handler: index.handler memorySize: 128 timeout: 60
執行以下命令部署應用。
sudo s deploy -y
執行成功后,您可以登錄函數計算控制臺查看已部署函數所屬服務的請求級別指標功能已經啟用。
日志查詢
日志格式
請求級別指標日志主題遵循以下格式:FCRequestMetrics:serviceName/functionName
。您可以在日志服務中通過查詢條件 __topic__: "FCRequestMetrics:serviceName/functionName"
篩選出所有請求級別指標日志。更多信息,請參見查詢和分析日志。
指標字段
請求級別指標會記錄以下信息。
指標名稱 | 描述 | 示例值 | 是否每次調用都會記錄 |
serviceName | 服務名稱。 | my-service | 是 |
functionName | 函數名稱。 | my-function | 是 |
versionId | 版本名稱。 | 12 | 是 |
qualifier | 服務別名。默認為LATEST。 | prod | 是 |
requestId | 請求ID。 | db72ce53-ccbe-4216-af55-642622e01494 | 是 |
operation | 操作名稱。 | InvokeFunction | 是 |
invocationType | 調用類型,包含以下兩種。 Sync:同步調用 Async:異步調用 | Sync | 是 |
memoryMB | 函數的內存上限。 | 512 | 是 |
memoryUsageMB | 函數執行消耗的內存。 | 410 | 是 |
durationMs | 請求執行時間。 | 20.20 | 是 |
isColdStart | 是否為冷啟動。 說明 當請求抵達函數計算時,函數計算系統沒有已經啟動的函數實例執行請求,需要重新創建實例、下載代碼、啟動執行環境。 請求生命周期內經歷了完整的創建實例、下載代碼、啟動執行環境過程的請求我們稱之為冷啟動請求。 函數計算平臺對冷啟動做了很多優化,為避免冷啟動,平臺會提前創建實例,請求抵達函數計算平臺后創建實例過程中,可能會等到一個已經創建好的實例,這種請求我們不稱之為冷啟動請求。 | false | 是 |
instanceEvent | 實例事件。目前只有ColdStart,在冷啟動請求時記錄。 | ColdStart | 否 |
hasFunctionError | 函數執行是否出現函數錯誤。 | false | 是 |
errorType | 函數錯誤類型,包含以下三種:
| FunctionUnhandledError | 否。僅在函數執行出現錯誤即 |
invokeFunctionLatencyMs | 函數執行時間。 | 99.00 | 是。每次都會記錄。 |
traceContext | 鏈路追蹤上下文信息。 | 371d3ff242fcee9:371d3ff242fcee9:0:1 | 否。僅當配置鏈路追蹤時記錄。 |
isSampled | 請求是否被鏈路追蹤采樣。 | true | 否。僅當配置鏈路追蹤時記錄。 |
resourceMode | 執行請求的實例類型。取值如下:
| OnDemand | 是 |
instanceID | 實例ID。 | c-65603d8c-37e1bf7123054a77**** | 是 |
hostname | 實例Host。 | c-65603d8c-37e1bf7123054a77**** | 是 |
ipAddress | 實例IP地址。 說明:此IP為實例內部IP,用于區分不同實例,不是實例公網IP地址。 | 21.0.XX.XX | 是 |
activeInstances | 活躍實例數。 | 1 | 是 |
activeInstancesPerFunction | 當前函數活躍實例數。 | 1 | 是 |
scheduleLatencyMs | 調度耗時。請求冷啟動時,調度延時相對比較長。 | 10.07 | 是 |
coldStartStartTimestamp | 冷啟動開始時間戳。 | 1700806029167 | 否。僅當發生冷啟動時有記錄。 |
coldStartLatencyMs | 冷啟動耗時。 | 487.65 | 否。僅當發生冷啟動時有記錄。 |
prepareCodeStartTimestamp | 下載代碼開始時間戳。13位時間戳,精確到毫秒。 | 1700806029167 | 否。僅當發生冷啟動時有記錄。 |
prepareCodeLatencyMs | 下載代碼耗時。 | 0.18 | 否。僅當發生冷啟動時有記錄。 |
runtimeInitializationStartTimestamp | 運行時初始化開始時間戳。 | 1700806029168 | 否。僅當發生冷啟動時有記錄。 |
runtimeInitializationMs | 運行時初始化耗時。 | 487.37 | 否。僅當發生冷啟動時有記錄。 |
asyncAttemptStartTimestamp | 異步調用函數執行失敗默認重試3次 此參數為第${retryCount}次重試的開始時間戳。 | 1700806028084 | 否。僅當異步調用時有記錄。 |
asyncAttemptLatencyMs | 異步調用函數執行失敗默認重試3次 此參數為第${retryCount}次重試的開始時間戳。 | 1688.74 | 否。僅當異步調用時有記錄。 |
asyncMode | 異步調用模式。取值說明如下:
| Stateful | 否。僅當異步調用時有記錄。 |
retryCount | 重試次數。 | 0 | 否。僅當異步調用時有記錄。 |
檢索日志
檢索日志需要配上索引,函數計算控制臺會自動幫您配置索引。配置索引后,您可以在日志服務控制臺對應的日志庫中使用SQL語句來進行請求檢索和請求篩選。您可以通過指定topic來限制查找范圍為請求級別指標日志。
例如,您需要查詢執行時間超過10s的請求列表,可以使用以下SQL語句。
__topic__: "FCRequestMetrics:s1/f1" AND qualifier: q1 and operation: InvokeFunction and durationMs>1000
更多復雜的查詢語法,請參見查詢和分析日志。
制作自定義大盤
如果您想制作橫坐標為t,縱坐標為指標值的圖標,可以參考以下SQL語句。
__topic__: "FCRequestMetrics:s1/f1" AND qualifier: q1 and operation: InvokeFunction | select __time__ - __time__ % 60 as t, count(*) as invocations, avg(durationMs) as avgDurationMs group by t order by t
更多創建自定義儀表盤的信息,請參見創建儀表盤。