packagemainimport("context""fmt""log""go.opentelemetry.io/otel""go.opentelemetry.io/otel/attribute""go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc""go.opentelemetry.io/otel/sdk/resource"sdktrace"go.opentelemetry.io/otel/sdk/trace"semconv"go.opentelemetry.io/otel/semconv/v1.26.0""go.opentelemetry.io/otel/trace")constserviceName="go.traces.hello-world-otlp-grpc"vartracer=otel.Tracer(serviceName)funcconfigureExporter(ctxcontext.Context)(sdktrace.SpanExporter,error){returnotlptracegrpc.New(ctx,otlptracegrpc.WithInsecure(),otlptracegrpc.WithEndpoint("localhost:4317"))}funcnewTraceProvider(expsdktrace.SpanExporter)*sdktrace.TracerProvider{// Ensure default SDK resources and the required service name are set.r,err:=resource.Merge(resource.Default(),resource.NewWithAttributes(semconv.SchemaURL,semconv.ServiceName(serviceName),),)iferr!=nil{panic(err)}returnsdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample()),sdktrace.WithBatcher(exp),sdktrace.WithResource(r),)}funcmain(){ctx:=context.Background()exp,err:=configureExporter(ctx)iferr!=nil{log.Fatalf("failed to initialize exporter: %v",err)}// Create a new tracer provider with a batch span processor and the given exporter.tp:=newTraceProvider(exp)// Handle shutdown properly so nothing leaks.deferfunc(){_=tp.Shutdown(ctx)}()otel.SetTracerProvider(tp)// Finally, set the tracer that can be used for this package.tracer=tp.Tracer(serviceName)// Starts a span with an attribute_,span:=tracer.Start(ctx,"HelloWorldSpanGrpc",trace.WithAttributes(attribute.String("foo","grpc")))deferspan.End()fmt.Println("Hello world Example")}