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