code: func New(ctx context.Context, params backend.Params) (*EtcdBackend, error) {
  	var err error
  	if params == nil {
  		return nil, trace.BadParameter("missing etcd configuration")
  	}
  
  	// convert generic backend parameters structure to etcd config:
  	var cfg *Config
  	if err = utils.ObjectToStruct(params, &cfg); err != nil {
  		return nil, trace.BadParameter("invalid etcd configuration: %v", err)
  	}
  	if err = cfg.Validate(); err != nil {
  		return nil, trace.Wrap(err)
  	}
  
  	buf, err := backend.NewCircularBuffer(ctx, cfg.BufferSize)
  	if err != nil {
  		return nil, trace.Wrap(err)
  	}
  	closeCtx, cancel := context.WithCancel(ctx)
  	watchStarted, signalWatchStart := context.WithCancel(ctx)
  	b := &EtcdBackend{
  		Entry:            log.WithFields(log.Fields{trace.Component: GetName()}),
  		cfg:              cfg,
  		nodes:            cfg.Nodes,
  		cancelC:          make(chan bool, 1),
  		stopC:            make(chan bool, 1),
  		clock:            clockwork.NewRealClock(),
  		cancel:           cancel,
  		ctx:              closeCtx,
  		watchStarted:     watchStarted,
  		signalWatchStart: signalWatchStart,
  		buf:              buf,
  	}
  	if err = b.reconnect(); err != nil {
  		return nil, trace.Wrap(err)
  	}
  	// Wrap backend in a input sanitizer and return it.
  	return b, nil
  }
docs: // New returns new instance of Etcd-powered backend