Resources(资源)

介绍

资源以资源属性的形式表示产生遥测数据的实体。例如, 进程 产生的遥测数据运行在 Kubernetes 的容器中,那么它会具有 进程 的名称、Pod 名称、命名空间,可能还有部署名称。这四个属性都可以包含在资源中。

在你的可观测性后端中,你可以使用资源信息来更好地调查异常行为。例如, 如果你的追踪或指标数据表明系统中存在延迟,你可以将问题定位到特定的容器、Pod 或 Kubernetes 部署上。

如果你使用 Jaeger 作为可观测性后端, 资源属性会被归类显示在 Process(进程) 标签页下:

来自 Jaeger 的截图,展示了与某个 trace 关联的资源属性

资源在初始化时被添加到 TracerProviderMetricProvider 中, 并且这一绑定在创建之后无法更改。一旦资源被设置, 通过该 Provider 创建的所有 TracerMeter 所生成的 span 与 metric 都会自动关联此资源信息。

带默认值的语义属性

OpenTelemetry SDK 提供了一些默认的资源属性。其中之一是 service.name, 它表示服务的逻辑名称。默认情况下,SDK 会为该属性设置值为 unknown_service, 因此建议你显式设置该值,可以通过代码设定,或设置环境变量 OTEL_SERVICE_NAME 来实现。

此外,SDK 还会自动提供以下属性用于标识自身:

  • telemetry.sdk.name
  • telemetry.sdk.language
  • telemetry.sdk.version

资源探测器(Resource Detectors)

大多数语言特定的 SDK 提供了一套资源探测器(Resource Detectors), 可用于从环境中自动检测资源信息。常见的资源探测器包括:

自定义资源属性

你也可以自定义资源属性。可以通过代码提供,或者通过设置环境变量 OTEL_RESOURCE_ATTRIBUTES 来传入。

如果适用,建议参考资源属性的语义约定

例如,你可以通过设置 deployment.environment.name 来指明部署环境的名称:

env OTEL_RESOURCE_ATTRIBUTES=deployment.environment.name=production yourApp