FaaS Span 的语义约定

状态: 开发中

本文档定义了如何使用 Span 来描述无服务器函数(也称为无服务器函数或 FaaS)的运行实例。

另请参阅 有关仪器化 AWS Lambda 的附加说明

通用属性

Span 的 name 应设置为正在执行的函数名称。根据 faas.trigger 属性的值,必须设置其他属性。例如,http 触发器应遵循 HTTP 服务器语义约定。有关更多信息,请参阅 函数触发器类型 部分。

有关如何记录 Span 状态的详细信息,请参阅 记录错误 文档。

如果生成遵循此约定的 Span,则必须存在类型为 faas 的资源,遵循 资源语义约定

Attributes

Stability需求级别Value Type描述Example Values
cloud.resource_idDevelopment推荐字符串被监控云资源的特定于云提供商的原生标识符(例如,AWS 上的 ARN,Azure 上的 完全限定资源 ID,GCP 上的 完整资源名称)[1]arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function; //run.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/services/SERVICE_ID; /subscriptions/<SUBSCRIPTION_GUID>/resourceGroups/<RG>/providers/Microsoft.Web/sites/<FUNCAPP>/functions/<FUNC>
faas.invocation_idDevelopment推荐字符串当前函数调用的调用 ID。af9d5aa4-a685-4c5f-a22b-444f80b3cc28
faas.triggerDevelopment推荐字符串导致此函数调用的触发器的类型。[2]datasource; http; pubsub

[1] cloud.resource_id 在某些云提供商上,可能无法在启动时确定完整 ID,因此可能需要将 cloud.resource_id 设置为 Span 属性。

cloud.resource_id 的确切值取决于云提供商。如果您设置了此属性,并且它们适用,则必须使用以下已知定义。

  • AWS Lambda: 函数 ARN。请注意不要直接使用“调用 ARN”,而是将任何 别名后缀替换为已解析的函数版本,因为同一个运行时实例可能可以使用多个不同的别名进行调用。
  • GCP: 资源的 URI
  • Azure: 被调用函数的 完全限定资源 ID,而不是函数应用,格式为 /subscriptions/<SUBSCRIPTION_GUID>/resourceGroups/<RG>/providers/Microsoft.Web/sites/<FUNCAPP>/functions/<FUNC>。这意味着必须使用 span 属性,因为 Azure 函数应用可以托管多个通常会共享 TracerProvider 的函数。

[2] faas.trigger 对于入站端的服务器/使用者 Span,必须设置 faas.trigger

调用 FaaS 实例的客户端通常无法设置 faas.trigger,因为它们通常需要检查有效负载以确定事件类型。如果客户端设置了它,它应该与相应入站调用将具有的触发器相同(也就是说,这与用于调用 lambda 的 API 的底层传输无关,后者通常是 HTTP)。


faas.trigger 具有以下已知值列表。如果其中一个适用,则必须使用相应的owel;否则,可以使用自定义值。

描述Stability
datasource对某些数据源操作(如数据库或文件系统读/写)的响应Development
http为响应入站 HTTP 请求而提供答案Development
other如果以上都不适用Development
pubsub设置一个函数,在消息发送到消息系统时执行Development
timer调度函数定期执行Development

函数名称

可以在 2 个位置记录函数的名称:Span 名称和 faas.name 资源属性

如果存在 faas.name 属性,则保证它包含函数名称,因为它是严格为此目的定义的。Span 名称也很可能包含函数名称(例如,用于 Span 显示目的),但不能保证(因为这是一个较弱的“SHOULD”要求)。需要这种保证的消费者可以使用 faas.name 属性作为源。

调用与实例的区别

出于性能原因(例如 AWS lambdaAzure functions),FaaS 提供商会为单个函数实例分配一个执行环境,用于处理多个请求。开发人员利用这一点来解决冷启动问题,在不同的函数调用之间缓存昂贵的资源计算。此外,FaaS 提供商鼓励这种行为,例如 Google functionsfaas.instance 资源属性可以设置,以帮助关联属于同一执行环境的函数调用。Span 属性 faas.invocation_id资源属性 faas.instance 的区别如下:

  • faas.invocation_id 指的是当前函数调用的 ID;
  • faas.instance 指的是函数的执行环境 ID。

