func NewMetricValue(metric string, val interface{}, dataType string, tags ...string) *model.MetricValue { mv := model.MetricValue{ Metric: metric, Value: val, Type: dataType, } size := len(tags) if size > 0 { mv.Tags = strings.Join(tags, ",") } return &mv }
func NewMetricValueIp(TS int64, ip, metric string, val interface{}, dataType string, tags ...string) *model.MetricValue { sec := int64(g.Config().Transfer.Interval) mv := model.MetricValue{ Metric: metric, Value: val, Type: dataType, Endpoint: ip, Step: sec, Timestamp: TS, } size := len(tags) if size > 0 { mv.Tags = strings.Join(tags, ",") } return &mv }
func _collect() { clientGet := nhttpclient.GetHttpClient("collector.get", 10*time.Second, 20*time.Second) clientPost := nhttpclient.GetHttpClient("collector.post", 5*time.Second, 10*time.Second) tags := "type=statistics,pdl=falcon" for _, host := range g.Config().Collector.Cluster { ts := time.Now().Unix() jsonList := make([]model.MetricValue, 0) // get statistics by http-get hostInfo := strings.Split(host, ",") // "module,hostname:port" if len(hostInfo) != 2 { continue } hostModule := hostInfo[0] hostNamePort := hostInfo[1] hostNamePortList := strings.Split(hostNamePort, ":") if len(hostNamePortList) != 2 { continue } hostName := hostNamePortList[0] hostPort := hostNamePortList[1] myTags := tags + ",module=" + hostModule + ",port=" + hostPort srcUrl := fmt.Sprintf(srcUrlFmt, hostNamePort) reqGet, _ := http.NewRequest("GET", srcUrl, nil) reqGet.Header.Set("Connection", "close") getResp, err := clientGet.Do(reqGet) if err != nil { log.Printf(hostNamePort+", get statistics error,", err) continue } defer getResp.Body.Close() body, err := ioutil.ReadAll(getResp.Body) if err != nil { log.Println(hostNamePort+", get statistics error,", err) continue } var data Dto err = json.Unmarshal(body, &data) if err != nil { log.Println(hostNamePort+", get statistics error,", err) continue } for _, item := range data.Data { if item["Name"] == nil { continue } itemName := item["Name"].(string) if item["Cnt"] != nil { var jmdCnt model.MetricValue jmdCnt.Endpoint = hostName jmdCnt.Metric = itemName jmdCnt.Timestamp = ts jmdCnt.Step = 60 jmdCnt.Value = int64(item["Cnt"].(float64)) jmdCnt.Type = "GAUGE" jmdCnt.Tags = myTags jsonList = append(jsonList, jmdCnt) } if item["Qps"] != nil { var jmdQps model.MetricValue jmdQps.Endpoint = hostName jmdQps.Metric = itemName + ".Qps" jmdQps.Timestamp = ts jmdQps.Step = 60 jmdQps.Value = int64(item["Qps"].(float64)) jmdQps.Type = "GAUGE" jmdQps.Tags = myTags jsonList = append(jsonList, jmdQps) } } if len(jsonList) < 1 { //没取到数据 log.Println("get null from ", hostNamePort) continue } // format result jsonBody, err := json.Marshal(jsonList) if err != nil { log.Println(hostNamePort+", format body error,", err) continue } // send by http-post req, err := http.NewRequest("POST", destUrl, bytes.NewBuffer(jsonBody)) req.Header.Set("Content-Type", "application/json; charset=UTF-8") req.Header.Set("Connection", "close") postResp, err := clientPost.Do(req) if err != nil { log.Println(hostNamePort+", post to dest error,", err) continue } defer postResp.Body.Close() if postResp.StatusCode/100 != 2 { log.Println(hostNamePort+", post to dest, bad response,", postResp.StatusCode) } } }