How do I add tracing with OpenTelemetry in Go?

OpenTelemetry is a set of APIs, libraries, agents, and instrumentation to provide observability for applications. Adding tracing to a Go application with OpenTelemetry is relatively straightforward. Below is a step-by-step example of how to set it up.

OpenTelemetry, Go, tracing, observability, API, libraries, instrumentation
This content provides a guide on how to implement OpenTelemetry for tracing in Go applications, enhancing observability and performance monitoring.
package main

import (
    "context"
    "log"

    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/sdk/resource"
    "go.opentelemetry.io/otel/trace"
    "go.opentelemetry.io/otel/sdk/tracesdk"
    tracepropagation "go.opentelemetry.io/otel/propagation"
)

func main() {
    // Initialize OpenTelemetry
    tracerProvider := tracesdk.NewTracerProvider(
        tracesdk.WithResource(resource.NewWithAttributes()),
    )
    otel.SetTracerProvider(tracerProvider)
    
    tracer := otel.Tracer("example.com/hello")

    ctx, span := tracer.Start(context.Background(), "main")
    defer span.End()

    // Your application logic here
    exampleFunction(ctx)
}

func exampleFunction(ctx context.Context) {
    _, span := otel.Tracer("example.com/hello").Start(ctx, "exampleFunction")
    defer span.End()

    // Simulate some work
    log.Println("Doing some work in exampleFunction...")
}
    

OpenTelemetry Go tracing observability API libraries instrumentation