Lab 04: Distributed Tracing

Time: 60 minutes | Level: Architect | Docker: golang:1.22-alpine

Overview

OpenTelemetry Go: TracerProvider, Tracer.Start, SpanContext, W3C TraceContext propagation, OTLP gRPC exporter, Prometheus metrics client, and pprof HTTP endpoint.


Step 1: OpenTelemetry SDK Setup

package telemetry

import (
	"context"
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/sdk/resource"
	sdktrace "go.opentelemetry.io/otel/sdk/trace"
	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
	semconv "go.opentelemetry.io/otel/semconv/v1.26.0"
)

func InitTracing(ctx context.Context) (func(), error) {
	// OTLP gRPC exporter
	exporter, err := otlptracegrpc.New(ctx,
		otlptracegrpc.WithEndpoint("otel-collector:4317"),
		otlptracegrpc.WithInsecure(),
	)
	if err != nil {
		return nil, err
	}

	// Resource: service metadata
	res := resource.NewWithAttributes(
		semconv.SchemaURL,
		semconv.ServiceName("my-service"),
		semconv.ServiceVersion("1.0.0"),
		semconv.DeploymentEnvironment("production"),
	)

	// TracerProvider with batching
	tp := sdktrace.NewTracerProvider(
		sdktrace.WithBatcher(exporter),
		sdktrace.WithResource(res),
		sdktrace.WithSampler(sdktrace.ParentBased(
			sdktrace.TraceIDRatioBased(0.1), // 10% sampling
		)),
	)

	otel.SetTracerProvider(tp)

	return func() {
		tp.Shutdown(ctx)
	}, nil
}

Step 2: Creating Spans


Step 3: W3C TraceContext Propagation


Step 4: Prometheus Metrics


Step 5: pprof Integration


Step 6: Structured Logging with slog (Go 1.21+)


Step 7: Baggage Propagation


Step 8: Capstone — Tracing Pattern Demo

📸 Verified Output:


Summary

Feature
OTel API
Notes

Tracer creation

otel.Tracer("name")

Per-package tracer

Span creation

tracer.Start(ctx, name)

Returns new ctx

Attributes

span.SetAttributes(...)

Semantic conventions

Error recording

span.RecordError(err)

Auto stack trace

HTTP propagation

propagator.Extract/Inject

W3C TraceContext

Baggage

baggage.New(members...)

Cross-service kv

Sampling

TraceIDRatioBased(0.1)

10% in production

Prometheus

promauto.New*

Auto-register

Last updated