func putMetricsServiceMetric()

in cmd/hub/metrics/metricsservice_api.go [26:96]


func putMetricsServiceMetric(cmd, host string, additionaTags []string) error {
	tags := map[string]string{
		"command": cmd,
	}
	if host != "" {
		tags["machine-id"] = host
	}
	if len(additionaTags) > 0 {
		for _, t := range additionaTags {
			kv := strings.SplitN(t, ":", 2)
			k := kv[0]
			v := "true"
			if len(kv) > 1 {
				v = kv[1]
			}
			tags[k] = v
		}
	}
	series := Series{
		Metric{
			Metric:    "hubcli.commands.usage",
			Kind:      "count",
			Tags:      tags,
			Value:     1,
			Timestamp: time.Now().Unix(),
		},
	}
	reqBody, err := json.Marshal(series)
	if err != nil {
		return err
	}
	method := "POST"
	addr := fmt.Sprintf("%s/%s", config.ApiBaseUrl, metricsSeriesResource)
	req, err := http.NewRequest(method, addr, bytes.NewReader(reqBody))
	if err != nil {
		return err
	}
	if config.Trace {
		log.Printf(">>> %s %s", req.Method, req.URL.String())
		log.Printf("%s", string(reqBody))
	}
	req.Header.Add("Content-type", "application/json")
	req.Header.Add("X-API-Secret", MetricsServiceKey)

	resp, err := httpClient.Do(req)
	if err != nil {
		return fmt.Errorf("Error during HTTP request: %v", err)
	}
	if config.Trace {
		log.Printf("<<< %s %s: %s", req.Method, req.URL.String(), resp.Status)
	}
	if resp.StatusCode != 202 {
		return fmt.Errorf("Metrics Service returned HTTP status %d; expected 202", resp.StatusCode)
	}
	var body bytes.Buffer
	read, _ := body.ReadFrom(resp.Body)
	resp.Body.Close()
	bResp := body.Bytes()
	if read == 0 {
		return errors.New("Empty response")
	}
	var jsResp SeriesResponse
	err = json.Unmarshal(bResp, &jsResp)
	if err != nil {
		return fmt.Errorf("Error unmarshalling HTTP response: %v", err)
	}
	if jsResp.Status != "ok" {
		return fmt.Errorf("Metrics Service returned status `%s`; expected `ok`", jsResp.Status)
	}
	return nil
}