diff --git a/client/client.go b/client/client.go index ad5806a..8553313 100644 --- a/client/client.go +++ b/client/client.go @@ -7,11 +7,10 @@ import ( "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel/trace" - "go.opentelemetry.io/otel/trace/embedded" ) // Get makes a traced HTTP GET call. -func Get(ctx context.Context, url string, tracer trace.Tracer) error { +func Get(ctx context.Context, url string, tp trace.TracerProvider) error { req, err := http.NewRequestWithContext(ctx, "GET", url, nil) if err != nil { return err @@ -20,7 +19,7 @@ func Get(ctx context.Context, url string, tracer trace.Tracer) error { client := http.Client{ Transport: otelhttp.NewTransport( http.DefaultTransport, - otelhttp.WithTracerProvider(&tracerProvider{tracer: tracer}), + otelhttp.WithTracerProvider(tp), ), } res, err := client.Do(req) @@ -35,12 +34,3 @@ func Get(ctx context.Context, url string, tracer trace.Tracer) error { return nil } - -type tracerProvider struct { - embedded.TracerProvider - tracer trace.Tracer -} - -func (p *tracerProvider) Tracer(_ string, _ ...trace.TracerOption) trace.Tracer { - return p.tracer -} diff --git a/model/config.go b/model/config.go index 2854c60..27fa2c0 100644 --- a/model/config.go +++ b/model/config.go @@ -86,7 +86,7 @@ func (c *Config) Run() { } func (c *Config) runWorker(instanceName string, stop chan struct{}, done *sync.WaitGroup) { - tracer, shutdown, err := tracing.InitTracer("test-executor", instanceName) + tracerProvider, shutdown, err := tracing.InitTracer("test-executor", instanceName) if err != nil { log.Fatalf("failed to create a tracer: %v", err) } @@ -98,7 +98,7 @@ func (c *Config) runWorker(instanceName string, stop chan struct{}, done *sync.W case <-stop: return default: - c.runTest(tracer) + c.runTest(tracerProvider) } if repeats > 0 { repeats-- @@ -109,11 +109,11 @@ func (c *Config) runWorker(instanceName string, stop chan struct{}, done *sync.W } } -func (c *Config) runTest(tracer trace.Tracer) { +func (c *Config) runTest(tracerProvider trace.TracerProvider) { rootSvc := c.Services[0] inst := rootSvc.instances[0] endpoint := inst.Endpoints[0] - + tracer := tracerProvider.Tracer("otel") // TODO: Need to verify this line of code ctx, rootSpan := tracer.Start( context.Background(), "runTest", @@ -121,7 +121,7 @@ func (c *Config) runTest(tracer trace.Tracer) { ) defer rootSpan.End() - err := endpoint.Call(ctx, tracer) + err := endpoint.Call(ctx, tracerProvider) if err != nil { log.Printf("transaction failed: %v", err) } diff --git a/model/dependencies.go b/model/dependencies.go index c44be08..5fc0c4e 100644 --- a/model/dependencies.go +++ b/model/dependencies.go @@ -42,12 +42,12 @@ func (d *Dependencies) Validate(r *Registry) error { } // Call makes calls to all dependencies. -func (d *Dependencies) Call(ctx context.Context, tracer trace.Tracer) error { +func (d *Dependencies) Call(ctx context.Context, tracerProvider trace.TracerProvider) error { if len(d.Seq) > 0 { - return d.Seq.Call(ctx, tracer) + return d.Seq.Call(ctx, tracerProvider) } if d.Par != nil { - return d.Par.Call(ctx, tracer) + return d.Par.Call(ctx, tracerProvider) } - return d.Service.Call(ctx, tracer) + return d.Service.Call(ctx, tracerProvider) } diff --git a/model/endpoint_instance.go b/model/endpoint_instance.go index a62dcd0..da2c06b 100644 --- a/model/endpoint_instance.go +++ b/model/endpoint_instance.go @@ -26,7 +26,7 @@ func (e *EndpointInstance) ServeHTTP(w http.ResponseWriter, r *http.Request) { // executes the endpoint, calling dependencies if necessary. func (e *EndpointInstance) execute(ctx context.Context) error { if e.Depends != nil { - if err := e.Depends.Call(ctx, e.service.tracing.tracer); err != nil { + if err := e.Depends.Call(ctx, e.service.tracing.tracerProvider); err != nil { return err } } @@ -34,7 +34,7 @@ func (e *EndpointInstance) execute(ctx context.Context) error { } // Call makes a call to this endpoint. -func (e *EndpointInstance) Call(ctx context.Context, tracer trace.Tracer) error { +func (e *EndpointInstance) Call(ctx context.Context, tracerProvider trace.TracerProvider) error { url := e.service.server.URL + e.Name - return client.Get(ctx, url, tracer) + return client.Get(ctx, url, tracerProvider) } diff --git a/model/parallel.go b/model/parallel.go index 65fd0e9..066a970 100644 --- a/model/parallel.go +++ b/model/parallel.go @@ -32,14 +32,14 @@ func (p *Parallel) Validate(r *Registry) error { } // Call makes calls to all dependencies. -func (p *Parallel) Call(ctx context.Context, tracer trace.Tracer) error { +func (p *Parallel) Call(ctx context.Context, tracerProvider trace.TracerProvider) error { if p.MaxPar == 0 { - return p.fullParCall(ctx, tracer) + return p.fullParCall(ctx, tracerProvider) } - return p.maxParCall(ctx, tracer) + return p.maxParCall(ctx, tracerProvider) } -func (p *Parallel) fullParCall(ctx context.Context, tracer trace.Tracer) error { +func (p *Parallel) fullParCall(ctx context.Context, tracerProvider trace.TracerProvider) error { // done := &sync.WaitGroup{} // done.Add(len(p.Items)) @@ -54,7 +54,7 @@ func (p *Parallel) fullParCall(ctx context.Context, tracer trace.Tracer) error { return nil } -func (p *Parallel) maxParCall(ctx context.Context, tracer trace.Tracer) error { +func (p *Parallel) maxParCall(ctx context.Context, tracerProvider trace.TracerProvider) error { done := &sync.WaitGroup{} done.Add(len(p.Items)) @@ -70,7 +70,7 @@ func (p *Parallel) maxParCall(ctx context.Context, tracer trace.Tracer) error { for i := 0; i < p.MaxPar; i++ { go func() { for n := range ch { - err := p.Items[n].Call(ctx, tracer) + err := p.Items[n].Call(ctx, tracerProvider) if err != nil { errMutex.Lock() topErrors = append(topErrors, err) diff --git a/model/sequence.go b/model/sequence.go index 524c7eb..b0d8af5 100644 --- a/model/sequence.go +++ b/model/sequence.go @@ -21,9 +21,9 @@ func (s Sequence) Validate(r *Registry) error { } // Call makes calls to all dependencies. -func (s Sequence) Call(ctx context.Context, tracer trace.Tracer) error { +func (s Sequence) Call(ctx context.Context, tracerProvider trace.TracerProvider) error { for _, dep := range s { - if err := dep.Call(ctx, tracer); err != nil { + if err := dep.Call(ctx, tracerProvider); err != nil { return err } } diff --git a/model/service_dep.go b/model/service_dep.go index d4d86cc..aa5dbff 100644 --- a/model/service_dep.go +++ b/model/service_dep.go @@ -37,7 +37,7 @@ func (s *ServiceDep) Validate(r *Registry) error { } // Call makes call to dependency service. -func (s *ServiceDep) Call(ctx context.Context, tracer trace.Tracer) error { +func (s *ServiceDep) Call(ctx context.Context, tracerProvider trace.TracerProvider) error { url := s.service.NextServerURL() + s.endpoint.Name - return client.Get(ctx, url, tracer) + return client.Get(ctx, url, tracerProvider) } diff --git a/model/service_instance.go b/model/service_instance.go index d059a52..1a3e7ac 100644 --- a/model/service_instance.go +++ b/model/service_instance.go @@ -8,7 +8,6 @@ import ( "github.com/yurishkuro/microsim/tracing" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel/trace" - "go.opentelemetry.io/otel/trace/embedded" ) // ServiceInstance represents a single instance of a service. @@ -17,20 +16,20 @@ type ServiceInstance struct { service *Service server *httptest.Server tracing struct { - tracer trace.Tracer - shutdown func() + tracerProvider trace.TracerProvider + shutdown func() } } func startServiceInstance(service *Service, instanceName string) (*ServiceInstance, error) { - tracer, shutdown, err := tracing.InitTracer(service.Name, instanceName) + tracerProvider, shutdown, err := tracing.InitTracer(service.Name, instanceName) if err != nil { return nil, err } inst := &ServiceInstance{ service: service, } - inst.tracing.tracer = tracer + inst.tracing.tracerProvider = tracerProvider inst.tracing.shutdown = shutdown inst.server = httptest.NewServer(inst.mux()) log.Printf("started service instance %s at %s", instanceName, inst.server.URL) @@ -46,7 +45,7 @@ func (inst *ServiceInstance) mux() http.Handler { wrappedHandler := otelhttp.NewHandler( endpointInstance, endpointInstance.Name, - otelhttp.WithTracerProvider(newSingletonTracerProvider(inst.tracing.tracer)), + otelhttp.WithTracerProvider(inst.tracing.tracerProvider), otelhttp.WithSpanNameFormatter(func(_ string, _ *http.Request) string { return endpointInstance.Name }), @@ -62,16 +61,3 @@ func (inst *ServiceInstance) Stop() { inst.tracing.shutdown() log.Printf("stopped service instance %s", inst.service.Name) } - -type singletonTracerProvider struct { - embedded.TracerProvider - tracer trace.Tracer -} - -func (p *singletonTracerProvider) Tracer(_ string, _ ...trace.TracerOption) trace.Tracer { - return p.tracer -} - -func newSingletonTracerProvider(tracer trace.Tracer) trace.TracerProvider { - return &singletonTracerProvider{tracer: tracer} -} diff --git a/tracing/init.go b/tracing/init.go index e55d0cd..d636bec 100644 --- a/tracing/init.go +++ b/tracing/init.go @@ -18,7 +18,7 @@ import ( var JaegerCollectorURL = "http://localhost:14268/api/traces" // InitTracer creates a new tracer for a service. -func InitTracer(serviceName, instanceName string) (trace.Tracer, func(), error) { +func InitTracer(serviceName, instanceName string) (trace.TracerProvider, func(), error) { tp, err := newTracerProvider(serviceName, instanceName) if err != nil { return nil, nil, fmt.Errorf("couldn't initialize tracer provider: %w", err) @@ -33,12 +33,11 @@ func InitTracer(serviceName, instanceName string) (trace.Tracer, func(), error) log.Fatal(err) } } - - return tp.Tracer(serviceName), shutdown, err + return tp, shutdown, err } // tracerProvider returns an OpenTelemetry TracerProvider configured to use -// the Jaeger exporter that will send spans to the provided url. The returned +// the OTEL exporter that will send spans to the provided url. The returned // TracerProvider will also use a Resource configured with all the information // about the application. func newTracerProvider(serviceName, instanceName string) (*tracesdk.TracerProvider, error) {