Recursos

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.

Recursos devem ser adicionados a um TracerProvider, MeterProvider e LoggerProvider durante a sua inicialização, e são criados de maneira semelhante aos atributos:

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

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

Observe o uso do pacote semconv para fornecer nomes convencionais para os atributos do recurso. Isso ajuda a garantir que os consumidores da telemetria produzida utilizando as convenções semânticas possam identificar facilmente os atributos relevantes e entender seu significado.

Os recursos também podem ser detectados automaticamente por meio das implementações de resource.Detector. Esses Detectors podem descobrir informações sobre o processo em execução, o sistema operacional em que ele está sendo executado, o provedor de nuvem que hospeda a instância do sistema operacional ou qualquer número de outros atributos de recurso.

res, err := resource.New(
	context.Background(),
	resource.WithFromEnv(),      // Descobre e fornece atributos das variáveis de ambiente OTEL_RESOURCE_ATTRIBUTES e OTEL_SERVICE_NAME.
	resource.WithTelemetrySDK(), // Descobre e fornece informações sobre o SDK do OpenTelemetry que está sendo utilizado.
	resource.WithProcess(),      // Descobre e fornece informações do processo.
	resource.WithOS(),           // Descobre e fornece informações do Sistema Operacional.
	resource.WithContainer(),    // Descobre e fornece informações do contêiner.
	resource.WithHost(),         // Descobre e fornece informações da hospedagem.
	resource.WithAttributes(attribute.String("foo", "bar")), // Adicionar atributos de recurso personalizados.
	// resource.WithDetectors(thirdparty.Detector{}), // Inclua a sua própria implementação externa do Detector.
)
if errors.Is(err, resource.ErrPartialResource) || errors.Is(err, resource.ErrSchemaURLConflict) {
	log.Println(err) // Registre problemas não-fatais.
} else if err != nil {
	log.Fatalln(err) // O erro pode ser fatal.
}