资源语义约定

状态: 混合

本文档定义了资源的标准属性。这些属性通常用于 Resource,并且也建议在任何需要一致地描述资源的地方使用。这些属性中的大部分继承自 OpenCensus Resource standard

待办事项

  • 添加更多计算单元:AppEngine 单元等。
  • 添加 Web 浏览器。
  • 决定是否只使用小写字符串。
  • 考虑为每个属性和属性组合添加可选/必需(例如,当提供 k8s 资源时,所有 k8s 可能都是必需的)。

文档约定

状态: 稳定

属性按它们描述的概念类型进行逻辑分组。同一组中的属性具有以点结尾的公共前缀。例如,所有描述 Kubernetes 属性的属性都以“k8s.”开头。

有关何时应包含属性的详细信息,请参阅 Attribute Requirement Levels

特殊处理的属性

状态: 稳定

鉴于其重要性,某些资源属性将按如下方式进行特殊处理。

具有专用环境变量的语义属性

这些是可以通过专用环境变量配置的属性,如 OpenTelemetry Environment Variable Specification 中所述。

具有 SDK 提供默认值的语义属性

这些是必须由 SDK 提供的属性,如 Resource SDK specification 中所述。

服务

状态: 混合

类型: service

描述: 服务实例。

Attributes

Stability需求级别Value Type描述Example Values
service.nameStable必需字符串服务的逻辑名称。[1]shoppingcart
service.instance.idDevelopment推荐字符串服务实例的字符串 ID。[2]627cc493-f310-47de-96bd-71410b7dec09
service.namespaceDevelopment推荐字符串service.name 的命名空间。[3]Shop
service.versionStable推荐字符串服务 API 或实现的字符串版本。格式不由这些约定定义。2.0.0; a01dbef8a

[1] service.name 对于水平缩放的服务的​​所有实例,它必须相同。如果未指定该值,SDK 必须回退到 unknown_service: 加上 process.executable.name,例如 unknown_service:bash。如果 process.executable.name 不可用,则该值必须设置为 unknown_service

[2] service.instance.id 对于同一 service.namespace,service.name 对的每个实例,它必须是唯一的(换句话说,service.namespace,service.name,service.instance.id 三元组必须是全局唯一的)。该 ID 有助于区分同一时间存在的同一服务的实例(例如,水平缩放服务的实例)。

建议实现(例如 SDK)生成随机的 V1 或 V4 RFC 4122 UUID,但如果稳定性是可取的,可以自由使用固有的唯一 ID 作为此值的来源。在这种情况下,ID 应该用作 UUID V5 的来源,并应使用以下 UUID 作为命名空间:4d63009a-8d0f-11ee-aad7-4c796ed8e320

通常建议使用 UUID,因为只需要一个不透明的值来识别服务实例。与 /etc/machine-id 文件手册页中可以看到的类似,底层数据(如 pod 名称和命名空间)应被视为机密,用户可以选择是否通过另一个资源属性公开它。

对于在应用程序服务器(如 unicorn)后面运行的应用程序,我们不建议为参与应用程序的所有进程使用单个标识符。相反,建议每个分区(例如 unicorn 中的工作线程)拥有自己的 instance.id。

不建议 Collector 设置 service.instance.id,如果它无法明确确定生成该遥测数据的服务实例。例如,基于 pod.name 创建 UUID 可能会出错,因为 Collector 可能不知道遥测数据来自该 pod 中的哪个容器。但是,Collector 如果能够明确确定该遥测数据的服务实例,则可以设置 service.instance.id。这通常是抓取接收器的情况,因为它们知道目标地址和端口。

[3] service.namespace: 一个字符串值,其含义有助于区分服务组,例如拥有服务组的团队名称。在同一命名空间内,service.name 应该具有唯一性。如果在 Resource 中未指定 service.namespace,则 service.name 应该对于所有没有明确定义命名空间的服务是唯一的(因此空/未指定的命名空间只是另一个有效的命名空间)。零长度命名空间字符串假定等于未指定的命名空间。

注意:service.namespaceservice.name 无意串联起来以形成服务单一的全局唯一名称。例如,以下 2 组属性实际上描述了 2 个不同的服务(尽管串联会产生相同的字符串)

# Resource attributes that describes a service.
namespace = Company.Shop
service.name = shoppingcart
# Another set of resource attributes that describe a different service.
namespace = Company
service.name = Shop.shoppingcart

遥测 SDK

状态: 稳定

类型: telemetry.sdk

描述: 用于捕获由检测库捕获的数据的遥测 SDK。

Attributes

Stability需求级别Value Type描述Example Values
telemetry.sdk.languageStable必需字符串遥测 SDK 的语言。cpp; dotnet; erlang
telemetry.sdk.nameStable必需字符串如上定义的遥测 SDK 名称。[1]opentelemetry
telemetry.sdk.versionStable必需字符串遥测 SDK 的版本字符串。1.2.3

[1] telemetry.sdk.name OpenTelemetry SDK 必须将 telemetry.sdk.name 属性设置为 opentelemetry。如果使用另一个 SDK,例如分叉或供应商提供的实现,则此 SDK 必须将 telemetry.sdk.name 属性设置为该 SDK 主入口点的完全限定类或模块名,或根据语言的其他合适标识符。标识符 opentelemetry 是保留的,在此情况下不得使用。所有自定义标识符在不同版本实现之间都应保持稳定。


telemetry.sdk.language 具有以下一组已知的(well-known)值。如果其中一个适用,则必须使用相应的值;否则,可以自由使用自定义值。

描述Stability
cppcppStable
dotnetdotnetStable
erlangerlangStable
gogoStable
javajavaStable
nodejsnodejsStable
phpphpStable
pythonpythonStable
rubyrubyStable
rustrustStable
swiftswiftStable
webjswebjsStable

遥测分发版

状态: 开发中

类型: telemetry.distro

描述: 用于捕获由检测库捕获的数据的遥测 SDK 的分发版。

Attributes

Stability需求级别Value Type描述Example Values
telemetry.distro.nameDevelopment推荐字符串自动仪器化代理或分发版的名称(如果使用)。[1]parts-unlimited-java
telemetry.distro.versionDevelopment推荐字符串自动仪器化代理或分发版的版本字符串(如果使用)。1.2.3

[1] telemetry.distro.name: 官方的自动仪器化代理和分发版应将 telemetry.distro.name 属性设置为以 opentelemetry- 开头的字符串,例如 opentelemetry-java-instrumentation

计算单元

状态: 开发中

定义计算单元的属性(例如,容器、进程、函数即服务)

计算实例

状态: 开发中

定义计算实例的属性(例如,主机)

环境

状态: 开发中

定义运行环境的属性(例如,操作系统、云、数据中心、部署服务)

版本属性

状态: 稳定

版本属性,例如 service.version,是 string 类型的值。它们用于标识工件的精确版本。这可能是一个语义版本,例如 1.2.3,git 哈希,例如 8ae73a,或任意版本字符串,例如 0.1.2.20210101,无论是在构建工件时使用的什么。

特定于云提供商的属性

状态: 开发中

仅适用于特定云提供商资源的属性。目前,这些资源只能为在 Cloud 中以及下文中列为有效 cloud.provider 的提供商定义。特定于提供商的属性都位于 cloud-provider 目录中。有效的云提供商是: