import("context""os""time""go.opentelemetry.io/otel""go.opentelemetry.io/otel/exporters/otlp/otlptrace""go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc""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.7.0""go.uber.org/zap""google.golang.org/grpc")vartracerExp*otlptrace.ExporterfuncretryInitTracer()func(){varshutdownfunc()gofunc(){for{// otel will reconnected and re-send spans when otel col recover. so, we don't need to re-init tracer exporter.iftracerExp==nil{shutdown=initTracer()}else{break}time.Sleep(time.Minute*5)}}()returnshutdown}funcinitTracer()func(){// temporarily set timeout to 10sctx,cancel:=context.WithTimeout(context.Background(),10*time.Second)defercancel()serviceName,ok:=os.LookupEnv("OTEL_SERVICE_NAME")if!ok{serviceName="server_name"os.Setenv("OTEL_SERVICE_NAME",serviceName)}otelAgentAddr,ok:=os.LookupEnv("OTEL_EXPORTER_OTLP_ENDPOINT")if!ok{otelAgentAddr="http://localhost:4317"os.Setenv("OTEL_EXPORTER_OTLP_ENDPOINT",otelAgentAddr)}zap.S().Infof("OTLP Trace connect to: %s with service name: %s",otelAgentAddr,serviceName)traceExporter,err:=otlptracegrpc.New(ctx,otlptracegrpc.WithInsecure(),otlptracegrpc.WithDialOption(grpc.WithBlock()))iferr!=nil{handleErr(err,"OTLP Trace gRPC Creation")returnnil}tracerProvider:=sdktrace.NewTracerProvider(sdktrace.WithBatcher(traceExporter),sdktrace.WithSampler(sdktrace.AlwaysSample()),sdktrace.WithResource(resource.NewWithAttributes(semconv.SchemaURL)))otel.SetTracerProvider(tracerProvider)otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{},propagation.Baggage{}))tracerExp=traceExporterreturnfunc(){// Shutdown will flush any remaining spans and shut down the exporter.handleErr(tracerProvider.Shutdown(ctx),"failed to shutdown TracerProvider")}}funchandleErr(errerror,messagestring){iferr!=nil{zap.S().Errorf("%s: %v",message,err)}}
-mux.Handle("/path",h)+mux.Handle("/path",otelhttp.NewHandler(h,"description of path"))----mux.Handle("/path",http.HandlerFunc(f))+mux.Handle("/path",otelhttp.NewHandler(http.HandlerFunc(f),"description of path"))