github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/agent/metricsender/sender.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package metricsender
     5  
     6  import (
     7  	"bytes"
     8  	"encoding/json"
     9  	"net/http"
    10  
    11  	"github.com/juju/errors"
    12  	wireformat "github.com/juju/romulus/wireformat/metrics"
    13  )
    14  
    15  // HTTPSender is the default used for sending
    16  // metrics to the collector service.
    17  type HTTPSender struct {
    18  	url string
    19  }
    20  
    21  // Send sends the given metrics to the collector service.
    22  func (s *HTTPSender) Send(metrics []*wireformat.MetricBatch) (*wireformat.Response, error) {
    23  	b, err := json.Marshal(metrics)
    24  	if err != nil {
    25  		return nil, errors.Trace(err)
    26  	}
    27  	r := bytes.NewBuffer(b)
    28  	client := &http.Client{}
    29  	resp, err := client.Post(s.url, "application/json", r)
    30  	if err != nil {
    31  		return nil, errors.Trace(err)
    32  	}
    33  	if resp.StatusCode != http.StatusOK {
    34  		return nil, errors.Errorf("failed to send metrics http %v", resp.StatusCode)
    35  	}
    36  
    37  	defer resp.Body.Close()
    38  	respReader := json.NewDecoder(resp.Body)
    39  	metricsResponse := wireformat.Response{}
    40  	err = respReader.Decode(&metricsResponse)
    41  	if err != nil {
    42  		return nil, errors.Trace(err)
    43  	}
    44  	return &metricsResponse, nil
    45  }