Go e OpenTelemetry

Questa pagina è destinata agli sviluppatori di applicazioni che vogliono raccogliere dati di Cloud Trace per le applicazioni Go utilizzando OpenTelemetry. OpenTelemetry è un framework di strumentazione indipendente dal fornitore che puoi utilizzare per raccogliere dati di tracce e metriche. Per informazioni sulla strumentazione del codice, consulta Strumentazione e osservabilità.

Questa pagina ti guida nei seguenti passaggi:

  • Installa i pacchetti OpenTelemetry.
  • Configura la tua applicazione per esportare intervalli in Cloud Trace.
  • Configura la tua piattaforma.

Per informazioni sulla release, consulta quanto segue:

Per i contenuti di riferimento di OpenTelemetry, consulta quanto segue:

Per i dettagli più recenti su OpenTelemetry per Go, oltre a documentazione aggiuntiva ed esempi, vedi OpenTelemetry.

Prima di iniziare

Attiva l'API richiesta.

Abilita l'API

Installazione, inizializzazione e utilizzo del client

Consulta le istruzioni seguenti per instrumentare le tue applicazioni Go su Compute Engine e Google Kubernetes Engine. Per un esempio generale di utilizzo di OpenTelemetry, consulta il repository GitHub di OpenTelemetry per Go.

Compute Engine

Installa il pacchetto OpenTelemetry:

go get go.opentelemetry.io/otel
go get github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace

Importa i pacchetti di esportazione OpenTelemetry e Cloud Trace:

import (
	"context"
	"errors"
	"log"
	"os"

	texporter "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace"
	"go.opentelemetry.io/contrib/detectors/gcp"
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/sdk/resource"
	sdktrace "go.opentelemetry.io/otel/sdk/trace"
	semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
)

Crea l'utilità di esportazione e il fornitore di traccia:

func main() {
	// Create exporter.
	ctx := context.Background()
	projectID := os.Getenv("GOOGLE_CLOUD_PROJECT")
	exporter, err := texporter.New(texporter.WithProjectID(projectID))
	if err != nil {
		log.Fatalf("texporter.New: %v", err)
	}

	// Identify your application using resource detection
	res, err := resource.New(ctx,
		// Use the GCP resource detector to detect information about the GCP platform
		resource.WithDetectors(gcp.NewDetector()),
		// Keep the default detectors
		resource.WithTelemetrySDK(),
		// Add your own custom attributes to identify your application
		resource.WithAttributes(
			semconv.ServiceNameKey.String("my-application"),
		),
	)
	if errors.Is(err, resource.ErrPartialResource) || errors.Is(err, resource.ErrSchemaURLConflict) {
		log.Println(err)
	} else if err != nil {
		log.Fatalf("resource.New: %v", err)
	}

	// Create trace provider with the exporter.
	//
	// By default it uses AlwaysSample() which samples all traces.
	// In a production environment or high QPS setup please use
	// probabilistic sampling.
	// Example:
	//   tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.TraceIDRatioBased(0.0001)), ...)
	tp := sdktrace.NewTracerProvider(
		sdktrace.WithBatcher(exporter),
		sdktrace.WithResource(res),
	)
	defer tp.Shutdown(ctx) // flushes any pending spans, and closes connections.
	otel.SetTracerProvider(tp)

	// Create custom span.
	tracer := otel.GetTracerProvider().Tracer("example.com/trace")
	err = func(ctx context.Context) error {
		ctx, span := tracer.Start(ctx, "foo")
		defer span.End()

		// Do some work.

		return nil
	}(ctx)
}

Quando crei l'esportatore, fornisci informazioni sull'identificatore del progetto Google Cloud. In questo esempio, l'identificatore è archiviato nella variabile di ambiente GOOGLE_CLOUD_PROJECT.

