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...")
}
- 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. - Set the
OTEL_EXPORTER_OTLP_ENDPOINTenvironment variable to your Jaeger collector URL (e.g.,http://localhost:4318) or configure the exporter directly as shown. - Initialize the tracer provider with the exporter and resource, then set it as the global provider using
otel.SetTracerProvider(tp). - Create a tracer instance with
tp.Tracer("service-name")and start spans usingtracer.Start(ctx, "span-name")around your business logic.