package telemetry import ( "context" "log" "net/http" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/jaeger" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.21.0" ) // newJaegerExporter creates a new Jaeger exporter. func newJaegerExporter() (sdktrace.SpanExporter, error) { return jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint("http://localhost:14268/api/traces"))) } // NewTracerProvider creates a new tracer provider. func NewTracerProvider(exp sdktrace.SpanExporter) *sdktrace.TracerProvider { res := resource.NewWithAttributes( semconv.SchemaURL, semconv.ServiceName("gralias"), semconv.ServiceVersion("v0.1.0"), ) tracerProvider := sdktrace.NewTracerProvider( sdktrace.WithSampler(sdktrace.AlwaysSample()), sdktrace.WithResource(res), sdktrace.WithBatcher(exp), ) return tracerProvider } // OtelMiddleware wraps the provided http.Handler with OpenTelemetry tracing. func OtelMiddleware(handler http.Handler) http.Handler { return otelhttp.NewHandler(handler, "http.server") } func InitTracer() func() { exp, err := newJaegerExporter() if err != nil { log.Fatalf("failed to create exporter: %v", err) } tp := NewTracerProvider(exp) otel.SetTracerProvider(tp) return func() { if err := tp.Shutdown(context.Background()); err != nil { log.Printf("Error shutting down tracer provider: %v", err) } if err := exp.Shutdown(context.Background()); err != nil { log.Printf("Error shutting down exporter: %v", err) } } }