code: func NewDiscovery(
  	srvs []string,
  	timeout time.Duration,
  	paths []string,
  	logger log.Logger,
  	pf func(data []byte, path string) (model.LabelSet, error),
  ) (*Discovery, error) {
  	if logger == nil {
  		logger = log.NewNopLogger()
  	}
  
  	conn, _, err := zk.Connect(
  		srvs, timeout,
  		func(c *zk.Conn) {
  			c.SetLogger(treecache.NewZookeeperLogger(logger))
  		})
  	if err != nil {
  		return nil, err
  	}
  	updates := make(chan treecache.ZookeeperTreeCacheEvent)
  	sd := &Discovery{
  		conn:    conn,
  		updates: updates,
  		sources: map[string]*targetgroup.Group{},
  		parse:   pf,
  		logger:  logger,
  	}
  	for _, path := range paths {
  		sd.treeCaches = append(sd.treeCaches, treecache.NewZookeeperTreeCache(conn, path, updates, logger))
  	}
  	return sd, nil
  }
docs: // NewDiscovery returns a new discovery along Zookeeper parses with
  // the given parse function.