code: func NewDiscovery(conf *SDConfig, logger log.Logger) (*Discovery, error) {
  	if logger == nil {
  		logger = log.NewNopLogger()
  	}
  
  	tls, err := config_util.NewTLSConfig(&conf.TLSConfig)
  	if err != nil {
  		return nil, err
  	}
  	transport := &http.Transport{
  		IdleConnTimeout: 5 * time.Duration(conf.RefreshInterval),
  		TLSClientConfig: tls,
  		DialContext: conntrack.NewDialContextFunc(
  			conntrack.DialWithTracing(),
  			conntrack.DialWithName("consul_sd"),
  		),
  	}
  	wrapper := &http.Client{
  		Transport: transport,
  		Timeout:   35 * time.Second,
  	}
  
  	clientConf := &consul.Config{
  		Address:    conf.Server,
  		Scheme:     conf.Scheme,
  		Datacenter: conf.Datacenter,
  		Token:      string(conf.Token),
  		HttpAuth: &consul.HttpBasicAuth{
  			Username: conf.Username,
  			Password: string(conf.Password),
  		},
  		HttpClient: wrapper,
  	}
  	client, err := consul.NewClient(clientConf)
  	if err != nil {
  		return nil, err
  	}
  	cd := &Discovery{
  		client:           client,
  		tagSeparator:     conf.TagSeparator,
  		watchedServices:  conf.Services,
  		watchedTags:      conf.ServiceTags,
  		watchedNodeMeta:  conf.NodeMeta,
  		allowStale:       conf.AllowStale,
  		refreshInterval:  time.Duration(conf.RefreshInterval),
  		clientDatacenter: conf.Datacenter,
  		finalizer:        transport.CloseIdleConnections,
  		logger:           logger,
  	}
  	return cd, nil
  }
docs: // NewDiscovery returns a new Discovery for the given config.