Recursos

Um recurso representa a entidade que está gerando telemetria como atributos do recurso. Por exemplo, um processo que está gerando telemetria e que está sendo executado em um container no Kubernetes tem o nome de um processo, um nome de pod, um namespace e possivelmente um nome de deployment. Todos esses quatro atributos podem ser incluídos em um recurso.

No seu backend de observabilidade, você pode usar as informações de um recurso para refinar a investigação de comportamentos relevantes. Por exemplo, se seus dados de rastros ou métricas indicarem latência no seu sistema, você pode restringir a investigação para um determinado container, pod ou deployment do Kubernetes.

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.
}