OpenTelemetry is a standard for tracing, metrics, and logging in distributed systems.
1import (2 "go.opentelemetry.io/otel"3 "go.opentelemetry.io/otel/trace"4 "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"5 "go.opentelemetry.io/otel/sdk/trace"6)78func initTracer() (*trace.TracerProvider, error) {9 exporter, err := otlptracegrpc.New(10 context.Background(),11 otlptracegrpc.WithEndpoint("localhost:4317"),12 )13 if err != nil {14 return nil, err15 }1617 tp := trace.NewTracerProvider(18 trace.WithBatcher(exporter),19 trace.WithSampler(trace.AlwaysSample()),20 )2122 otel.SetTracerProvider(tp)23 return tp, nil24}2526// Creating a span27func handleRequest(ctx context.Context) error {28 ctx, span := otel.Tracer("my-service").Start(ctx, "handleRequest")29 defer span.End()3031 // Adding attributes32 span.SetAttributes(33 attribute.String("http.method", "GET"),34 attribute.String("http.url", "/api/users"),35 )3637 // Child span38 ctx, dbSpan := otel.Tracer("db").Start(ctx, "query")39 result, err := db.QueryContext(ctx, "SELECT * FROM users")40 dbSpan.End()4142 if err != nil {43 span.RecordError(err)44 span.SetStatus(codes.Error, err.Error())45 }4647 return err48}4950// Automatic HTTP tracing51import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"5253handler := otelhttp.NewHandler(mux, "server")54log.Fatal(http.ListenAndServe(":8080", handler))
Features: