// GetNSQDTopics returns a []string containing all the topics // produced by the given nsqd func GetNSQDTopics(nsqdHTTPAddrs []string) ([]string, error) { var topics []string var lock sync.Mutex var wg sync.WaitGroup success := false for _, addr := range nsqdHTTPAddrs { wg.Add(1) endpoint := fmt.Sprintf("http://%s/stats?format=json", addr) log.Printf("NSQD: querying %s", endpoint) go func(endpoint string) { data, err := http_api.NegotiateV1("GET", endpoint, nil) lock.Lock() defer lock.Unlock() defer wg.Done() if err != nil { log.Printf("ERROR: lookupd %s - %s", endpoint, err.Error()) return } success = true topicList, _ := data.Get("topics").Array() for i := range topicList { topicInfo := data.Get("topics").GetIndex(i) topics = stringy.Add(topics, topicInfo.Get("topic_name").MustString()) } }(endpoint) } wg.Wait() sort.Strings(topics) if success == false { return nil, errors.New("unable to query any nsqd") } return topics, nil }
// GetNSQDTopics returns a []string containing all the topics produced by the given nsqd func (c *ClusterInfo) GetNSQDTopics(nsqdHTTPAddrs []string) ([]string, error) { var success bool var topics []string var lock sync.Mutex var wg sync.WaitGroup type respType struct { Topics []struct { Name string `json:"topic_name"` } `json:"topics"` } for _, addr := range nsqdHTTPAddrs { wg.Add(1) endpoint := fmt.Sprintf("http://%s/stats?format=json", addr) c.logf("NSQD: querying %s", endpoint) go func(endpoint string) { defer wg.Done() var resp respType err := http_api.NegotiateV1(endpoint, &resp) if err != nil { c.logf("ERROR: lookupd %s - %s", endpoint, err) return } lock.Lock() defer lock.Unlock() success = true for _, topic := range resp.Topics { topics = stringy.Add(topics, topic.Name) } }(endpoint) } wg.Wait() if success == false { return nil, errors.New("unable to query any nsqd") } sort.Strings(topics) return topics, nil }
// GetLookupdTopicProducers returns a []string of the broadcast_address:http_port of all the // producers for a given topic by unioning the results returned from the given lookupd func (c *ClusterInfo) GetLookupdTopicProducers(topic string, lookupdHTTPAddrs []string) ([]string, error) { success := false var allSources []string var lock sync.Mutex var wg sync.WaitGroup type respType struct { Producers []Producer `json:"producers"` } for _, addr := range lookupdHTTPAddrs { wg.Add(1) endpoint := fmt.Sprintf("http://%s/lookup?topic=%s", addr, url.QueryEscape(topic)) c.logf("LOOKUPD: querying %s", endpoint) go func(endpoint string) { defer wg.Done() var resp respType err := http_api.NegotiateV1(endpoint, &resp) lock.Lock() defer lock.Unlock() if err != nil { c.logf("ERROR: lookupd %s - %s", endpoint, err.Error()) return } success = true for _, producer := range resp.Producers { allSources = stringy.Add(allSources, producer.HTTPAddress()) } }(endpoint) } wg.Wait() if success == false { return nil, errors.New("unable to query any lookupd") } return allSources, nil }
// GetLookupdTopicProducers returns a []string of the broadcast_address:http_port of all the // producers for a given topic by unioning the results returned from the given lookupd func GetLookupdTopicProducers(topic string, lookupdHTTPAddrs []string) ([]string, error) { success := false var allSources []string var lock sync.Mutex var wg sync.WaitGroup for _, addr := range lookupdHTTPAddrs { wg.Add(1) endpoint := fmt.Sprintf("http://%s/lookup?topic=%s", addr, url.QueryEscape(topic)) log.Printf("LOOKUPD: querying %s", endpoint) go func(endpoint string) { data, err := http_api.NegotiateV1("GET", endpoint, nil) lock.Lock() defer lock.Unlock() defer wg.Done() if err != nil { log.Printf("ERROR: lookupd %s - %s", endpoint, err.Error()) return } success = true producers := data.Get("producers") producersArray, _ := producers.Array() for i := range producersArray { producer := producers.GetIndex(i) broadcastAddress := producer.Get("broadcast_address").MustString() httpPort := producer.Get("http_port").MustInt() key := net.JoinHostPort(broadcastAddress, strconv.Itoa(httpPort)) allSources = stringy.Add(allSources, key) } }(endpoint) } wg.Wait() if success == false { return nil, errors.New("unable to query any lookupd") } return allSources, nil }