64 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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",
 | |
| 		otelhttp.WithSpanNameFormatter(func(operation string, r *http.Request) string {
 | |
| 			return r.URL.Path
 | |
| 		}),
 | |
| 	)
 | |
| }
 | |
| 
 | |
| 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)
 | |
| 		}
 | |
| 	}
 | |
| }
 | 