入站调用

本节描述 FaaS 实例自身报告的入站 FaaS 调用。

入站 FaaS Span 属性

状态: 开发中

此 Span 代表 FaaS 调用的服务器(入站)端。

Span kind 应为 SERVER

**Span 状态**应遵循 记录错误文档。

Attributes

Stability需求级别Value Type描述Example Values
faas.triggerDevelopment必需字符串导致此函数调用的触发器的类型。[1]datasource; http; pubsub
faas.coldstartDevelopment推荐布尔值一个布尔值,如果无服务器函数是第一次执行(又名冷启动),则为 true。

[1] faas.trigger 对于入站端的服务器/使用者 Span,必须设置 faas.trigger

调用 FaaS 实例的客户端通常无法设置 faas.trigger,因为它们通常需要检查有效负载以确定事件类型。如果客户端设置了它,它应该与相应入站调用将具有的触发器相同(也就是说,这与用于调用 lambda 的 API 的底层传输无关,后者通常是 HTTP)。


faas.trigger 具有以下已知值列表。如果其中一个适用,则必须使用相应的owel;否则,可以使用自定义值。

描述Stability
datasource对某些数据源操作(如数据库或文件系统读/写)的响应Development
http为响应入站 HTTP 请求而提供答案Development
other如果以上都不适用Development
pubsub设置一个函数,在消息发送到消息系统时执行Development
timer调度函数定期执行Development

作为入站 FaaS Span 属性的资源属性

除了上面列出的属性之外,任何 FaaS 资源属性也可以设置为入站 FaaS 调用 Span 的 Span 属性:在某些 FaaS 环境中,某些资源属性所需的信息仅在调用上下文中易于获取(例如,作为“请求上下文”参数的一部分),并且虽然通常可以通过单独的 API 调用来查找资源信息,但由于冷启动持续时间问题,它可能非常昂贵。AWS 上的 cloud.resource_idcloud.account.id 属性就是一些例子。原则上,上述考虑因素适用于满足上述标准的任何资源属性(即,没有额外努力就无法轻松获得的,而这种努力可能很昂贵)。

出站调用

本节描述调用 FaaS 实例的客户端报告的出站 FaaS 调用。

状态: 开发中

此 Span 代表对 FaaS 服务的出站调用。

客户端为下面列出的属性报告的值应等于被调用 FaaS 实例自身报告的相应 FaaS 资源属性云资源属性(如果它已仪器化)。

**Span 类型**应为 CLIENT

**Span 状态**应遵循 记录错误文档。

Attributes

Stability需求级别Value Type描述Example Values
faas.invoked_nameDevelopment必需字符串被调用函数的名称。[1]my-function
faas.invoked_providerDevelopment必需字符串被调用函数的云提供商。[2]alibaba_cloud; aws; azure
faas.invoked_regionDevelopment有条件地必需 [3]字符串被调用函数的云区域。[4]eu-central-1

[1] faas.invoked_name 应等于被调用函数的 faas.name 资源属性。

[2] faas.invoked_provider 应等于被调用函数的 cloud.provider 资源属性。

[3] faas.invoked_region 对于某些云提供商,如 AWS 或 GCP,函数所在的区域对于唯一标识函数至关重要,并且也是其端点的一部分。由于它是被调用端点的一部分,客户端始终知道该区域。在这些情况下,必须相应地设置 faas.invoked_region。如果客户端不知道区域或区域不是唯一标识被调用函数所必需的,则设置 faas.invoked_region 是可选的。

[4] faas.invoked_region 应等于被调用函数的 cloud.region 资源属性。


faas.invoked_provider 具有以下已知的列表值。如果其中一个适用,则必须使用相应的价值;否则,可以使用自定义价值。

