Aggiungi tracce e metriche personalizzate alla tua app

Questo documento descrive come aggiungere il codice per l'osservabilità all'applicazione utilizzando OpenTelemetry. OpenTelemetry fornisce librerie di strumentazione che per generare telemetria per i framework più diffusi. Puoi arricchire i contenuti generati dalla libreria di telemetria aggiungendo una strumentazione personalizzata che misura specifico per l'applicazione.

I principi e i concetti descritti in questo documento possono essere applicati alle app scritte in tutte le lingue supportate da OpenTelemetry. Per saperne di più sulla strumentazione, consulta i seguenti documenti:

Il codice campione, che è la stessa app Go descritta in Genera tracce e metriche con Go, è disponibile in GitHub. Per visualizzare l'anteprima completa, fai clic su Altro, e seleziona Visualizza su GitHub.

Prima di iniziare

Abilita le API Cloud Logging, Cloud Monitoring, and Cloud Trace.

Abilita le API

Crea tracce personalizzate

Per generare tracce personalizzate dalla tua applicazione, aggiungi di strumentazione che crea intervalli di OpenTelemetry. In OpenTelemetry, gli intervalli sono i componenti di base per le tracce.

Per creare un intervallo, segui questi passaggi:

  1. Modifica l'app per acquisire un valore OpenTelemetry Tracer. In OpenTelemetry, un tracciante crea intervalli. Puoi acquisire un localizzatore come mostrato in il seguente codice:

    const scopeName = "github.com/GoogleCloudPlatform/golang-samples/opentelemetry/instrumentation/app/work"
    
    var (
    	meter                = otel.Meter(scopeName)
    	tracer               = otel.Tracer(scopeName)
    	sleepHistogram       metric.Float64Histogram
    	subRequestsHistogram metric.Int64Histogram
    )
    

    Il nome del rilevatore, rappresentato da scopeName, identifica la ambito di strumentazione delle tracce generate.

  2. Utilizza l'istanza tracer per creare gli intervalli. Nel seguente esempio di codice, La funzione computeSubrequests genera un intervallo ogni volta che viene chiamata:

    func computeSubrequests(r *http.Request, subRequests int) error {
    	// Add custom span representing the work done for the subrequests
    	ctx, span := tracer.Start(r.Context(), "subrequests")
    	defer span.End()
    
    	// Make specified number of http requests to the /single endpoint.
    	for i := 0; i < subRequests; i++ {
    		if err := callSingle(ctx); err != nil {
    			return err
    		}
    	}
    	// record number of sub-requests made
    	subRequestsHistogram.Record(ctx, int64(subRequests))
    	return nil
    }
    

    Nell'esempio di codice precedente, l'intervallo generato La funzione computeSubrequests rappresenta il lavoro svolto dall'intera personalizzata. Questo perché il primo passaggio della funzione consiste nell'avviare una nuova intervallo utilizzando tracer.Start e la parola chiave defer prima di span.End() assicura che l'intervallo venga terminato immediatamente prima della chiusura della funzione.

Creare metriche personalizzate

Per generare metriche dalla tua applicazione, aggiungi del codice di strumentazione che registra le misurazioni effettuate durante dell'esecuzione.

Per creare le metriche:

  1. Modifica l'app per acquisire un valore OpenTelemetry Meter. In OpenTelemetry, una strumento consente di accedere agli strumenti di metrica per metriche di registrazione. Puoi acquisire uno strumento di misurazione come mostrato di seguito codice:

    const scopeName = "github.com/GoogleCloudPlatform/golang-samples/opentelemetry/instrumentation/app/work"
    
    var (
    	meter                = otel.Meter(scopeName)
    	tracer               = otel.Tracer(scopeName)
    	sleepHistogram       metric.Float64Histogram
    	subRequestsHistogram metric.Int64Histogram
    )
    

    Il nome dello strumento di misurazione, rappresentato da scopeName, identifica il ambito di strumentazione del traffico generato metriche di valutazione.

  2. Utilizza l'istanza meter per creare strumenti in grado di registrare metriche. Per esempio, nel seguente codice, utilizziamo meter per creare una classe OpenTelemetry Istogramma:

    sleepHistogram, err = meter.Float64Histogram("example.sleep.duration",
    	metric.WithDescription("Sample histogram to measure time spent in sleeping"),
    	metric.WithExplicitBucketBoundaries(0.05, 0.075, 0.1, 0.125, 0.150, 0.2),
    	metric.WithUnit("s"))
    if err != nil {
    	panic(err)
    }

    Questo codice precedente genera un istogramma denominato sleepHistogram.

  3. Utilizza l'istanza sleepHistogram per registrare il tempo di sospensione, ovvero determinato quando viene richiamata la funzione randomSleep:

    func randomSleep(r *http.Request) time.Duration {
    	// simulate the work by sleeping 100 to 200 ms
    	sleepTime := time.Duration(100+rand.Intn(100)) * time.Millisecond
    	time.Sleep(sleepTime)
    
    	hostValue := attribute.String("host.value", r.Host)
    	// custom histogram metric to record time slept in seconds
    	sleepHistogram.Record(r.Context(), sleepTime.Seconds(), metric.WithAttributes(hostValue))
    	return sleepTime
    }
    

    Le metriche registrate da questi strumenti vengono esportate basata sulla configurazione dell'esportatore OpenTelemetry.

Passaggi successivi