资源

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

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

在初始化时,资源应被分配给 tracer、meter 和 logger provider,其创建方式与 attributes 类似。

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

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

请注意,我们使用了 semconv 包为资源 attributes 提供 约定名称。这有助于确保使用这些语义约定生成的遥测数据的消费者能够轻松发现相关的 attributes 并理解它们的含义。

资源也可以通过 resource.Detector 实现进行自动检测。这些 Detectors 可能会发现有关当前正在运行的进程、其运行的操作系统、托管该操作系统实例的云提供商,或任何其他资源 attributes 的信息。

res, err := resource.New(
	context.Background(),
	resource.WithFromEnv(),      // Discover and provide attributes from OTEL_RESOURCE_ATTRIBUTES and OTEL_SERVICE_NAME environment variables.
	resource.WithTelemetrySDK(), // Discover and provide information about the OpenTelemetry SDK used.
	resource.WithProcess(),      // Discover and provide process information.
	resource.WithOS(),           // Discover and provide OS information.
	resource.WithContainer(),    // Discover and provide container information.
	resource.WithHost(),         // Discover and provide host information.
	resource.WithAttributes(attribute.String("foo", "bar")), // Add custom resource attributes.
	// resource.WithDetectors(thirdparty.Detector{}), // Bring your own external Detector implementation.
)
if errors.Is(err, resource.ErrPartialResource) || errors.Is(err, resource.ErrSchemaURLConflict) {
	log.Println(err) // Log non-fatal issues.
} else if err != nil {
	log.Fatalln(err) // The error may be fatal.
}

最后修改于 2024 年 5 月 16 日:[Go] 文档日志 (#4463) (12f31f62)