func selectPool(endpoint, counter string) (rpool *spool.ConnPool, raddr string, rerr error) { pkey := cutils.PK2(endpoint, counter) node, err := GraphNodeRing.GetNode(pkey) if err != nil { return nil, "", err } addr, found := g.Config().Graph.Cluster[node] if !found { return nil, "", errors.New("node not found") } pool, found := GraphConnPools.Get(addr) if !found { return nil, addr, errors.New("addr not found") } return pool, addr, nil }
func fetchItemsAndStore(fetchKeys []string, fetchSize int) (size int, errt error) { if fetchSize < 1 { return } cfg := g.Config() queryUlr := fmt.Sprintf("http://%s/graph/last", cfg.Query.QueryAddr) hcli := thttpclient.GetHttpClient("nodata.collector", time.Millisecond*time.Duration(cfg.Query.ConnectTimeout), time.Millisecond*time.Duration(cfg.Query.RequestTimeout)) // form request args args := make([]*cmodel.GraphLastParam, 0) for _, key := range fetchKeys { ndcfg, found := config.GetNdConfig(key) if !found { continue } endpoint := ndcfg.Endpoint counter := cutils.Counter(ndcfg.Metric, ndcfg.Tags) arg := &cmodel.GraphLastParam{endpoint, counter} args = append(args, arg) } if len(args) < 1 { return } argsBody, err := json.Marshal(args) if err != nil { log.Println(queryUlr+", format body error,", err) errt = err return } // fetch items req, err := http.NewRequest("POST", queryUlr, bytes.NewBuffer(argsBody)) req.Header.Set("Content-Type", "application/json; charset=UTF-8") req.Header.Set("Connection", "close") postResp, err := hcli.Do(req) if err != nil { log.Println(queryUlr+", post to dest error,", err) errt = err return } defer postResp.Body.Close() if postResp.StatusCode/100 != 2 { log.Println(queryUlr+", post to dest, bad response,", postResp.Body) errt = fmt.Errorf("request failed, %s", postResp.Body) return } body, err := ioutil.ReadAll(postResp.Body) if err != nil { log.Println(queryUlr+", read response error,", err) errt = err return } resp := []*cmodel.GraphLastResp{} err = json.Unmarshal(body, &resp) if err != nil { log.Println(queryUlr+", unmarshal error,", err) errt = err return } // store items fts := time.Now().Unix() for _, glr := range resp { //log.Printf("collect:%v\n", glr) if glr == nil || glr.Value == nil { continue } AddItem(cutils.PK2(glr.Endpoint, glr.Counter), NewDataItem(glr.Value.Timestamp, float64(glr.Value.Value), "OK", fts)) } return len(resp), nil }