How to Use Distributed Tracing in Go (OpenTelemetry, Jaeger)

Implement distributed tracing in Go by initializing the OpenTelemetry SDK with an OTLP exporter configured to send spans to a Jaeger collector.

Distributed tracing in Go is implemented by instrumenting your code with the OpenTelemetry SDK to generate spans that are exported to a Jaeger collector.

package main

import (
	"context"
	"log"
	"os"

	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
	"go.opentelemetry.io/otel/sdk/resource"
	"go.opentelemetry.io/otel/sdk/trace"
	semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
)

func main() {
	ctx := context.Background()

	// Create OTLP exporter to send traces to Jaeger
	exporter, err := otlptracehttp.New(ctx)
	if err != nil {
		log.Fatalf("failed to create exporter: %v", err)
	}

	// Create resource with service name
	res, err := resource.New(ctx,
		resource.WithAttributes(semconv.ServiceName(os.Getenv("SERVICE_NAME"))),
	)
	if err != nil {
		log.Fatalf("failed to create resource: %v", err)
	}

	// Create tracer provider
	tp := trace.NewTracerProvider(
		trace.WithBatcher(exporter),
		trace.WithResource(res),
	)
	defer func() { _ = tp.Shutdown(ctx) }()

	otel.SetTracerProvider(tp)
	tracer := tp.Tracer("my-service")

	// Start a span
	ctx, span := tracer.Start(ctx, "request-handler")
	defer span.End()

	// Your business logic here
	log.Println("Handling request...")
}
  1. Install the OpenTelemetry Go SDK and OTLP exporter: go get go.opentelemetry.io/otel go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp go.opentelemetry.io/otel/sdk/trace.
  2. Set the OTEL_EXPORTER_OTLP_ENDPOINT environment variable to your Jaeger collector URL (e.g., http://localhost:4318) or configure the exporter directly as shown.
  3. Initialize the tracer provider with the exporter and resource, then set it as the global provider using otel.SetTracerProvider(tp).
  4. Create a tracer instance with tp.Tracer("service-name") and start spans using tracer.Start(ctx, "span-name") around your business logic.