// Do Judge func judge() { now := time.Now().Unix() keys := config.Keys() for _, key := range keys { ndcfg, found := config.GetNdConfig(key) if !found { //策略不存在,不处理 continue } step := ndcfg.Step mock := ndcfg.Mock item, found := collector.GetFirstItem(key) if !found { //没有数据,未开始采集,不处理 continue } lastTs := now - getTimeout(step) if item.FStatus != "OK" || item.FTs < lastTs { //数据采集失败,不处理 continue } if fCompare(mock, item.Value) == 0 { //采集到的数据为mock数据,则认为上报超时了 if LastTs(key)+step <= now { TurnNodata(key, now) genMock(genTs(now, step), key, ndcfg) } continue } if item.Ts < lastTs { //数据过期, 则认为上报超时 if LastTs(key)+step <= now { TurnNodata(key, now) genMock(genTs(now, step), key, ndcfg) } continue } TurnOk(key, now) } }
func configProcHttpRoutes() { // counters http.HandleFunc("/proc/counters", func(w http.ResponseWriter, r *http.Request) { RenderDataJson(w, g.GetAllCounters()) }) http.HandleFunc("/statistics/all", func(w http.ResponseWriter, r *http.Request) { RenderDataJson(w, g.GetAllCounters()) }) // judge.status, /proc/status/$endpoint/$metric/$tags-pairs http.HandleFunc("/proc/status/", func(w http.ResponseWriter, r *http.Request) { urlParam := r.URL.Path[len("/proc/status/"):] RenderDataJson(w, judge.GetNodataStatus(urlParam)) }) // collector.last.item, /proc/collect/$endpoint/$metric/$tags-pairs http.HandleFunc("/proc/collect/", func(w http.ResponseWriter, r *http.Request) { urlParam := r.URL.Path[len("/proc/collect/"):] item, _ := collector.GetFirstItem(urlParam) RenderDataJson(w, item.String()) }) // config.mockcfg http.HandleFunc("/proc/config", func(w http.ResponseWriter, r *http.Request) { RenderDataJson(w, service.GetMockCfgFromDB()) }) // config.mockcfg /proc/config/$endpoint/$metric/$tags-pairs http.HandleFunc("/proc/config/", func(w http.ResponseWriter, r *http.Request) { urlParam := r.URL.Path[len("/proc/config/"):] cfg, _ := config.GetNdConfig(urlParam) RenderDataJson(w, cfg) }) // config.hostgroup, /group/$grpname http.HandleFunc("/proc/group/", func(w http.ResponseWriter, r *http.Request) { urlParam := r.URL.Path[len("/proc/group/"):] RenderDataJson(w, service.GetHostsFromGroup(urlParam)) }) }
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 }