L'applicazione di esempio chiama la funzione WithBatcher per configurare il provider di traccia per inviare intervalli a Cloud Monitoring utilizzando un processo in background. L'esempio è anche configurato in modo da chiamare la funzione Shutdown dell'esportatore all'uscita dell'applicazione. Quando Shutdown viene eseguito, invia tutti gli intervalli in attesa a Cloud Monitoring. La configurazione mostrata nell'esempio è l'implementazione consigliata per tutti gli ambienti operativi, incluso Cloud Run, in cui i container possono essere arresi in qualsiasi momento.

Quando crei l'istanza Tracer, le fornisci un nome. Nell'esempio il nome è example.com/trace. Ti consigliamo di assegnare a queste istanze un nome in base al componente da tracciare, in quanto questa strategia consente di avere più istanze.

Quando viene eseguito l'esempio, viene creata una singola traccia denominata foo.

GKE

Aggiungi il seguente codice a Dockerfile:

RUN go get go.opentelemetry.io/otel
RUN go get github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace

Importa i pacchetti di esportazione OpenTelemetry e Cloud Trace:

import (
	"context"
	"errors"
	"log"
	"os"

	texporter "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace"
	"go.opentelemetry.io/contrib/detectors/gcp"
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/sdk/resource"
	sdktrace "go.opentelemetry.io/otel/sdk/trace"
	semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
)

Crea l'utilità di esportazione e il fornitore di traccia:

func main() {
	// Create exporter.
	ctx := context.Background()
	projectID := os.Getenv("GOOGLE_CLOUD_PROJECT")
	exporter, err := texporter.New(texporter.WithProjectID(projectID))
	if err != nil {
		log.Fatalf("texporter.New: %v", err)
	}

	// Identify your application using resource detection
	res, err := resource.New(ctx,
		// Use the GCP resource detector to detect information about the GCP platform
		resource.WithDetectors(gcp.NewDetector()),
		// Keep the default detectors
		resource.WithTelemetrySDK(),
		// Add your own custom attributes to identify your application
		resource.WithAttributes(
			semconv.ServiceNameKey.String("my-application"),
		),
	)
	if errors.Is(err, resource.ErrPartialResource) || errors.Is(err, resource.ErrSchemaURLConflict) {
		log.Println(err)
	} else if err != nil {
		log.Fatalf("resource.New: %v", err)
	}

	// Create trace provider with the exporter.
	//
	// By default it uses AlwaysSample() which samples all traces.
	// In a production environment or high QPS setup please use
	// probabilistic sampling.
	// Example:
	//   tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.TraceIDRatioBased(0.0001)), ...)
	tp := sdktrace.NewTracerProvider(
		sdktrace.WithBatcher(exporter),
		sdktrace.WithResource(res),
	)
	defer tp.Shutdown(ctx) // flushes any pending spans, and closes connections.
	otel.SetTracerProvider(tp)

	// Create custom span.
	tracer := otel.GetTracerProvider().Tracer("example.com/trace")
	err = func(ctx context.Context) error {
		ctx, span := tracer.Start(ctx, "foo")
		defer span.End()

		// Do some work.

		return nil
	}(ctx)
}

Quando crei l'esportatore, fornisci informazioni sull'identificatore del progetto Google Cloud. In questo esempio, l'identificatore è archiviato nella variabile di ambiente GOOGLE_CLOUD_PROJECT.

L'applicazione di esempio chiama la funzione WithBatcher per configurare il provider di traccia per inviare intervalli a Cloud Monitoring utilizzando un processo in background. L'esempio è anche configurato in modo da chiamare la funzione Shutdown dell'esportatore all'uscita dell'applicazione. Quando Shutdown viene eseguito, invia tutti gli intervalli in attesa a Cloud Monitoring. La configurazione mostrata nell'esempio è l'implementazione consigliata per tutti gli ambienti operativi, incluso Cloud Run, in cui i container possono essere arresi in qualsiasi momento.

