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 }