Skip to main content
Volg eerst de installatiegids wanneer u een nieuwe applicatie aan AppSignal toevoegt. Zorg er vervolgens voor dat u de AppSignal collector installeert voordat u verdergaat.

OpenTelemetry configureren in uw applicatie

OpenTelemetry moet worden geïnitialiseerd voordat uw applicatie start, om ervoor te zorgen dat alle telemetriegegevens via de exporter naar AppSignal worden verzonden. In een webapplicatie moet OpenTelemetry bijvoorbeeld worden geïnitialiseerd voordat de routes worden geladen en de server start. Maak een functie initOpenTelemetry() zoals in het onderstaande voorbeeld en voeg deze toe aan het main-bestand van uw applicatie. Werk de onderstaande waarden bij met de naam, omgeving en push API-sleutel van uw AppSignal-applicatie, en vervang het exporter-endpoint indien nodig door het adres van uw AppSignal collector.
package main

import (
	// Import these standard libraries used in the OpenTelemetry configuration
	"context"
	"log"
	"os"
	"os/exec"
	"strings"

	// Import these OpenTelemetry libraries
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/attribute"
	"go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp"
	"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp"
	"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
	"go.opentelemetry.io/otel/log/global"
	"go.opentelemetry.io/otel/propagation"
	sdklog "go.opentelemetry.io/otel/sdk/log"
	sdkmetric "go.opentelemetry.io/otel/sdk/metric"
	sdkresource "go.opentelemetry.io/otel/sdk/resource"
	sdktrace "go.opentelemetry.io/otel/sdk/trace"
)

func initOpenTelemetry() func() {
	// Replace these values with your AppSignal application name, environment
	// and push API key. These are used by the resource attributes configuration below.
	name := "My app"
	push_api_key := "0000-0000-0000-0000"
	environment := "development"

	// Set the name of the service that is being monitored. A common choice is the
	// name of the framework used. This is used to group traces and metrics in AppSignal.
	service_name := "My service name"

	// Replace `localhost:8099` with the address of your AppSignal collector
	// if it's running on another host.
	endpoint := "localhost:8099"

	hostname, err := os.Hostname()
	if err != nil {
		hostname = "unknown"
	}

	var revision string
	cmd := exec.Command("git", "rev-parse", "--short", "HEAD")
	output, err := cmd.Output()
	if err != nil {
		revision = "unknown"
	} else {
		revision = strings.TrimSpace(string(output))
	}

	resource, err := sdkresource.Merge(
		sdkresource.Default(),
		sdkresource.NewSchemaless(
			attribute.String("appsignal.config.name", name),
			attribute.String("appsignal.config.environment", environment),
			attribute.String("appsignal.config.push_api_key", push_api_key),
			attribute.String("appsignal.config.revision", revision),
			attribute.String("appsignal.config.language_integration", "go"),
			attribute.String("appsignal.config.app_path", os.Getenv("PWD")),
			attribute.String("service.name", service_name),
			attribute.String("host.name", hostname),
		),
	)
	if err != nil {
		log.Fatalf("Error creating OTLP resource: %v", err)
	}

	// Tracing
	traceClient := otlptracehttp.NewClient(
		otlptracehttp.WithInsecure(), // Remove if the collector is accessible via HTTPS
		otlptracehttp.WithEndpoint(endpoint),
	)

	traceExporter, err := otlptrace.New(context.Background(), traceClient)
	if err != nil {
		log.Fatalf("Error creating OTLP trace exporter: %v", err)
	}

	tracerProvider := sdktrace.NewTracerProvider(
		sdktrace.WithBatcher(traceExporter),
		sdktrace.WithResource(resource),
	)

	otel.SetTracerProvider(tracerProvider)
	otel.SetTextMapPropagator(
		propagation.NewCompositeTextMapPropagator(
			propagation.TraceContext{},
			propagation.Baggage{},
		),
	)

	// Metrics
	metricExporter, err := otlpmetrichttp.New(
		context.Background(),
		otlpmetrichttp.WithInsecure(), // Remove if the collector is accessible via HTTPS
		otlpmetrichttp.WithEndpoint(endpoint),
	)
	if err != nil {
		log.Fatalf("creating OTLP metric exporter: %v", err)
	}

	meterProvider := sdkmetric.NewMeterProvider(
		sdkmetric.WithReader(sdkmetric.NewPeriodicReader(metricExporter)),
		sdkmetric.WithResource(resource),
	)
	otel.SetMeterProvider(meterProvider)

	// Logs
	logExporter, err := otlploghttp.New(
		context.Background(),
		otlploghttp.WithInsecure(), // Remove if the collector is accessible via HTTPS
		otlploghttp.WithEndpoint(endpoint),
	)
	if err != nil {
		log.Fatalf("creating OTLP log exporter: %v", err)
	}

	loggerProvider := sdklog.NewLoggerProvider(
		sdklog.WithResource(resource),
		sdklog.WithProcessor(
			sdklog.NewBatchProcessor(logExporter),
		),
	)
	global.SetLoggerProvider(loggerProvider)

	// Cleanup
	return func() {
		ctx := context.Background()
		if err := tracerProvider.Shutdown(ctx); err != nil {
			log.Println("Error shutting down tracer provider:", err)
		}
		if err := meterProvider.Shutdown(ctx); err != nil {
			log.Println("Error shutting down meter provider:", err)
		}
		if err := loggerProvider.Shutdown(ctx); err != nil {
			log.Println("Error shutting down logger provider:", err)
		}
	}
}

func main() {
	cleanup := initOpenTelemetry()
	defer cleanup()

	// ... your application's initialization code
}
Als uw collector toegankelijk is via HTTPS, verwijder dan de drie regels die de methode-aanroep WithInsecure() bevatten in het voorbeeld. Voer dit commando uit om de OpenTelemetry-bibliotheken te installeren die in het bovenstaande voorbeeld worden geïmporteerd.
go mod tidy

OpenTelemetry-instrumentatiepakketten configureren

De OpenTelemetry-stack stuurt zelf geen gegevens. Om uw applicatie te instrumenteren, installeert en configureert u de instrumentatiepakketten voor de bibliotheken en frameworks die uw applicatie gebruikt. U kunt OpenTelemetry-instrumentatiepakketten vinden in het OpenTelemetry-register. Voor enkele populaire OpenTelemetry-instrumentaties vindt u specifieke configuratie-instructies op deze pagina’s:

Test de app!

Nu alle componenten verbonden zijn, start u uw app en test u of u gegevens ziet binnenkomen in AppSignal. Bekijk in het bijzonder de pagina’s “Errors > Issue list” en “Performance > Traces”. Als u na het volgen van onze installatie-instructies nog steeds geen gegevens ziet in AppSignal, laat het ons weten en wij helpen u om uw OpenTelemetry-installatie af te ronden!

Instrumentatiepakketten toevoegen

De volgende stap is om Go-pakketten zoals Gin-gonic, Gorilla, enzovoort, te instrumenteren. Dit levert veel meer gegevens op om de prestaties van uw applicaties echt te kunnen analyseren. De stappen voor elk pakket zijn doorgaans als volgt:
  • Installeer het OpenTelemetry-instrumentatiepakket voor de bibliotheek die u wilt instrumenteren.
  • Volg de installatie-instructies voor het instrumentatiepakket.
Voor meer installatie- en configuratie-informatie per bibliotheek, raadpleeg de sectie Go-instrumentaties.