How to Implement Distributed Tracing in Go with OpenTelemetry

Implement distributed tracing in Go by setting up an OpenTelemetry tracer provider and starting spans to track request flow.

Implement distributed tracing in Go by initializing an OpenTelemetry tracer provider, setting it as global, and creating a tracer for your service.

package main

import (
	"context"
	"log"

	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
	"go.opentelemetry.io/otel/sdk/trace"
)

func main() {
	ctx := context.Background()
	exporter, _ := stdouttrace.New(stdouttrace.WithPrettyPrint())
	provider := trace.NewTracerProvider(trace.WithSyncer(exporter))
	otel.SetTracerProvider(provider)
	defer provider.Shutdown(ctx)

	tracer := otel.Tracer("my-service")
	ctx, span := tracer.Start(ctx, "request-handling")
	defer span.End()
	log.Println("Processing request with tracing")
}
  1. Install the OpenTelemetry SDK and exporter: go get go.opentelemetry.io/otel/sdk/trace go.opentelemetry.io/otel/exporters/stdout/stdouttrace
  2. Create a new tracer provider with your chosen exporter (e.g., stdout or OTLP).
  3. Set the provider globally using otel.SetTracerProvider.
  4. Create a tracer instance with otel.Tracer("service-name").
  5. Start a span in your function using tracer.Start(ctx, "operation-name") and defer span.End().