描述Stability
alibaba_cloud阿里云Development
awsAmazon Web ServicesDevelopment
azureMicrosoft AzureDevelopment
gcpGoogle Cloud PlatformDevelopment
tencent_cloud腾讯云Development

函数触发器类型

本节描述如何根据 faas.trigger 属性的值来处理 Span 的创建和附加属性。

数据源

状态: 开发中

此 Span 代表 FaaS 调用由数据库或文件系统读/写等数据源操作触发的服务器端。

Span kind 应为 SERVER

**Span 状态**应遵循 记录错误文档。

Attributes

Stability需求级别Value Type描述Example Values
faas.document.collectionDevelopment必需字符串在触发操作的源上执行的操作的名称。例如,在 Cloud Storage 或 S3 中对应于存储桶名称,在 Cosmos DB 中对应于数据库名称。myBucketName; myDbName
faas.document.operationDevelopment必需字符串描述了对数据执行的操作的类型。insert; edit; delete
faas.document.nameDevelopment推荐字符串进行操作的文档名称/表。例如,在 Cloud Storage 或 S3 中是文件的名称,在 Cosmos DB 中是表名。myFile.txt; myTableName
faas.document.timeDevelopment推荐字符串一个字符串,包含数据访问时间的 ISO 8601 格式(以 UTC 表示)。2020-01-23T13:47:06Z

faas.document.operation 具有以下已知列表值。如果其中一个适用,则必须使用相应的价值;否则,可以使用自定义价值。

描述Stability
delete删除对象时。Development
edit修改对象时。Development
insert创建新对象时。Development

HTTP

函数负责响应入站 HTTP 请求。faas Span 应遵循 HTTP Server 语义约定 中描述的建议。

PubSub

当消息发送到消息系统时,函数会被设置为执行。在这种情况下,多个消息可能会被批量处理并一次性转发到同一个函数调用。因此,对于函数处理的每条消息,都必须创建一个不同类型的 faas 根 Span,遵循 消息系统语义约定。这样,就可以将每条消息与其调用发送者相关联。

定时器

函数被安排定期执行。建议使用以下附加属性。

状态: 开发中

此 Span 代表 FaaS 调用由定时器触发的服务器端。

Span kind 应为 SERVER

**Span 状态**应遵循 记录错误文档。

Attributes

Stability需求级别Value Type描述Example Values
faas.cronDevelopment推荐字符串一个包含计划周期的字符串,使用 Cron Expression 格式。0/5 * * * ? *
faas.timeDevelopment推荐字符串一个包含函数调用时间的字符串,使用 ISO 8601 格式(以 UTC 表示)。2020-01-23T13:47:06Z

其他

FaaS 提供了如此大的灵活性,以至于不可能完全用语义约定来覆盖。当一个函数不满足上述任何情况时,Span 必须将属性 faas.trigger 设置为 "other"。在这种情况下,由框架或仪器库来定义最合适的属性。

示例

此示例显示了托管在 Google Cloud Platform 上的(非 FaaS)进程的 FaaS 属性(Span A,Kind 为 CLIENT),该进程调用 Amazon Web Services 中的名为“my-lambda-function”的 Lambda 函数(Span B,Kind 为 SERVER)。

属性类型属性Span A (客户端, GCP)Span B (服务器, AWS Lambda)
Resourcecloud.provider"gcp""aws"
Resourcecloud.region"europe-west3""eu-central-1"
Spanfaas.invoked_name"my-lambda-function"不适用
Spanfaas.invoked_provider"aws"不适用
Spanfaas.invoked_region"eu-central-1"不适用
Spanfaas.trigger不适用"http"
Spanfaas.invocation_id不适用"af9d5aa4-a685-4c5f-a22b-444f80b3cc28"
Spanfaas.coldstart不适用true
Resourcefaas.name不适用"my-lambda-function"
Resourcefaas.version不适用"semver:2.0.0"
Resourcefaas.instance不适用"my-lambda-function:instance-0001"
Resourcecloud.resource_id不适用"arn:aws:lambda:us-west-2:123456789012:function:my-lambda-function"