code: func (cfg *TracingConfiguration) NewTracer(defaultServiceName string, scope tally.Scope, logger *zap.Logger) (opentracing.Tracer, io.Closer, error) {
  	if cfg.Backend == "" {
  		return opentracing.NoopTracer{}, noopCloser{}, nil
  	}
  
  	if cfg.Backend != TracingBackendJaeger {
  		return nil, nil, fmt.Errorf("unknown tracing backend: %s. Supported backends are: %s", cfg.Backend, TracingBackendJaeger)
  	}
  
  	if cfg.Jaeger.ServiceName == "" {
  		cfg.Jaeger.ServiceName = defaultServiceName
  	}
  
  	jaegerLog := jaegerzap.NewLogger(logger)
  	tracer, jaegerCloser, err := cfg.Jaeger.NewTracer(
  		jaegercfg.Logger(jaegerLog),
  		jaegercfg.Metrics(jaegertally.Wrap(scope)))
  
  	if err != nil {
  		return nil, nil, fmt.Errorf("failed to initialize jaeger: %s", err.Error())
  	}
  
  	return tracer, jaegerCloser, nil
  }
docs: // NewTracer returns a tracer configured with the configuration provided by this struct. The tracer's concrete
  // type is determined by cfg.Backend. Currently only `"jaeger"` is supported. `""` implies
  // disabled (NoopTracer).