code: func (sd *etcdServiceDiscovery) SyncServers() error {
  	keys, err := sd.cli.Get(
  		context.TODO(),
  		"servers/",
  		clientv3.WithPrefix(),
  		clientv3.WithKeysOnly(),
  	)
  	if err != nil {
  		return err
  	}
  
  	// delete invalid servers (local ones that are not in etcd)
  	allIds := make([]string, 0)
  
  	// filter servers I need to grab info
  	for _, kv := range keys.Kvs {
  		svType, svID, err := parseEtcdKey(string(kv.Key))
  		if err != nil {
  			logger.Log.Warnf("failed to parse etcd key %s, error: %s", kv.Key, err.Error())
  		}
  		allIds = append(allIds, svID)
  		// TODO is this slow? if so we can paralellize
  		if _, ok := sd.serverMapByID.Load(svID); !ok {
  			logger.Log.Debugf("loading info from missing server: %s/%s", svType, svID)
  			sv, err := sd.getServerFromEtcd(svType, svID)
  			if err != nil {
  				logger.Log.Errorf("error getting server from etcd: %s, error: %s", svID, err.Error())
  				continue
  			}
  			sd.addServer(sv)
  		}
  	}
  	sd.deleteLocalInvalidServers(allIds)
  
  	sd.printServers()
  	sd.lastSyncTime = time.Now()
  	return nil
  }
docs: // SyncServers gets all servers from etcd