Go

Instrument your Go app using openTelemetry and export traces to Aspecto's collector.

Install OpenTelemetry SDK

go get go.opentelemetry.io/otel@v1.0.0 \
go.opentelemetry.io/otel/sdk@v1.0.0 \
go.opentelemetry.io/otel/trace@v1.0.0 \
go.opentelemetry.io/otel/sdk/resource \
go.opentelemetry.io/otel/propagation \
go.opentelemetry.io/otel/semconv/v1.4.0 \
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp@v1.0.0

Initialize OpenTelemetry

add to your main.go file the following imports

import (
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
	"go.opentelemetry.io/otel/propagation"
	"go.opentelemetry.io/otel/sdk/resource"
	sdktrace "go.opentelemetry.io/otel/sdk/trace"
	semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
)

and then in your main function add the following code

	ctx := context.Background()
	traceExporter, err := otlptracehttp.New(ctx,
		otlptracehttp.WithEndpoint("otelcol.aspecto.io"),
		otlptracehttp.WithHeaders(map[string]string{"Authorization": "<YOUR ASPECTO TOKEN HERE>"}))

	if err != nil {
		log.Fatal(err)
	}

	res, err := resource.New(ctx,
		resource.WithAttributes(
			semconv.ServiceNameKey.String("<YOUR SERVICE NAME>"),
		),
	)

	if err != nil {
		log.Fatal(err)
	}

	tp := sdktrace.NewTracerProvider(
		sdktrace.WithSampler(sdktrace.AlwaysSample()),
		sdktrace.WithResource(res),
		sdktrace.WithBatcher(traceExporter))
	otel.SetTracerProvider(tp)
	otel.SetTextMapPropagator(propagation.TraceContext{})

Auto Instrumentation

Go has support for a few popular libraries including net/http go-redis and mongo-driver

net/http

go get go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp

you will need to wrap each http handler with otelHandler see an example below

handler := func(w http.ResponseWriter, req *http.Request) {
	//your handler code
}

http.Handle("/hello", otelhttp.NewHandler(http.HandlerFunc(handler), "Handler"))

go-redis

go get github.com/go-redis/redis/extra/redisotel/v8

then add the following code to your redis client initialization code

import (
    "github.com/go-redis/redis/v8"
    "github.com/go-redis/redis/extra/redisotel"
)

rdb := rdb.NewClient(&rdb.Options{...})

rdb.AddHook(redisotel.NewTracingHook())

mongo-driver

go get go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo

then add the following code to your mongo client initialization code

	opts := options.Client()
	opts.Monitor = otelmongo.NewMonitor()

You can find the full list of instrumentations here

Last updated