func getProducers(topicName string) []string { var producers []string if len(lookupdHTTPAddrs) != 0 { producers, _ = lookupd.GetLookupdTopicProducers(topicName, lookupdHTTPAddrs) } else { producers, _ = lookupd.GetNSQDTopicProducers(topicName, nsqdHTTPAddrs) } return producers }
func statLoop(interval time.Duration, topic string, channel string, nsqdTCPAddrs []string, lookupdHTTPAddrs []string) { i := 0 for { var producers []string var err error log.SetOutput(ioutil.Discard) if len(lookupdHTTPAddrs) != 0 { producers, err = lookupd.GetLookupdTopicProducers(topic, lookupdHTTPAddrs) } else { producers, err = lookupd.GetNSQDTopicProducers(topic, nsqdHTTPAddrs) } log.SetOutput(os.Stdout) if err != nil { log.Fatalf("ERROR: failed to get topic producers - %s", err.Error()) } log.SetOutput(ioutil.Discard) _, allChannelStats, err := lookupd.GetNSQDStats(producers, topic) log.SetOutput(os.Stdout) if err != nil { log.Fatalf("ERROR: failed to get nsqd stats - %s", err.Error()) } c, ok := allChannelStats[channel] if !ok { log.Fatalf("ERROR: failed to find channel(%s) in stats metadata for topic(%s)", channel, topic) } if i%25 == 0 { fmt.Printf("-----------depth------------+--------------metadata---------------\n") fmt.Printf("%7s %7s %5s %5s | %7s %7s %12s %7s\n", "mem", "disk", "inflt", "def", "req", "t-o", "msgs", "clients") } // TODO: paused fmt.Printf("%7d %7d %5d %5d | %7d %7d %12d %7d\n", c.Depth, c.BackendDepth, c.InFlightCount, c.DeferredCount, c.RequeueCount, c.TimeoutCount, c.MessageCount, c.ClientCount) time.Sleep(interval) i++ } }
func lookupHandler(w http.ResponseWriter, req *http.Request) { reqParams, err := util.NewReqParams(req) if err != nil { log.Printf("ERROR: failed to parse request params - %s", err.Error()) http.Error(w, "INVALID_REQUEST", 500) return } channels := make(map[string][]string) allTopics, _ := lookupd.GetLookupdTopics(lookupdHTTPAddrs) for _, topicName := range allTopics { var producers []string producers, _ = lookupd.GetLookupdTopicProducers(topicName, lookupdHTTPAddrs) if len(producers) == 0 { topicChannels, _ := lookupd.GetLookupdTopicChannels(topicName, lookupdHTTPAddrs) channels[topicName] = topicChannels } } p := struct { Title string GraphOptions *GraphOptions TopicMap map[string][]string Lookupd []string Version string }{ Title: "NSQ Lookup", GraphOptions: NewGraphOptions(w, req, reqParams), TopicMap: channels, Lookupd: lookupdHTTPAddrs, Version: util.BINARY_VERSION, } err = templates.ExecuteTemplate(w, "lookup.html", p) if err != nil { log.Printf("Template Error %s", err.Error()) http.Error(w, "Template Error", 500) } }
func createTopicChannelHandler(w http.ResponseWriter, req *http.Request) { if req.Method != "POST" { log.Printf("ERROR: invalid %s to POST only method", req.Method) http.Error(w, "INVALID_REQUEST", 500) return } reqParams := &util.PostParams{req} topicName, err := reqParams.Get("topic") if err != nil || !nsq.IsValidTopicName(topicName) { http.Error(w, "INVALID_TOPIC", 500) return } channelName, err := reqParams.Get("channel") if err != nil || (len(channelName) > 0 && !nsq.IsValidChannelName(channelName)) { http.Error(w, "INVALID_CHANNEL", 500) return } for _, addr := range lookupdHTTPAddrs { endpoint := fmt.Sprintf("http://%s/create_topic?topic=%s", addr, url.QueryEscape(topicName)) log.Printf("LOOKUPD: querying %s", endpoint) _, err := util.ApiRequest(endpoint) if err != nil { log.Printf("ERROR: lookupd %s - %s", endpoint, err.Error()) continue } } NotifyAdminAction("create_topic", topicName, "", "", req) if len(channelName) > 0 { for _, addr := range lookupdHTTPAddrs { endpoint := fmt.Sprintf("http://%s/create_channel?topic=%s&channel=%s", addr, url.QueryEscape(topicName), url.QueryEscape(channelName)) log.Printf("LOOKUPD: querying %s", endpoint) _, err := util.ApiRequest(endpoint) if err != nil { log.Printf("ERROR: lookupd %s - %s", endpoint, err.Error()) continue } } // TODO: we can remove this when we push new channel information from nsqlookupd -> nsqd producers, _ := lookupd.GetLookupdTopicProducers(topicName, lookupdHTTPAddrs) for _, addr := range producers { endpoint := fmt.Sprintf("http://%s/create_channel?topic=%s&channel=%s", addr, url.QueryEscape(topicName), url.QueryEscape(channelName)) log.Printf("NSQD: querying %s", endpoint) _, err := util.ApiRequest(endpoint) if err != nil { log.Printf("ERROR: nsqd %s - %s", endpoint, err.Error()) continue } } NotifyAdminAction("create_channel", topicName, channelName, "", req) } http.Redirect(w, req, "/lookup", 302) }