资源

A resource represents the entity producing telemetry as resource attributes. For example, a process producing telemetry that is running in a container on Kubernetes has a process name, a pod name, a namespace, and possibly a deployment name. All four of these attributes can be included in the resource.

In your observability backend, you can use resource information to better investigate interesting behavior. For example, if your trace or metrics data indicate latency in your system, you can narrow it down to a specific container, pod, or Kubernetes deployment.

资源应该在跟踪器提供者初始化时分配,并且与属性的创建方式类似:

resources := resource.NewWithAttributes(
    semconv.SchemaURL,
    semconv.ServiceNameKey.String("myService"),
    semconv.ServiceVersionKey.String("1.0.0"),
    semconv.ServiceInstanceIDKey.String("abcdef12345"),
)

provider := sdktrace.NewTracerProvider(
    ...
    sdktrace.WithResource(resources),
)

注意使用 semconv 包来提供常规名称以用于资源属性。这有助于确保使用这些语义约定生成的遥测的消费者可以轻松发现相关属性并理解其含义。

资源也可以通过 resource.Detector 实现自动检测出来。这些 Detector 可以发现关于当前运行的进程、正在运行的操作系统、托管操作系统实例的云提供商或其他任意数量的其他资源属性的信息。

resources := resource.New(context.Background(),
    resource.WithFromEnv(), // 从 OTEL_RESOURCE_ATTRIBUTES 和 OTEL_SERVICE_NAME 环境变量获取属性
    resource.WithProcess(), // 此选项配置一组发现进程信息的检测器
    resource.WithOS(), // 此选项配置一组发现操作系统信息的检测器
    resource.WithContainer(), // 此选项配置一组发现容器信息的检测器
    resource.WithHost(), // 此选项配置一组发现主机信息的检测器
    resource.WithDetectors(thirdparty.Detector{}), // 使用外部检测器实现
    resource.WithAttributes(attribute.String("foo", "bar")), // 或直接指定资源属性
)
最后修改 December 10, 2023: translate (a4350d6e)