请求级别指标帮助您更好地洞察每一次函数调用,掌握函数执行情况。您可以基于请求指标快速发现并定位问题,分析应用瓶颈。开启请求级别指标,您将能够更好地管理和优化您的函数应用。
什么是请求级别指标
请求级别指标是函数请求级别的执行状态汇总。开启请求级别指标后,系统会收集函数每次执行的指标信息,包括性能指标、异常指标及追踪指标,并将这些指标信息投递到您在日志配置时选择的日志仓库中。
性能指标:内存使用情况、函数执行时间、初始化时间及冷启动信息等。
异常指标:是否执行失败、错误详情等。
追踪指标:系统关键链路执行耗时、集成的链路追踪是否采样以及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
更多创建自定义仪表盘的信息,请参见创建仪表盘。