Quando crei l'istanza Tracer, le fornisci un nome. Nell'esempio il nome è example.com/trace. Ti consigliamo di assegnare a queste istanze un nome in base al componente da tracciare, in quanto questa strategia consente di avere più istanze.

Quando viene eseguito l'esempio, viene creata una singola traccia denominata foo.

Come creare un intervallo personalizzato

Puoi aggiungere ulteriori informazioni alla traccia creata dal sistema creando un intervallo personalizzato.

Per creare un intervallo personalizzato con il nome foo, aggiungi quanto segue al codice sorgente:

// Create custom span.
tracer := otel.GetTracerProvider().Tracer("example.com/trace")
err = func(ctx context.Context) error {
	ctx, span := tracer.Start(ctx, "foo")
	defer span.End()

	// Do some work.

	return nil
}(ctx)

In questo caso, example.com/trace si riferisce al nome dell'istanza del rilevatore.

Configura la tua piattaforma

Puoi utilizzare Cloud Trace su Google Cloud e altre piattaforme.

In esecuzione su Google Cloud

Quando l'applicazione è in esecuzione su Google Cloud, non è necessario fornire credenziali di autenticazione sotto forma di account di servizio alla libreria client. Tuttavia, devi assicurarti che per la tua piattaforma Google Cloud sia abilitato l'ambito di accesso all'API Cloud Trace.

Per un elenco degli ambienti Google Cloud supportati, consulta Assistenza per l'ambiente.

Per le seguenti configurazioni, le impostazioni predefinite dell'ambito dell'accesso abilitano l'Cloud Trace API:

Se utilizzi ambiti di accesso personalizzati, devi assicurarti che l'ambito di accesso all'API Cloud Trace sia abilitato:

  • Per informazioni su come configurare gli ambiti di accesso per il tuo ambiente utilizzando la console Google Cloud, consulta Configurazione del progetto Google Cloud.

  • Per gli utenti gcloud, specifica gli ambiti di accesso utilizzando il flag --scopes e includi l'ambito di accesso all'Cloud Trace API trace.append. Ad esempio, per creare un cluster GKE con solo l&#39Cloud Trace APIe abilitata, segui questi passaggi:

    gcloud container clusters create example-cluster-name --scopes=https://www.googleapis.com/auth/trace.append

Esecuzione in locale e altrove

Se la tua applicazione è in esecuzione al di fuori di Google Cloud, devi fornire le credenziali di autenticazione alla libreria client sotto forma di account di servizio. L'account di servizio deve contenere il ruolo di agente Cloud Trace. Per le istruzioni, consulta la sezione Creazione di un account di servizio.

Le librerie client di Google Cloud utilizzano Credenziali predefinite dell'applicazione (ADC) per trovare le credenziali della tua applicazione.

Puoi fornire queste credenziali in uno dei tre modi seguenti:

  • Esegui gcloud auth application-default login

  • Inserisci l'account di servizio in un percorso predefinito per il tuo sistema operativo. Di seguito sono elencati i percorsi predefiniti per Windows e Linux:

    • Windows: %APPDATA%/gcloud/application_default_credentials.json

    • Linux: $HOME/.config/gcloud/application_default_credentials.json

  • Imposta la variabile di ambiente GOOGLE_APPLICATION_CREDENTIALS sul percorso del tuo account di servizio:

Linux/macOS

    export GOOGLE_APPLICATION_CREDENTIALS=path-to-your-service-accounts-private-key

Windows

    set GOOGLE_APPLICATION_CREDENTIALS=path-to-your-service-accounts-private-key

PowerShell:

    $env:GOOGLE_APPLICATION_CREDENTIALS="path-to-your-service-accounts-private-key"

Visualizza tracce

Nella console Google Cloud, vai alla pagina Esplora tracce.

Vai a Trace Explorer

Puoi trovare questa pagina anche utilizzando la barra di ricerca.

Risoluzione dei problemi

Per informazioni sulla risoluzione dei problemi relativi a Cloud Trace, vai alla pagina Risoluzione dei problemi.