资源

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

在您的可观测性后端,您可以使用资源信息更好地调查有趣的现象。例如,如果您的跟踪或指标数据表明系统中存在延迟,您可以将其缩小到特定的容器、Pod 或 Kubernetes 部署。

资源检测

PHP SDK 从多种来源检测资源,默认情况下将使用所有可用的资源探测器

  • 环境变量 (OTEL_RESOURCE_ATTRIBUTES, OTEL_SERVICE_NAME)
  • 主机信息
  • 主机操作系统
  • 当前进程
  • 运行时

禁用资源检测

默认情况下,所有 SDK 资源探测器都将被使用,但您可以使用环境变量 OTEL_PHP_DETECTORS 来仅启用某些探测器,或完全禁用它们

  • env
  • host
  • os
  • process
  • process_runtime
  • sdk
  • sdk_provided
  • all - 启用所有资源探测器
  • none - 禁用资源检测

例如,仅启用 envhostsdk 探测器

env OTEL_PHP_DETECTORS=env,host,sdk \
php example.php

自定义资源探测器

通用平台或供应商特定环境的资源探测器可以作为 composer 包安装。

例如,要安装并启用 container 资源探测器

composer require open-telemetry/detector-container
env OTEL_PHP_RESOURCE_DETECTORS=container \
php example.php

请注意,已安装的探测器会自动包含在默认的 all 资源探测器列表中。

使用环境变量添加资源

如果 SDK 没有您需要的资源探测器,您可以通过 OTEL_RESOURCE_ATTRIBUTES 环境变量添加任意资源,该变量由 env 探测器解释。此变量接受逗号分隔的键值对列表,例如

env OTEL_RESOURCE_ATTRIBUTES="service.name=my_service,service.namespace=demo,service.version=1.0,deployment.environment=development" \
php example.php

在代码中添加资源

自定义资源也可以在您的代码中进行配置。在此,默认资源(如上所述检测到的)与自定义资源合并。然后将资源传递给追踪器提供程序,它们将与所有生成的 Span 相关联。

$resource = ResourceInfoFactory::defaultResource()->merge(ResourceInfo::create(Attributes::create([
    ResourceAttributes::SERVICE_NAMESPACE => 'foo',
    ResourceAttributes::SERVICE_NAME => 'bar',
    ResourceAttributes::SERVICE_INSTANCE_ID => 1,
    ResourceAttributes::SERVICE_VERSION => '0.1',
    ResourceAttributes::DEPLOYMENT_ENVIRONMENT_NAME => 'development',
])));

$tracerProvider =  new TracerProvider(
    new SimpleSpanProcessor(
        (new ConsoleSpanExporterFactory())->create()
    ),
    null,
    $resource
);

最后修改于 2025 年 6 月 2 日: 修复 #7026 (#7027) (86cff3e5)