Go Integration

Instrument your Go applications with OpenTelemetry

Installation

go get go.opentelemetry.io/otel
go get go.opentelemetry.io/otel/sdk
go get go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
go get go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp

Setup Tracing

package main

import (
    "context"
    "log"
    "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.21.0"
)

func initTracer() (*trace.TracerProvider, error) {
    ctx := context.Background()
    
    exporter, err := otlptracehttp.New(ctx,
        otlptracehttp.WithEndpoint("api.qorrelate.io"),
        otlptracehttp.WithURLPath("/v1/otlp/v1/traces"),
        otlptracehttp.WithHeaders(map[string]string{
            "X-API-Key": os.Getenv("QORRELATE_API_KEY"),
        }),
    )
    if err != nil {
        return nil, err
    }

    tp := trace.NewTracerProvider(
        trace.WithBatcher(exporter),
        trace.WithResource(resource.NewWithAttributes(
            semconv.SchemaURL,
            semconv.ServiceName("my-go-service"),
            semconv.DeploymentEnvironment("production"),
        )),
    )
    otel.SetTracerProvider(tp)
    return tp, nil
}

HTTP Server Instrumentation

package main

import (
    "net/http"
    "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
)

func main() {
    tp, _ := initTracer()
    defer tp.Shutdown(context.Background())

    // Wrap your handler with otelhttp
    handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello, World!"))
    })

    http.Handle("/", otelhttp.NewHandler(handler, "hello"))
    http.ListenAndServe(":8080", nil)
}

Gin Framework

package main

import (
    "github.com/gin-gonic/gin"
    "go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
)

func main() {
    tp, _ := initTracer()
    defer tp.Shutdown(context.Background())

    r := gin.New()
    r.Use(otelgin.Middleware("my-gin-service"))

    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{"message": "pong"})
    })

    r.Run(":8080")
}

Manual Spans

import "go.opentelemetry.io/otel"

func processOrder(ctx context.Context, orderID string) error {
    tracer := otel.Tracer("my-service")
    ctx, span := tracer.Start(ctx, "process-order")
    defer span.End()

    span.SetAttributes(
        attribute.String("order.id", orderID),
    )

    // Your business logic here
    return nil
}

Ready to get started?

Sign up for free and start monitoring your Go applications in minutes.

Start Free Trial