code: func NewTracer(opts Options) Tracer {
  	err := opts.Initialize()
  	if err != nil {
  		emitEvent(newEventStartError(err))
  		return nil
  	}
  
  	attributes := map[string]string{}
  	for k, v := range opts.Tags {
  		attributes[k] = fmt.Sprint(v)
  	}
  	// Don't let the GrpcOptions override these values. That would be confusing.
  	attributes[TracerPlatformKey] = TracerPlatformValue
  	attributes[TracerPlatformVersionKey] = runtime.Version()
  	attributes[TracerVersionKey] = TracerVersionValue
  
  	now := time.Now()
  	impl := &tracerImpl{
  		opts:                    opts,
  		reporterID:              genSeededGUID(),
  		buffer:                  newSpansBuffer(opts.MaxBufferedSpans),
  		flushing:                newSpansBuffer(opts.MaxBufferedSpans),
  		closeReportLoopChannel:  make(chan struct{}),
  		reportLoopClosedChannel: make(chan struct{}),
  	}
  
  	impl.buffer.setCurrent(now)
  
  	impl.client, err = newCollectorClient(opts, impl.reporterID, attributes)
  	if err != nil {
  		fmt.Println("Failed to create to Collector client!", err)
  		return nil
  	}
  
  	conn, err := impl.client.ConnectClient()
  	if err != nil {
  		emitEvent(newEventStartError(err))
  		return nil
  	}
  	impl.connection = conn
  
  	// set meta reporting to defined option
  	impl.metaEventReportingEnabled = opts.MetaEventReportingEnabled
  	impl.firstReportHasRun = false
  
  	go impl.reportLoop()
  
  	return impl
  }
docs: // NewTracer creates and starts a new Lightstep Tracer.